From 99f726841595243ea90d48d1bbf2342366276ced Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 27 Sep 2017 16:13:29 -0400 Subject: [PATCH 01/75] DRR - Cpptraj: Initial attempt at adding some control structures --- src/ArgList.h | 1 + src/Cmd.h | 4 ++-- src/Command.cpp | 53 ++++++++++++++++++++++++++++++++++++++---- src/Command.h | 5 ++++ src/Control.cpp | 26 +++++++++++++++++++++ src/Control.h | 36 ++++++++++++++++++++++++++++ src/DispatchObject.cpp | 1 + src/DispatchObject.h | 1 + src/cpptrajdepend | 17 +++++++------- src/cpptrajfiles | 1 + 10 files changed, 130 insertions(+), 15 deletions(-) create mode 100644 src/Control.cpp create mode 100644 src/Control.h diff --git a/src/ArgList.h b/src/ArgList.h index a3bbfa4f4e..5729d0fe6b 100644 --- a/src/ArgList.h +++ b/src/ArgList.h @@ -40,6 +40,7 @@ class ArgList { bool empty() const { return arglist_.empty(); } /// \return the argument string const char *ArgLine() const { return argline_.c_str(); } + std::string const& ArgLineStr() const { return argline_; } /// \return all unmarked arguments as a string std::string ArgString() const; /// Clear list diff --git a/src/Cmd.h b/src/Cmd.h index 8669fee3c7..ddbd61f75b 100644 --- a/src/Cmd.h +++ b/src/Cmd.h @@ -11,8 +11,8 @@ class Cmd { public: typedef std::vector< std::string > Sarray; // TODO put in common header? - /// Command destinations. EXEcute, ACTion, ANAlysis, DEPrecated. - enum DestType { EXE = 0, ACT, ANA, DEP }; + /// Command destinations. EXEcute, ACTion, ANAlysis, ConTroL, DEPrecated. + enum DestType { EXE = 0, ACT, ANA, CTL, DEP }; /// CONSTRUCTOR Cmd() : object_(0), dest_(EXE) {} /// CONSTRUCTOR - takes destination, DispatchObject pointer, and keywords. diff --git a/src/Command.cpp b/src/Command.cpp index 0fe5961e79..ec01d1f018 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -6,6 +6,7 @@ #include "CmdInput.h" // ProcessInput() #include "RPNcalc.h" #include "Deprecated.h" +#include "Control.h" // ----- GENERAL --------------------------------------------------------------- #include "Exec_Analyze.h" #include "Exec_Calc.h" @@ -173,6 +174,8 @@ const Cmd Command::EMPTY_ = Cmd(); Command::Carray Command::names_ = Command::Carray(); +Command::CtlArray Command::control_ = Command::CtlArray(); + /** Initialize all commands. Should only be called once as program starts. */ void Command::Init() { // GENERAL @@ -364,6 +367,8 @@ void Command::Init() { Command::AddCmd( new Analysis_Timecorr(), Cmd::ANA, 1, "timecorr" ); Command::AddCmd( new Analysis_VectorMath(), Cmd::ANA, 1, "vectormath" ); Command::AddCmd( new Analysis_Wavelet(), Cmd::ANA, 1, "wavelet" ); + // CONTROL STRUCTURES + Command::AddCmd( new Control_For(), Cmd::CTL, 1, "for" ); // DEPRECATED COMMANDS Command::AddCmd( new Deprecated_AvgCoord(), Cmd::DEP, 1, "avgcoord" ); Command::AddCmd( new Deprecated_DihScan(), Cmd::DEP, 1, "dihedralscan" ); @@ -467,31 +472,69 @@ void Command::ListCommands(DispatchObject::Otype typeIn) { ListCommandsForType( typeIn ); } +CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& commandIn) +{ + ArgList cmdArg( commandIn ); + cmdArg.MarkArg(0); // Always mark the first arg as the command + return Dispatch(State, cmdArg); +} + /** Search for the given command and execute it. EXE commands are executed * immediately and then freed. ACT and ANA commands are sent to the * CpptrajState for later execution. */ -CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& commandIn) +CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) { - ArgList cmdArg( commandIn ); - cmdArg.MarkArg(0); // Always mark the first arg as the command + // Check for control block + if (!control_.empty()) { + // In control block. Check if current block should end. + if ( control_.top()->EndControl( cmdArg ) ) { + mprintf("DEBUG: End control block.\n"); + // TODO Process block here. + Control* currentCtl = control_.top(); + control_.pop(); + do { + for (Control::const_iterator ctlCmd = currentCtl->begin(); + ctlCmd != currentCtl->end(); ++ctlCmd) + { + ArgList tmpArg = *ctlCmd; + if ( Dispatch(State, tmpArg) != CpptrajState::OK ) // TODO handle quit? + return CpptrajState::ERR; + } + } while (currentCtl->NotDone()); + delete currentCtl; + } else { + // Add this command to current control block. + control_.top()->AddCommand( cmdArg ); + mprintf("DEBUG: Added command '%s' to control block.\n", cmdArg.Command()); + } + return CpptrajState::OK; + } Cmd const& cmd = SearchToken( cmdArg ); CpptrajState::RetType ret_val = CpptrajState::OK; if (cmd.Empty()) { // Try to evaluate the expression RPNcalc calc; calc.SetDebug( State.Debug() ); - if (calc.ProcessExpression( commandIn )) + if (calc.ProcessExpression( cmdArg.ArgLineStr() )) ret_val = CpptrajState::ERR; else { if (calc.Evaluate( State.DSL() )) ret_val = CpptrajState::ERR; } if (ret_val == CpptrajState::ERR) - mprinterr("'%s': Invalid command or expression.\n", commandIn.c_str()); + mprinterr("'%s': Invalid command or expression.\n", cmdArg.ArgLine()); } else { DispatchObject* obj = cmd.Alloc(); switch (cmd.Destination()) { + case Cmd::CTL: + mprintf("DEBUG: Control statement detected.\n"); + if ( ((Control*)obj)->SetupControl( cmdArg ) ) { + delete obj; + return CpptrajState::ERR; + } + control_.push( (Control*)obj ); + break; case Cmd::EXE: ret_val = ((Exec*)obj)->Execute( State, cmdArg ); delete obj; diff --git a/src/Command.h b/src/Command.h index 4f2dd7662c..42e0992a55 100644 --- a/src/Command.h +++ b/src/Command.h @@ -1,7 +1,9 @@ #ifndef INC_COMMAND_H #define INC_COMMAND_H +#include #include "CmdList.h" #include "CpptrajState.h" +#include "Control.h" class Command { public: static void Init(); @@ -22,10 +24,13 @@ class Command { static const char* CmdToken(int idx) { return names_[idx]; } private: static void ListCommandsForType(DispatchObject::Otype); + static CpptrajState::RetType Dispatch(CpptrajState&, ArgList&); static CmdList commands_; ///< Master list of commands. static const Cmd EMPTY_; ///< Empty command. typedef std::vector Carray; static Carray names_; ///< Array of pointers to all command names, for ReadLine + typedef std::stack CtlArray; + static CtlArray control_; }; #endif diff --git a/src/Control.cpp b/src/Control.cpp new file mode 100644 index 0000000000..90dc69e3b8 --- /dev/null +++ b/src/Control.cpp @@ -0,0 +1,26 @@ +#include "Control.h" +#include "CpptrajStdio.h" + +void Control_For::Help() const { + mprintf("\tTODO\n"); +} + +int Control_For::SetupControl(ArgList& argIn) { + // for in do + std::string in_arg = argIn.GetStringKey("in"); + if (in_arg.empty()) { + mprinterr("Error: 'for': expected 'in '\n"); + return 1; + } + if (!argIn.hasKey("do")) { + mprinterr("Error: 'for': missing 'do'\n"); + return 1; + } + varname_ = argIn.GetStringNext(); + if (varname_.empty()) { + mprinterr("Error: 'for': missing variable name.\n"); + return 1; + } + mprintf("DEBUG: for %s in %s do\n", varname_.c_str(), in_arg.c_str()); + return 0; +} diff --git a/src/Control.h b/src/Control.h new file mode 100644 index 0000000000..fb802a72b4 --- /dev/null +++ b/src/Control.h @@ -0,0 +1,36 @@ +#ifndef INC_CONTROL_H +#define INC_CONTROL_H +#include "ArgList.h" +#include "DispatchObject.h" +/// Control structures. +class Control : public DispatchObject { + public: + typedef std::vector ArgArray; + typedef ArgArray::const_iterator const_iterator; + Control() : DispatchObject(CONTROL) {} + virtual int SetupControl(ArgList&) = 0; + virtual bool EndControl(ArgList const&) const = 0; + virtual void AddCommand(ArgList const&) = 0; + virtual const_iterator begin() const = 0; + virtual const_iterator end() const = 0; + virtual bool NotDone() = 0; +}; + +/// Loop over mask expression etc +class Control_For : public Control { + public: + Control_For() {} + void Help() const; + DispatchObject* Alloc() const { return (DispatchObject*)new Control_For(); } + + int SetupControl(ArgList&); + bool EndControl(ArgList const& a) const { return (a.CommandIs("done")); } + void AddCommand(ArgList const& c) { commands_.push_back(c); } + const_iterator begin() const { return commands_.begin(); } + const_iterator end() const { return commands_.end(); } + bool NotDone() { return false; } // TODO + private: + std::string varname_; + ArgArray commands_; +}; +#endif diff --git a/src/DispatchObject.cpp b/src/DispatchObject.cpp index 24ede28ef0..d800907018 100644 --- a/src/DispatchObject.cpp +++ b/src/DispatchObject.cpp @@ -11,6 +11,7 @@ const char* DispatchObject::ObjKeyword(Otype typeIn) { case ANALYSIS: return "Analysis"; case GENERAL: return "General"; case SYSTEM: return "System"; + case CONTROL: return "Control"; case HIDDEN: return 0; case DEPRECATED: return 0; } diff --git a/src/DispatchObject.h b/src/DispatchObject.h index 783c71b9ea..1719b5c6e7 100644 --- a/src/DispatchObject.h +++ b/src/DispatchObject.h @@ -9,6 +9,7 @@ class DispatchObject { public: /// Object categories. HIDDEN and DEPRECATED should always be last. enum Otype { NONE=0, GENERAL, SYSTEM, COORDS, TRAJ, PARM, ACTION, ANALYSIS, + CONTROL, HIDDEN, DEPRECATED }; /// CONSTRUCTOR DispatchObject() : type_(NONE) {} diff --git a/src/cpptrajdepend b/src/cpptrajdepend index 8dd25a4779..037412ea33 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -149,6 +149,7 @@ CmdInput.o : CmdInput.cpp CmdInput.h StringRoutines.h CmdList.o : CmdList.cpp Cmd.h CmdList.h DispatchObject.h ComplexArray.o : ComplexArray.cpp ArrayIterator.h ComplexArray.h Constraints.o : Constraints.cpp ArgList.h Atom.h AtomExtra.h AtomMask.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 ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h Vec3.h +Control.o : Control.cpp ArgList.h Control.h CpptrajStdio.h DispatchObject.h CoordinateInfo.o : CoordinateInfo.cpp Box.h CoordinateInfo.h CpptrajStdio.h Matrix_3x3.h Parallel.h ReplicaDimArray.h Vec3.h Corr.o : Corr.cpp ArrayIterator.h ComplexArray.h Corr.h PubFFT.h CpptrajFile.o : CpptrajFile.cpp CpptrajFile.h CpptrajStdio.h FileIO.h FileIO_Bzip2.h FileIO_Gzip.h FileIO_Mpi.h FileIO_Std.h FileName.h Parallel.h StringRoutines.h @@ -214,21 +215,21 @@ EnsembleOut_Multi.o : EnsembleOut_Multi.cpp ActionFrameCounter.h ArgList.h Atom. EnsembleOut_Single.o : EnsembleOut_Single.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h EnsembleOut.h EnsembleOut_Single.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h TrajectoryFile.h TrajectoryIO.h Vec3.h EnsembleOutList.o : EnsembleOutList.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h EnsembleOut.h EnsembleOutList.h EnsembleOut_Multi.h EnsembleOut_Single.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h TrajectoryFile.h TrajectoryIO.h Vec3.h Ewald.o : Ewald.cpp Atom.h AtomExtra.h AtomMask.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajStdio.h Ewald.h FileName.h Frame.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h PairList.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Spline.h StringRoutines.h Timer.h Topology.h Vec3.h -Exec_Analyze.o : Exec_Analyze.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Analyze.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Exec_Analyze.o : Exec_Analyze.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Analyze.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_Calc.o : Exec_Calc.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Calc.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h RPNcalc.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_Change.o : Exec_Change.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Change.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_ClusterMap.o : Exec_ClusterMap.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h ClusterMap.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_2D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_MatrixFlt.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ClusterMap.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_CombineCoords.o : Exec_CombineCoords.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CombineCoords.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_Commands.o : Exec_Commands.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Commands.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_CompareTop.o : Exec_CompareTop.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CompareTop.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h -Exec_CrdAction.o : Exec_CrdAction.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CrdAction.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Exec_CrdAction.o : Exec_CrdAction.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CrdAction.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_CrdOut.o : Exec_CrdOut.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CrdOut.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_CreateSet.o : Exec_CreateSet.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CreateSet.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h RPNcalc.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_DataFile.o : Exec_DataFile.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_DataFile.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_DataFilter.o : Exec_DataFilter.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Action_FilterByData.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h Array1D.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_DataFilter.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_DataSetCmd.o : Exec_DataSetCmd.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h ComplexArray.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_MatrixDbl.h DataSet_Vector.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_DataSetCmd.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_GenerateAmberRst.o : Exec_GenerateAmberRst.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h DistRoutines.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_GenerateAmberRst.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TorsionRoutines.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h -Exec_Help.o : Exec_Help.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Help.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Exec_Help.o : Exec_Help.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Help.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_LoadCrd.o : Exec_LoadCrd.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_LoadCrd.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h Trajin_Single.h TrajoutList.h Trajout_Single.h Vec3.h Exec_LoadTraj.o : Exec_LoadTraj.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Coords_TRJ.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_LoadTraj.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajFrameIndex.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_ParmBox.o : Exec_ParmBox.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ParmBox.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h @@ -239,9 +240,9 @@ Exec_PermuteDihedrals.o : Exec_PermuteDihedrals.cpp Action.h ActionFrameCounter. Exec_Precision.o : Exec_Precision.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Precision.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_PrintData.o : Exec_PrintData.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_PrintData.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_ReadData.o : Exec_ReadData.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ReadData.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h -Exec_ReadInput.o : Exec_ReadInput.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ReadInput.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Exec_ReadInput.o : Exec_ReadInput.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ReadInput.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_RotateDihedral.o : Exec_RotateDihedral.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h DihedralSearch.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_RotateDihedral.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TorsionRoutines.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h -Exec_RunAnalysis.o : Exec_RunAnalysis.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_RunAnalysis.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Exec_RunAnalysis.o : Exec_RunAnalysis.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_RunAnalysis.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_ScaleDihedralK.o : Exec_ScaleDihedralK.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ScaleDihedralK.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_SequenceAlign.o : Exec_SequenceAlign.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h BufferedLine.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_SequenceAlign.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_System.o : Exec_System.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_System.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h @@ -337,10 +338,10 @@ TrajoutList.o : TrajoutList.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra. Vec3.o : Vec3.cpp Constants.h CpptrajStdio.h Vec3.h ViewRst.o : ViewRst.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReplicaDimArray.h Residue.h Topology.h TrajectoryFile.h TrajectoryIO.h Trajout_Single.h Vec3.h ViewRst.h Action_Esander.o : Action_Esander.cpp Action.h ActionState.h Action_Esander.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h Energy_Sander.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h TextFormat.h Timer.h Topology.h Vec3.h -Command.o : Command.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.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_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_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_Translate.h Action_Unstrip.h Action_Unwrap.h Action_Vector.h Action_VelocityAutoCorr.h Action_Volmap.h Action_Volume.h Action_Watershell.h Analysis.h AnalysisList.h AnalysisState.h Analysis_AmdBias.h Analysis_AutoCorr.h Analysis_Average.h Analysis_Clustering.h Analysis_Corr.h Analysis_CrankShaft.h Analysis_CrdFluct.h Analysis_CrossCorr.h Analysis_CurveFit.h Analysis_Divergence.h Analysis_FFT.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_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 AtomExtra.h AtomMap.h AtomMask.h AxisType.h BaseIOtype.h Box.h BufferedLine.h CharMask.h ClusterDist.h ClusterList.h ClusterMap.h ClusterNode.h ClusterSieve.h Cmd.h CmdInput.h CmdList.h Command.h ComplexArray.h Constraints.h CoordinateInfo.h Corr.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.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_string.h Deprecated.h DihedralSearch.h Dimension.h DispatchObject.h DistRoutines.h Energy.h Energy_Sander.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Ewald.h Exec.h Exec_Analyze.h Exec_Calc.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_GenerateAmberRst.h Exec_Help.h Exec_LoadCrd.h Exec_LoadTraj.h Exec_ParmBox.h Exec_ParmSolvent.h Exec_ParmStrip.h Exec_ParmWrite.h Exec_PermuteDihedrals.h Exec_Precision.h Exec_PrintData.h Exec_ReadData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_ViewRst.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h Grid.h GridAction.h GridBin.h HistBin.h Hungarian.h ImageTypes.h ImagedAction.h InputTrajCommon.h MapAtom.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 ParameterTypes.h PubFFT.h RPNcalc.h Random.h Range.h ReferenceAction.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Spline.h StructureCheck.h SymmetricRmsdCalc.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Traj_AmberNetcdf.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h molsurf.h -Cpptraj.o : Cpptraj.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdInput.h CmdList.h Command.h CoordinateInfo.h Cpptraj.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReadLine.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h TopInfo.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Version.h +Command.o : Command.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.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_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_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_Translate.h Action_Unstrip.h Action_Unwrap.h Action_Vector.h Action_VelocityAutoCorr.h Action_Volmap.h Action_Volume.h Action_Watershell.h Analysis.h AnalysisList.h AnalysisState.h Analysis_AmdBias.h Analysis_AutoCorr.h Analysis_Average.h Analysis_Clustering.h Analysis_Corr.h Analysis_CrankShaft.h Analysis_CrdFluct.h Analysis_CrossCorr.h Analysis_CurveFit.h Analysis_Divergence.h Analysis_FFT.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_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 AtomExtra.h AtomMap.h AtomMask.h AxisType.h BaseIOtype.h Box.h BufferedLine.h CharMask.h ClusterDist.h ClusterList.h ClusterMap.h ClusterNode.h ClusterSieve.h Cmd.h CmdInput.h CmdList.h Command.h ComplexArray.h Constraints.h Control.h CoordinateInfo.h Corr.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.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_string.h Deprecated.h DihedralSearch.h Dimension.h DispatchObject.h DistRoutines.h Energy.h Energy_Sander.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Ewald.h Exec.h Exec_Analyze.h Exec_Calc.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_GenerateAmberRst.h Exec_Help.h Exec_LoadCrd.h Exec_LoadTraj.h Exec_ParmBox.h Exec_ParmSolvent.h Exec_ParmStrip.h Exec_ParmWrite.h Exec_PermuteDihedrals.h Exec_Precision.h Exec_PrintData.h Exec_ReadData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_ViewRst.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h Grid.h GridAction.h GridBin.h HistBin.h Hungarian.h ImageTypes.h ImagedAction.h InputTrajCommon.h MapAtom.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 ParameterTypes.h PubFFT.h RPNcalc.h Random.h Range.h ReferenceAction.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Spline.h StructureCheck.h SymmetricRmsdCalc.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Traj_AmberNetcdf.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h molsurf.h +Cpptraj.o : Cpptraj.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdInput.h CmdList.h Command.h Control.h CoordinateInfo.h Cpptraj.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReadLine.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h TopInfo.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Version.h Energy_Sander.o : Energy_Sander.cpp ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h Energy_Sander.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReplicaDimArray.h Residue.h Topology.h Vec3.h -ReadLine.o : ReadLine.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdInput.h CmdList.h Command.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReadLine.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +ReadLine.o : ReadLine.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdInput.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReadLine.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h main.o : main.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h Cpptraj.h CpptrajFile.h CpptrajState.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h molsurf.o : molsurf.c molsurf.h AmbPDB.o : AmbPDB.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h BufferedFrame.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReplicaDimArray.h Residue.h StringRoutines.h TextFormat.h Topology.h TrajFrameCounter.h Traj_AmberRestart.h TrajectoryFile.h TrajectoryIO.h Trajin.h Trajin_Single.h Trajout_Single.h Vec3.h diff --git a/src/cpptrajfiles b/src/cpptrajfiles index 265574ba16..1888e8cc37 100644 --- a/src/cpptrajfiles +++ b/src/cpptrajfiles @@ -151,6 +151,7 @@ COMMON_SOURCES=ActionFrameCounter.cpp \ CmdList.cpp \ ComplexArray.cpp \ Constraints.cpp \ + Control.cpp \ CoordinateInfo.cpp \ Corr.cpp \ CpptrajFile.cpp \ From e9817beeed3de19fe42c603173bb48b2813e1309 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 27 Sep 2017 16:15:17 -0400 Subject: [PATCH 02/75] DRR - Cpptraj: Var name change --- src/Control.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 90dc69e3b8..103ff759ec 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -6,9 +6,9 @@ void Control_For::Help() const { } int Control_For::SetupControl(ArgList& argIn) { - // for in do - std::string in_arg = argIn.GetStringKey("in"); - if (in_arg.empty()) { + // for inmask do + std::string inmask_arg = argIn.GetStringKey("inmask"); + if (inmask_arg.empty()) { mprinterr("Error: 'for': expected 'in '\n"); return 1; } @@ -21,6 +21,6 @@ int Control_For::SetupControl(ArgList& argIn) { mprinterr("Error: 'for': missing variable name.\n"); return 1; } - mprintf("DEBUG: for %s in %s do\n", varname_.c_str(), in_arg.c_str()); + mprintf("DEBUG: for %s in %s do\n", varname_.c_str(), inmask_arg.c_str()); return 0; } From 5c49602c0456250d5e8e48d11da919bcf963e085 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 08:48:44 -0400 Subject: [PATCH 03/75] DRR - Cpptraj: Make for specific to atom masks initially. --- src/Control.cpp | 34 +++++++++++++++++++++++----------- src/Control.h | 9 +++++++++ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 103ff759ec..e173a528dd 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -6,21 +6,33 @@ void Control_For::Help() const { } int Control_For::SetupControl(ArgList& argIn) { - // for inmask do + mask_.ResetMask(); + varname_.clear(); + commands_.clear(); + varType_ = UNKNOWN; + // for {atoms|residues|molecules} inmask std::string inmask_arg = argIn.GetStringKey("inmask"); - if (inmask_arg.empty()) { - mprinterr("Error: 'for': expected 'in '\n"); - return 1; - } - if (!argIn.hasKey("do")) { - mprinterr("Error: 'for': missing 'do'\n"); - return 1; + if (!inmask_arg.empty()) { + if (mask_.SetMaskString( inmask_arg )) return 1; + if (argIn.hasKey("atoms")) varType_ = ATOMS; + else if (argIn.hasKey("residues")) varType_ = RESIDUES; + else if (argIn.hasKey("molecules")) varType_ = MOLECULES; + if (varType_ == UNKNOWN) { + mprinterr("Error: One of {atoms|residues|molecules} not specfied.\n"); + return 1; + } + varname_ = argIn.GetStringNext(); + if (varname_.empty()) { + mprinterr("Error: 'for inmask': missing variable name.\n"); + return 1; + } + static const char* TypeStr[] = { "ATOMS", "RESIDUES", "MOLECULES" }; + mprintf("DEBUG: for %s %s inmask %s do\n", TypeStr[varType_], + varname_.c_str(), mask_.MaskString()); } - varname_ = argIn.GetStringNext(); if (varname_.empty()) { - mprinterr("Error: 'for': missing variable name.\n"); + mprinterr("Error: for: No variable name/loop type specified.\n"); return 1; } - mprintf("DEBUG: for %s in %s do\n", varname_.c_str(), inmask_arg.c_str()); return 0; } diff --git a/src/Control.h b/src/Control.h index fb802a72b4..e82e82ba70 100644 --- a/src/Control.h +++ b/src/Control.h @@ -1,6 +1,7 @@ #ifndef INC_CONTROL_H #define INC_CONTROL_H #include "ArgList.h" +#include "AtomMask.h" #include "DispatchObject.h" /// Control structures. class Control : public DispatchObject { @@ -8,9 +9,13 @@ class Control : public DispatchObject { typedef std::vector ArgArray; typedef ArgArray::const_iterator const_iterator; Control() : DispatchObject(CONTROL) {} + /// Set up control structure. virtual int SetupControl(ArgList&) = 0; + /// Check for control structure end command. virtual bool EndControl(ArgList const&) const = 0; + /// Add command to control structure. virtual void AddCommand(ArgList const&) = 0; + virtual unsigned int Ncommands() const = 0; virtual const_iterator begin() const = 0; virtual const_iterator end() const = 0; virtual bool NotDone() = 0; @@ -26,11 +31,15 @@ class Control_For : public Control { int SetupControl(ArgList&); bool EndControl(ArgList const& a) const { return (a.CommandIs("done")); } void AddCommand(ArgList const& c) { commands_.push_back(c); } + unsigned int Ncommands() const { return commands_.size(); } const_iterator begin() const { return commands_.begin(); } const_iterator end() const { return commands_.end(); } bool NotDone() { return false; } // TODO private: + enum ForType {ATOMS=0, RESIDUES, MOLECULES, UNKNOWN}; + AtomMask mask_; std::string varname_; ArgArray commands_; + ForType varType_; }; #endif From 86685942dce75811494e1b4f643f7c97be5b872d Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 08:49:28 -0400 Subject: [PATCH 04/75] DRR - Cpptraj: Reorganization to allow nested control structures. --- src/Command.cpp | 70 +++++++++++++++++++++++++++++++++---------------- src/Command.h | 6 +++-- 2 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index ec01d1f018..d032cdfccb 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -176,6 +176,8 @@ Command::Carray Command::names_ = Command::Carray(); Command::CtlArray Command::control_ = Command::CtlArray(); +int Command::ctlidx_ = -1; + /** Initialize all commands. Should only be called once as program starts. */ void Command::Init() { // GENERAL @@ -408,17 +410,23 @@ void Command::AddCmd(DispatchObject* oIn, Cmd::DestType dIn, int nKeys, ...) { } /** Search Commands list for command with given keyword and object type. */ -Cmd const& Command::SearchTokenType(DispatchObject::Otype catIn, const char* keyIn) +Cmd const& Command::SearchTokenType(DispatchObject::Otype catIn, const char* keyIn, + bool silent) { for (CmdList::const_iterator cmd = commands_.begin(); cmd != commands_.end(); ++cmd) { if (catIn != cmd->Obj().Type()) continue; if (cmd->KeyMatches(keyIn)) return *cmd; } - mprinterr("'%s': Command not found.\n", keyIn); + if (!silent) mprinterr("'%s': Command not found.\n", keyIn); return EMPTY_; } +/** Search Commands list for command with given keyword and object type. */ +Cmd const& Command::SearchTokenType(DispatchObject::Otype catIn, const char* keyIn) { + return SearchTokenType(catIn, keyIn, false); +} + /** Search the Commands list for given command. * \return the token if found, 0 if not. */ @@ -479,6 +487,16 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& return Dispatch(State, cmdArg); } +/** Create new control block with given Control. */ +int Command::AddControlBlock(Control* ctl, ArgList& cmdArg) { + if ( ctl->SetupControl( cmdArg ) ) + return 1; + control_.push_back( ctl ); + ctlidx_++; + mprintf("DEBUG: Begin control block %i\n", ctlidx_); + return 0; +} + /** Search for the given command and execute it. EXE commands are executed * immediately and then freed. ACT and ANA commands are sent to the * CpptrajState for later execution. @@ -488,28 +506,37 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) // Check for control block if (!control_.empty()) { // In control block. Check if current block should end. - if ( control_.top()->EndControl( cmdArg ) ) { - mprintf("DEBUG: End control block.\n"); - // TODO Process block here. - Control* currentCtl = control_.top(); - control_.pop(); - do { - for (Control::const_iterator ctlCmd = currentCtl->begin(); - ctlCmd != currentCtl->end(); ++ctlCmd) - { - ArgList tmpArg = *ctlCmd; - if ( Dispatch(State, tmpArg) != CpptrajState::OK ) // TODO handle quit? - return CpptrajState::ERR; + if ( control_[ctlidx_]->EndControl( cmdArg ) ) { + mprintf("DEBUG: End control block %i.\n", ctlidx_); + ctlidx_--; + if (ctlidx_ < 0) { + // Outermost control structure is ended. Execute control block(s). + mprintf("DEBUG: Executing %u control block(s).\n", control_.size()); + for (unsigned int i = 0; i < control_.size(); i++) { + mprintf("DEBUG: %u : %u commands.\n", i, control_[i]->Ncommands()); + delete control_[i]; } - } while (currentCtl->NotDone()); - delete currentCtl; + control_.clear(); + } } else { - // Add this command to current control block. - control_.top()->AddCommand( cmdArg ); - mprintf("DEBUG: Added command '%s' to control block.\n", cmdArg.Command()); + // Check if this is another control statement (silently) + Cmd const& ctlCmd = SearchTokenType(DispatchObject::CONTROL, cmdArg.Command(), true); + if (ctlCmd.Empty()) { + // Add this command to current control block. + control_[ctlidx_]->AddCommand( cmdArg ); + mprintf("DEBUG: Added command '%s' to control block %i.\n", cmdArg.Command(), ctlidx_); + } else { + // Create new control block + DispatchObject* obj = ctlCmd.Alloc(); + if (AddControlBlock( (Control*)obj, cmdArg )) { + delete obj; + return CpptrajState::ERR; + } + } } return CpptrajState::OK; } + // Look for command in command list. Cmd const& cmd = SearchToken( cmdArg ); CpptrajState::RetType ret_val = CpptrajState::OK; if (cmd.Empty()) { @@ -528,12 +555,11 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) DispatchObject* obj = cmd.Alloc(); switch (cmd.Destination()) { case Cmd::CTL: - mprintf("DEBUG: Control statement detected.\n"); - if ( ((Control*)obj)->SetupControl( cmdArg ) ) { + mprintf("DEBUG: Initial control statement detected.\n"); + if (AddControlBlock( (Control*)obj, cmdArg )) { delete obj; return CpptrajState::ERR; } - control_.push( (Control*)obj ); break; case Cmd::EXE: ret_val = ((Exec*)obj)->Execute( State, cmdArg ); diff --git a/src/Command.h b/src/Command.h index 42e0992a55..e380dedc85 100644 --- a/src/Command.h +++ b/src/Command.h @@ -1,6 +1,5 @@ #ifndef INC_COMMAND_H #define INC_COMMAND_H -#include #include "CmdList.h" #include "CpptrajState.h" #include "Control.h" @@ -23,14 +22,17 @@ class Command { /// \return Pointer to command name address. static const char* CmdToken(int idx) { return names_[idx]; } private: + static Cmd const& SearchTokenType(DispatchObject::Otype, const char*, bool); static void ListCommandsForType(DispatchObject::Otype); + static int AddControlBlock(Control*, ArgList&); static CpptrajState::RetType Dispatch(CpptrajState&, ArgList&); static CmdList commands_; ///< Master list of commands. static const Cmd EMPTY_; ///< Empty command. typedef std::vector Carray; static Carray names_; ///< Array of pointers to all command names, for ReadLine - typedef std::stack CtlArray; + typedef std::vector CtlArray; static CtlArray control_; + static int ctlidx_; }; #endif From 082667ea8aacf92d4ef40a8ede561b40e54cceb1 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 09:00:52 -0400 Subject: [PATCH 05/75] DRR - Cpptraj: Detect unterminated control blocks --- src/Command.cpp | 21 +++++++++++++++++++-- src/Command.h | 2 ++ src/Cpptraj.cpp | 3 +++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index d032cdfccb..8806c372b3 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -385,8 +385,15 @@ void Command::Init() { names_.push_back( 0 ); } -/** Free all commands. Should only be called just before program exit. */ -void Command::Free() { commands_.Clear(); } +/** Free all commands. Should only be called just before program exit. Also + * remove any remaining control blocks. + */ +void Command::Free() { + commands_.Clear(); + for (CtlArray::iterator it = control_.begin(); it != control_.end(); ++it) + delete *it; + control_.clear(); +} /** \param oIn Pointer to DispatchObject to add as command. * \param dIn Command destination @@ -487,6 +494,16 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& return Dispatch(State, cmdArg); } +/** \return true if any control blocks remain. */ +bool Command::UnterminatedControl() { + if (!control_.empty()) { + // TODO better error message + mprinterr("Error: %u unterminated control block(s) detected.\n", ctlidx_+1); + return true; + } + return false; +} + /** Create new control block with given Control. */ int Command::AddControlBlock(Control* ctl, ArgList& cmdArg) { if ( ctl->SetupControl( cmdArg ) ) diff --git a/src/Command.h b/src/Command.h index e380dedc85..4ac56fb210 100644 --- a/src/Command.h +++ b/src/Command.h @@ -15,6 +15,8 @@ class Command { static Cmd const& SearchToken(ArgList&); /// \return command of given type corresponding to given command key. static Cmd const& SearchTokenType(DispatchObject::Otype, const char*); + /// \return true if unterminated control block(s) exist. + static bool UnterminatedControl(); /// Execute command, modifies given CpptrajState static CpptrajState::RetType Dispatch(CpptrajState&, std::string const&); /// Read input commands from given file, modifies given CpptrajState. diff --git a/src/Cpptraj.cpp b/src/Cpptraj.cpp index 451e4568c8..7d61df3bad 100644 --- a/src/Cpptraj.cpp +++ b/src/Cpptraj.cpp @@ -436,6 +436,7 @@ Cpptraj::Mode Cpptraj::ProcessCmdLineArgs(int argc, char** argv) { { CpptrajState::RetType c_err = Command::ProcessInput( State_, *inputFilename ); if (c_err == CpptrajState::ERR && State_.ExitOnError()) return ERROR; + if (Command::UnterminatedControl()) return ERROR; if (c_err == CpptrajState::QUIT) return QUIT; } } @@ -450,6 +451,7 @@ Cpptraj::Mode Cpptraj::ProcessCmdLineArgs(int argc, char** argv) { // "" means read from STDIN CpptrajState::RetType c_err = Command::ProcessInput( State_, "" ); if (c_err == CpptrajState::ERR && State_.ExitOnError()) return ERROR; + if (Command::UnterminatedControl()) return ERROR; if (c_err == CpptrajState::QUIT) return QUIT; } } @@ -528,6 +530,7 @@ int Cpptraj::Interactive() { } } logfile_.CloseFile(); + if (Command::UnterminatedControl()) return 1; if (readLoop == CpptrajState::ERR) return 1; return 0; } From a8db6b3b0378cf9cfaa099b26b12fb70f36cbbcf Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 09:14:18 -0400 Subject: [PATCH 06/75] DRR - Cpptraj: Add control block description, use it to provide more detailed output and error messages. --- src/Command.cpp | 11 ++++++++++- src/Control.cpp | 6 +++--- src/Control.h | 5 +++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 8806c372b3..294acfc174 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -497,8 +497,9 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& /** \return true if any control blocks remain. */ bool Command::UnterminatedControl() { if (!control_.empty()) { - // TODO better error message mprinterr("Error: %u unterminated control block(s) detected.\n", ctlidx_+1); + for (int i = 0; i <= ctlidx_; i++) + mprinterr("Error: %i : %s\n", i, control_[i]->Description().c_str()); return true; } return false; @@ -510,6 +511,10 @@ int Command::AddControlBlock(Control* ctl, ArgList& cmdArg) { return 1; control_.push_back( ctl ); ctlidx_++; + mprintf("CONTROL: "); + for (int i = 0; i < ctlidx_; i++) + mprintf(" "); + mprintf("%s\n", ctl->Description().c_str()); mprintf("DEBUG: Begin control block %i\n", ctlidx_); return 0; } @@ -525,6 +530,10 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) // In control block. Check if current block should end. if ( control_[ctlidx_]->EndControl( cmdArg ) ) { mprintf("DEBUG: End control block %i.\n", ctlidx_); + mprintf("CONTROL: "); + for (int i = 0; i < ctlidx_; i++) + mprintf(" "); + mprintf("END\n"); ctlidx_--; if (ctlidx_ < 0) { // Outermost control structure is ended. Execute control block(s). diff --git a/src/Control.cpp b/src/Control.cpp index e173a528dd..bc3bf2e5e0 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -26,9 +26,9 @@ int Control_For::SetupControl(ArgList& argIn) { mprinterr("Error: 'for inmask': missing variable name.\n"); return 1; } - static const char* TypeStr[] = { "ATOMS", "RESIDUES", "MOLECULES" }; - mprintf("DEBUG: for %s %s inmask %s do\n", TypeStr[varType_], - varname_.c_str(), mask_.MaskString()); + static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; + description_.assign("for " + std::string(TypeStr[varType_]) + + varname_ + " inmask " + mask_.MaskExpression() + " do"); } if (varname_.empty()) { mprinterr("Error: for: No variable name/loop type specified.\n"); diff --git a/src/Control.h b/src/Control.h index e82e82ba70..28401e60ee 100644 --- a/src/Control.h +++ b/src/Control.h @@ -15,10 +15,15 @@ class Control : public DispatchObject { virtual bool EndControl(ArgList const&) const = 0; /// Add command to control structure. virtual void AddCommand(ArgList const&) = 0; + /// \return Description of control structure. + std::string const& Description() const { return description_; } + virtual unsigned int Ncommands() const = 0; virtual const_iterator begin() const = 0; virtual const_iterator end() const = 0; virtual bool NotDone() = 0; + protected: + std::string description_; ///< Describe control TODO private? }; /// Loop over mask expression etc From 3dff7d657cd5612abe55667ae8195449c024ba81 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 09:25:52 -0400 Subject: [PATCH 07/75] DRR - Cpptraj: Add mask setup --- src/Command.cpp | 8 ++++---- src/Command.h | 2 +- src/Control.cpp | 11 ++++++++--- src/Control.h | 8 +++----- src/cpptrajdepend | 2 +- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 294acfc174..3f5d369738 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -506,8 +506,8 @@ bool Command::UnterminatedControl() { } /** Create new control block with given Control. */ -int Command::AddControlBlock(Control* ctl, ArgList& cmdArg) { - if ( ctl->SetupControl( cmdArg ) ) +int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) { + if ( ctl->SetupControl( State, cmdArg ) ) return 1; control_.push_back( ctl ); ctlidx_++; @@ -554,7 +554,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) } else { // Create new control block DispatchObject* obj = ctlCmd.Alloc(); - if (AddControlBlock( (Control*)obj, cmdArg )) { + if (AddControlBlock( (Control*)obj, State, cmdArg )) { delete obj; return CpptrajState::ERR; } @@ -582,7 +582,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) switch (cmd.Destination()) { case Cmd::CTL: mprintf("DEBUG: Initial control statement detected.\n"); - if (AddControlBlock( (Control*)obj, cmdArg )) { + if (AddControlBlock( (Control*)obj, State, cmdArg )) { delete obj; return CpptrajState::ERR; } diff --git a/src/Command.h b/src/Command.h index 4ac56fb210..fe044d16d2 100644 --- a/src/Command.h +++ b/src/Command.h @@ -26,7 +26,7 @@ class Command { private: static Cmd const& SearchTokenType(DispatchObject::Otype, const char*, bool); static void ListCommandsForType(DispatchObject::Otype); - static int AddControlBlock(Control*, ArgList&); + static int AddControlBlock(Control*, CpptrajState&, ArgList&); static CpptrajState::RetType Dispatch(CpptrajState&, ArgList&); static CmdList commands_; ///< Master list of commands. diff --git a/src/Control.cpp b/src/Control.cpp index bc3bf2e5e0..f8331b0814 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -2,15 +2,15 @@ #include "CpptrajStdio.h" void Control_For::Help() const { - mprintf("\tTODO\n"); + mprintf("\t{atoms|residues|molecules} inmask %s\n", DataSetList::TopIdxArgs); } -int Control_For::SetupControl(ArgList& argIn) { +int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { mask_.ResetMask(); varname_.clear(); commands_.clear(); varType_ = UNKNOWN; - // for {atoms|residues|molecules} inmask + // for {atoms|residues|molecules} inmask [TOP KEYWORDS] std::string inmask_arg = argIn.GetStringKey("inmask"); if (!inmask_arg.empty()) { if (mask_.SetMaskString( inmask_arg )) return 1; @@ -21,11 +21,16 @@ int Control_For::SetupControl(ArgList& argIn) { mprinterr("Error: One of {atoms|residues|molecules} not specfied.\n"); return 1; } + Topology* top = State.DSL().GetTopByIndex( argIn ); + if (top == 0) return 1; varname_ = argIn.GetStringNext(); if (varname_.empty()) { mprinterr("Error: 'for inmask': missing variable name.\n"); return 1; } + if (top->SetupIntegerMask( mask_ )) return 1; + mask_.MaskInfo(); + if (mask_.None()) return 1; static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; description_.assign("for " + std::string(TypeStr[varType_]) + varname_ + " inmask " + mask_.MaskExpression() + " do"); diff --git a/src/Control.h b/src/Control.h index 28401e60ee..36fa87610c 100644 --- a/src/Control.h +++ b/src/Control.h @@ -1,8 +1,6 @@ #ifndef INC_CONTROL_H #define INC_CONTROL_H -#include "ArgList.h" -#include "AtomMask.h" -#include "DispatchObject.h" +#include "CpptrajState.h" /// Control structures. class Control : public DispatchObject { public: @@ -10,7 +8,7 @@ class Control : public DispatchObject { typedef ArgArray::const_iterator const_iterator; Control() : DispatchObject(CONTROL) {} /// Set up control structure. - virtual int SetupControl(ArgList&) = 0; + virtual int SetupControl(CpptrajState&, ArgList&) = 0; /// Check for control structure end command. virtual bool EndControl(ArgList const&) const = 0; /// Add command to control structure. @@ -33,7 +31,7 @@ class Control_For : public Control { void Help() const; DispatchObject* Alloc() const { return (DispatchObject*)new Control_For(); } - int SetupControl(ArgList&); + int SetupControl(CpptrajState&, ArgList&); bool EndControl(ArgList const& a) const { return (a.CommandIs("done")); } void AddCommand(ArgList const& c) { commands_.push_back(c); } unsigned int Ncommands() const { return commands_.size(); } diff --git a/src/cpptrajdepend b/src/cpptrajdepend index 037412ea33..ad4669dee0 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -149,7 +149,7 @@ CmdInput.o : CmdInput.cpp CmdInput.h StringRoutines.h CmdList.o : CmdList.cpp Cmd.h CmdList.h DispatchObject.h ComplexArray.o : ComplexArray.cpp ArrayIterator.h ComplexArray.h Constraints.o : Constraints.cpp ArgList.h Atom.h AtomExtra.h AtomMask.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 ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h Vec3.h -Control.o : Control.cpp ArgList.h Control.h CpptrajStdio.h DispatchObject.h +Control.o : Control.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h CoordinateInfo.o : CoordinateInfo.cpp Box.h CoordinateInfo.h CpptrajStdio.h Matrix_3x3.h Parallel.h ReplicaDimArray.h Vec3.h Corr.o : Corr.cpp ArrayIterator.h ComplexArray.h Corr.h PubFFT.h CpptrajFile.o : CpptrajFile.cpp CpptrajFile.h CpptrajStdio.h FileIO.h FileIO_Bzip2.h FileIO_Gzip.h FileIO_Mpi.h FileIO_Std.h FileName.h Parallel.h StringRoutines.h From 6d1779b60033577752280d25e63e720102973a33 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 09:49:05 -0400 Subject: [PATCH 08/75] DRR - Cpptraj: Start adding logic for actually executing the control blocks. --- src/Command.cpp | 15 +++++++++++++++ src/Command.h | 1 + src/Control.cpp | 11 +++++++++++ src/Control.h | 6 +++++- 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Command.cpp b/src/Command.cpp index 3f5d369738..6e4def4813 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -519,6 +519,20 @@ int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) return 0; } +int Command::ExecuteControlBlock(int block, CpptrajState& State) +{ + control_[block]->Start(); + while (control_[block]->NotDone()) { + for (Control::const_iterator it = control_[block]->begin(); + it != control_[block]->end(); ++it) + { + for (int i = 0; i < block; i++) mprintf(" "); + mprintf("%s\n", it->Command()); + } + } + return 0; +} + /** Search for the given command and execute it. EXE commands are executed * immediately and then freed. ACT and ANA commands are sent to the * CpptrajState for later execution. @@ -538,6 +552,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) if (ctlidx_ < 0) { // Outermost control structure is ended. Execute control block(s). mprintf("DEBUG: Executing %u control block(s).\n", control_.size()); + if (ExecuteControlBlock(0, State)) return CpptrajState::ERR; for (unsigned int i = 0; i < control_.size(); i++) { mprintf("DEBUG: %u : %u commands.\n", i, control_[i]->Ncommands()); delete control_[i]; diff --git a/src/Command.h b/src/Command.h index fe044d16d2..72ab81f494 100644 --- a/src/Command.h +++ b/src/Command.h @@ -27,6 +27,7 @@ class Command { static Cmd const& SearchTokenType(DispatchObject::Otype, const char*, bool); static void ListCommandsForType(DispatchObject::Otype); static int AddControlBlock(Control*, CpptrajState&, ArgList&); + static int ExecuteControlBlock(int, CpptrajState&); static CpptrajState::RetType Dispatch(CpptrajState&, ArgList&); static CmdList commands_; ///< Master list of commands. diff --git a/src/Control.cpp b/src/Control.cpp index f8331b0814..7139b0d190 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -41,3 +41,14 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } return 0; } + +void Control_For::Start() { + atom_ = mask_.begin(); +} + +bool Control_For::NotDone() { + if (atom_ == mask_.end()) return false; + mprintf("DEBUG: Control_For: %i\n", *atom_); + ++atom_; + return true; +} diff --git a/src/Control.h b/src/Control.h index 36fa87610c..1cf7334f4f 100644 --- a/src/Control.h +++ b/src/Control.h @@ -20,6 +20,7 @@ class Control : public DispatchObject { virtual const_iterator begin() const = 0; virtual const_iterator end() const = 0; virtual bool NotDone() = 0; + virtual void Start() = 0; protected: std::string description_; ///< Describe control TODO private? }; @@ -34,13 +35,16 @@ class Control_For : public Control { int SetupControl(CpptrajState&, ArgList&); bool EndControl(ArgList const& a) const { return (a.CommandIs("done")); } void AddCommand(ArgList const& c) { commands_.push_back(c); } + unsigned int Ncommands() const { return commands_.size(); } const_iterator begin() const { return commands_.begin(); } const_iterator end() const { return commands_.end(); } - bool NotDone() { return false; } // TODO + bool NotDone(); + void Start(); private: enum ForType {ATOMS=0, RESIDUES, MOLECULES, UNKNOWN}; AtomMask mask_; + AtomMask::const_iterator atom_; std::string varname_; ArgArray commands_; ForType varType_; From c508d5ebd6723b7c3737e509b284e0f4a928ada8 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 10:10:45 -0400 Subject: [PATCH 09/75] DRR - Cpptraj: Add logic for executing inner blocks recursively --- src/Command.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 6e4def4813..ff359eb4fa 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -519,6 +519,8 @@ int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) return 0; } +#define NEW_BLOCK "__NEW_BLOCK__" + int Command::ExecuteControlBlock(int block, CpptrajState& State) { control_[block]->Start(); @@ -526,8 +528,13 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State) for (Control::const_iterator it = control_[block]->begin(); it != control_[block]->end(); ++it) { - for (int i = 0; i < block; i++) mprintf(" "); - mprintf("%s\n", it->Command()); + // Check if we need to execute a new block + if (it->CommandIs(NEW_BLOCK)) { + if (ExecuteControlBlock(block+1, State)) return 1; + } else { + for (int i = 0; i < block; i++) mprintf(" "); + mprintf("%s\n", it->ArgLine()); + } } } return 0; @@ -567,6 +574,8 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) control_[ctlidx_]->AddCommand( cmdArg ); mprintf("DEBUG: Added command '%s' to control block %i.\n", cmdArg.Command(), ctlidx_); } else { + // Tell current block that a new block is being created + control_[ctlidx_]->AddCommand(NEW_BLOCK); // Create new control block DispatchObject* obj = ctlCmd.Alloc(); if (AddControlBlock( (Control*)obj, State, cmdArg )) { @@ -617,6 +626,8 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) return ret_val; } +#undef NEW_BLOCK + /** Read command input from file. */ CpptrajState::RetType Command::ProcessInput(CpptrajState& State, std::string const& inputFilename) { From aa50d9f7f1160bb3069efc4099151677f4ae88bd Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 10:31:22 -0400 Subject: [PATCH 10/75] DRR - Cpptraj: First attempt at replacing variables. --- src/ArgList.h | 2 ++ src/Command.cpp | 2 +- src/Control.cpp | 17 ++++++++++++++++- src/Control.h | 5 +++-- src/cpptrajdepend | 2 +- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/ArgList.h b/src/ArgList.h index 5729d0fe6b..0b82344be8 100644 --- a/src/ArgList.h +++ b/src/ArgList.h @@ -61,6 +61,8 @@ class ArgList { void PrintDebug() const; /// Remove the first argument void RemoveFirstArg(); + /// Change argument at position to new argument + void ChangeArg(int p, std::string const& a) { arglist_[p] = a; } /// \return the first argument const char *Command() const; /// \return true if the first argument matches key diff --git a/src/Command.cpp b/src/Command.cpp index ff359eb4fa..ac1a022938 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -533,7 +533,7 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State) if (ExecuteControlBlock(block+1, State)) return 1; } else { for (int i = 0; i < block; i++) mprintf(" "); - mprintf("%s\n", it->ArgLine()); + mprintf("%s %s\n", it->Command(), it->ArgString().c_str()); } } } diff --git a/src/Control.cpp b/src/Control.cpp index 7139b0d190..8aa2dca174 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -1,5 +1,6 @@ #include "Control.h" #include "CpptrajStdio.h" +#include "StringRoutines.h" void Control_For::Help() const { mprintf("\t{atoms|residues|molecules} inmask %s\n", DataSetList::TopIdxArgs); @@ -48,7 +49,21 @@ void Control_For::Start() { bool Control_For::NotDone() { if (atom_ == mask_.end()) return false; - mprintf("DEBUG: Control_For: %i\n", *atom_); + std::string atomStr = "@" + integerToString(*atom_ + 1); + mprintf("DEBUG: Control_For: %s\n", atomStr.c_str()); + // Replace varname_ in commands with atom + modified_commands_.clear(); + for (const_iterator it = commands_.begin(); it != commands_.end(); ++it) + { + modified_commands_.push_back( *it ); + for (int i = 0; i < modified_commands_.back().Nargs(); i++) + { + if (modified_commands_.back()[i][0] == '$') { + modified_commands_.back().ChangeArg(i, atomStr); + mprintf("VAR %s\n", modified_commands_.back()[i].c_str()); + } + } + } ++atom_; return true; } diff --git a/src/Control.h b/src/Control.h index 1cf7334f4f..5b3f97abe5 100644 --- a/src/Control.h +++ b/src/Control.h @@ -37,8 +37,8 @@ class Control_For : public Control { void AddCommand(ArgList const& c) { commands_.push_back(c); } unsigned int Ncommands() const { return commands_.size(); } - const_iterator begin() const { return commands_.begin(); } - const_iterator end() const { return commands_.end(); } + const_iterator begin() const { return modified_commands_.begin(); } + const_iterator end() const { return modified_commands_.end(); } bool NotDone(); void Start(); private: @@ -47,6 +47,7 @@ class Control_For : public Control { AtomMask::const_iterator atom_; std::string varname_; ArgArray commands_; + ArgArray modified_commands_; ForType varType_; }; #endif diff --git a/src/cpptrajdepend b/src/cpptrajdepend index ad4669dee0..c60635411c 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -149,7 +149,7 @@ CmdInput.o : CmdInput.cpp CmdInput.h StringRoutines.h CmdList.o : CmdList.cpp Cmd.h CmdList.h DispatchObject.h ComplexArray.o : ComplexArray.cpp ArrayIterator.h ComplexArray.h Constraints.o : Constraints.cpp ArgList.h Atom.h AtomExtra.h AtomMask.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 ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h Vec3.h -Control.o : Control.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Control.o : Control.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h CoordinateInfo.o : CoordinateInfo.cpp Box.h CoordinateInfo.h CpptrajStdio.h Matrix_3x3.h Parallel.h ReplicaDimArray.h Vec3.h Corr.o : Corr.cpp ArrayIterator.h ComplexArray.h Corr.h PubFFT.h CpptrajFile.o : CpptrajFile.cpp CpptrajFile.h CpptrajStdio.h FileIO.h FileIO_Bzip2.h FileIO_Gzip.h FileIO_Mpi.h FileIO_Std.h FileName.h Parallel.h StringRoutines.h From 360efea954d85f53a48b883e1fa81d6b1ebde9fc Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 10:36:19 -0400 Subject: [PATCH 11/75] DRR - Cpptraj: Make unrecognized variable a warning --- src/Control.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 8aa2dca174..02621b6f1b 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -29,6 +29,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { mprinterr("Error: 'for inmask': missing variable name.\n"); return 1; } + varname_ = "$" + varname_; if (top->SetupIntegerMask( mask_ )) return 1; mask_.MaskInfo(); if (mask_.None()) return 1; @@ -59,8 +60,13 @@ bool Control_For::NotDone() { for (int i = 0; i < modified_commands_.back().Nargs(); i++) { if (modified_commands_.back()[i][0] == '$') { - modified_commands_.back().ChangeArg(i, atomStr); - mprintf("VAR %s\n", modified_commands_.back()[i].c_str()); + if (modified_commands_.back()[i] == varname_) { + modified_commands_.back().ChangeArg(i, atomStr); + } else { + mprinterr("Error: Unrecognized variable in command: %s\n", + modified_commands_.back()[i].c_str()); + return false; + } } } } From ff1f35da43baa897af8443d557f1487ab3805bf3 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 10:43:10 -0400 Subject: [PATCH 12/75] DRR - Cpptraj: Better error handling in control structure --- src/Command.cpp | 5 ++++- src/Control.cpp | 8 ++++---- src/Control.h | 6 ++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index ac1a022938..8e91b209ab 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -524,7 +524,8 @@ int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) int Command::ExecuteControlBlock(int block, CpptrajState& State) { control_[block]->Start(); - while (control_[block]->NotDone()) { + Control::DoneType ret = control_[block]->CheckDone(); + while (ret == Control::NOT_DONE) { for (Control::const_iterator it = control_[block]->begin(); it != control_[block]->end(); ++it) { @@ -536,7 +537,9 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State) mprintf("%s %s\n", it->Command(), it->ArgString().c_str()); } } + ret = control_[block]->CheckDone(); } + if (ret == Control::ERROR) return 1; return 0; } diff --git a/src/Control.cpp b/src/Control.cpp index 02621b6f1b..346545e50f 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -48,8 +48,8 @@ void Control_For::Start() { atom_ = mask_.begin(); } -bool Control_For::NotDone() { - if (atom_ == mask_.end()) return false; +Control::DoneType Control_For::CheckDone() { + if (atom_ == mask_.end()) return DONE; std::string atomStr = "@" + integerToString(*atom_ + 1); mprintf("DEBUG: Control_For: %s\n", atomStr.c_str()); // Replace varname_ in commands with atom @@ -65,11 +65,11 @@ bool Control_For::NotDone() { } else { mprinterr("Error: Unrecognized variable in command: %s\n", modified_commands_.back()[i].c_str()); - return false; + return ERROR; } } } } ++atom_; - return true; + return NOT_DONE; } diff --git a/src/Control.h b/src/Control.h index 5b3f97abe5..cd1f404162 100644 --- a/src/Control.h +++ b/src/Control.h @@ -16,10 +16,12 @@ class Control : public DispatchObject { /// \return Description of control structure. std::string const& Description() const { return description_; } + enum DoneType { DONE = 0, NOT_DONE, ERROR }; + virtual unsigned int Ncommands() const = 0; virtual const_iterator begin() const = 0; virtual const_iterator end() const = 0; - virtual bool NotDone() = 0; + virtual DoneType CheckDone() = 0; virtual void Start() = 0; protected: std::string description_; ///< Describe control TODO private? @@ -39,7 +41,7 @@ class Control_For : public Control { unsigned int Ncommands() const { return commands_.size(); } const_iterator begin() const { return modified_commands_.begin(); } const_iterator end() const { return modified_commands_.end(); } - bool NotDone(); + DoneType CheckDone(); void Start(); private: enum ForType {ATOMS=0, RESIDUES, MOLECULES, UNKNOWN}; From 1fadc50f40d63320be5f41d45f1e8876ea0aeeb8 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 13:00:56 -0400 Subject: [PATCH 13/75] DRR - Cpptraj: Come up with a way to pass variables in nested loops --- src/Command.cpp | 29 ++++++++++++++++++++++------- src/Command.h | 2 +- src/Control.cpp | 32 ++++++++++++++------------------ src/Control.h | 18 +++++++++++------- 4 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 8e91b209ab..2fe7a9ed71 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -521,23 +521,38 @@ int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) #define NEW_BLOCK "__NEW_BLOCK__" -int Command::ExecuteControlBlock(int block, CpptrajState& State) +int Command::ExecuteControlBlock(int block, CpptrajState& State, Control::Varray CurrentVars) { - control_[block]->Start(); - Control::DoneType ret = control_[block]->CheckDone(); + control_[block]->Start(CurrentVars); + Control::DoneType ret = control_[block]->CheckDone(CurrentVars); while (ret == Control::NOT_DONE) { for (Control::const_iterator it = control_[block]->begin(); it != control_[block]->end(); ++it) { // Check if we need to execute a new block if (it->CommandIs(NEW_BLOCK)) { - if (ExecuteControlBlock(block+1, State)) return 1; + if (ExecuteControlBlock(block+1, State, CurrentVars)) return 1; } else { + // Replace variable names in command with entries from CurrentVars + ArgList modCmd = *it; + for (int n = 0; n < modCmd.Nargs(); n++) { + if (modCmd[n][0] == '$') { + Control::Varray::const_iterator vp = CurrentVars.begin(); + for (; vp != CurrentVars.end(); ++vp) + if (vp->first == modCmd[n]) break; + if (vp != CurrentVars.end()) + modCmd.ChangeArg(n, vp->second); + else { + mprinterr("Error: Unrecognized variable in command: %s\n", modCmd[n].c_str()); + return 1; + } + } + } for (int i = 0; i < block; i++) mprintf(" "); - mprintf("%s %s\n", it->Command(), it->ArgString().c_str()); + mprintf("%s %s\n", modCmd.Command(), modCmd.ArgString().c_str()); } } - ret = control_[block]->CheckDone(); + ret = control_[block]->CheckDone(CurrentVars); } if (ret == Control::ERROR) return 1; return 0; @@ -562,7 +577,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) if (ctlidx_ < 0) { // Outermost control structure is ended. Execute control block(s). mprintf("DEBUG: Executing %u control block(s).\n", control_.size()); - if (ExecuteControlBlock(0, State)) return CpptrajState::ERR; + if (ExecuteControlBlock(0, State, Control::Varray())) return CpptrajState::ERR; for (unsigned int i = 0; i < control_.size(); i++) { mprintf("DEBUG: %u : %u commands.\n", i, control_[i]->Ncommands()); delete control_[i]; diff --git a/src/Command.h b/src/Command.h index 72ab81f494..3a8846ea50 100644 --- a/src/Command.h +++ b/src/Command.h @@ -27,7 +27,7 @@ class Command { static Cmd const& SearchTokenType(DispatchObject::Otype, const char*, bool); static void ListCommandsForType(DispatchObject::Otype); static int AddControlBlock(Control*, CpptrajState&, ArgList&); - static int ExecuteControlBlock(int, CpptrajState&); + static int ExecuteControlBlock(int, CpptrajState&, Control::Varray); static CpptrajState::RetType Dispatch(CpptrajState&, ArgList&); static CmdList commands_; ///< Master list of commands. diff --git a/src/Control.cpp b/src/Control.cpp index 346545e50f..e038a46eeb 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -44,30 +44,26 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { return 0; } -void Control_For::Start() { +void Control_For::Start(Varray& CurrentVars) { atom_ = mask_.begin(); + // Init CurrentVars + CurrentVars.push_back( VarPair(varname_, "") ); + mprintf("DEBUG: Start: CurrentVars:"); + for (Varray::const_iterator vp = CurrentVars.begin(); vp != CurrentVars.end(); ++vp) + mprintf(" %s=%s", vp->first.c_str(), vp->second.c_str()); + mprintf("\n"); } -Control::DoneType Control_For::CheckDone() { +Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { if (atom_ == mask_.end()) return DONE; std::string atomStr = "@" + integerToString(*atom_ + 1); mprintf("DEBUG: Control_For: %s\n", atomStr.c_str()); - // Replace varname_ in commands with atom - modified_commands_.clear(); - for (const_iterator it = commands_.begin(); it != commands_.end(); ++it) - { - modified_commands_.push_back( *it ); - for (int i = 0; i < modified_commands_.back().Nargs(); i++) - { - if (modified_commands_.back()[i][0] == '$') { - if (modified_commands_.back()[i] == varname_) { - modified_commands_.back().ChangeArg(i, atomStr); - } else { - mprinterr("Error: Unrecognized variable in command: %s\n", - modified_commands_.back()[i].c_str()); - return ERROR; - } - } + // Update CurrentVars + Varray::iterator it = CurrentVars.begin(); + for (; it != CurrentVars.end(); ++it) { + if (it->first == varname_) { + it->second = atomStr; + break; } } ++atom_; diff --git a/src/Control.h b/src/Control.h index cd1f404162..7f092210ad 100644 --- a/src/Control.h +++ b/src/Control.h @@ -18,11 +18,16 @@ class Control : public DispatchObject { enum DoneType { DONE = 0, NOT_DONE, ERROR }; + /// Hold variable, value + typedef std::pair VarPair; + /// Hold variable/value pairs + typedef std::vector Varray; + virtual unsigned int Ncommands() const = 0; virtual const_iterator begin() const = 0; virtual const_iterator end() const = 0; - virtual DoneType CheckDone() = 0; - virtual void Start() = 0; + virtual void Start(Varray&) = 0; + virtual DoneType CheckDone(Varray&) = 0; protected: std::string description_; ///< Describe control TODO private? }; @@ -39,17 +44,16 @@ class Control_For : public Control { void AddCommand(ArgList const& c) { commands_.push_back(c); } unsigned int Ncommands() const { return commands_.size(); } - const_iterator begin() const { return modified_commands_.begin(); } - const_iterator end() const { return modified_commands_.end(); } - DoneType CheckDone(); - void Start(); + const_iterator begin() const { return commands_.begin(); } + const_iterator end() const { return commands_.end(); } + void Start(Varray&); + DoneType CheckDone(Varray&); private: enum ForType {ATOMS=0, RESIDUES, MOLECULES, UNKNOWN}; AtomMask mask_; AtomMask::const_iterator atom_; std::string varname_; ArgArray commands_; - ArgArray modified_commands_; ForType varType_; }; #endif From 81177717d49a759b6aa6d91447516935c9fd7fb3 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 14:07:31 -0400 Subject: [PATCH 14/75] DRR - Cpptraj: for -> formask --- src/Command.cpp | 2 +- src/Control.cpp | 16 ++++++++-------- src/Control.h | 12 ++++++++---- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 2fe7a9ed71..1b54224108 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -370,7 +370,7 @@ void Command::Init() { Command::AddCmd( new Analysis_VectorMath(), Cmd::ANA, 1, "vectormath" ); Command::AddCmd( new Analysis_Wavelet(), Cmd::ANA, 1, "wavelet" ); // CONTROL STRUCTURES - Command::AddCmd( new Control_For(), Cmd::CTL, 1, "for" ); + Command::AddCmd( new Control_For_Mask(), Cmd::CTL, 1, "formask" ); // DEPRECATED COMMANDS Command::AddCmd( new Deprecated_AvgCoord(), Cmd::DEP, 1, "avgcoord" ); Command::AddCmd( new Deprecated_DihScan(), Cmd::DEP, 1, "dihedralscan" ); diff --git a/src/Control.cpp b/src/Control.cpp index e038a46eeb..d17d1edf66 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -2,17 +2,17 @@ #include "CpptrajStdio.h" #include "StringRoutines.h" -void Control_For::Help() const { - mprintf("\t{atoms|residues|molecules} inmask %s\n", DataSetList::TopIdxArgs); +void Control_For_Mask::Help() const { + mprintf("\t{atoms|residues|molecules} in %s\n", DataSetList::TopIdxArgs); } -int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { +int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { mask_.ResetMask(); varname_.clear(); commands_.clear(); varType_ = UNKNOWN; - // for {atoms|residues|molecules} inmask [TOP KEYWORDS] - std::string inmask_arg = argIn.GetStringKey("inmask"); + // formask {atoms|residues|molecules} inmask [TOP KEYWORDS] + std::string inmask_arg = argIn.GetStringKey("in"); if (!inmask_arg.empty()) { if (mask_.SetMaskString( inmask_arg )) return 1; if (argIn.hasKey("atoms")) varType_ = ATOMS; @@ -44,7 +44,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { return 0; } -void Control_For::Start(Varray& CurrentVars) { +void Control_For_Mask::Start(Varray& CurrentVars) { atom_ = mask_.begin(); // Init CurrentVars CurrentVars.push_back( VarPair(varname_, "") ); @@ -54,10 +54,10 @@ void Control_For::Start(Varray& CurrentVars) { mprintf("\n"); } -Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { +Control::DoneType Control_For_Mask::CheckDone(Varray& CurrentVars) { if (atom_ == mask_.end()) return DONE; std::string atomStr = "@" + integerToString(*atom_ + 1); - mprintf("DEBUG: Control_For: %s\n", atomStr.c_str()); + mprintf("DEBUG: Control_For_Mask: %s\n", atomStr.c_str()); // Update CurrentVars Varray::iterator it = CurrentVars.begin(); for (; it != CurrentVars.end(); ++it) { diff --git a/src/Control.h b/src/Control.h index 7f092210ad..456101acd5 100644 --- a/src/Control.h +++ b/src/Control.h @@ -22,22 +22,26 @@ class Control : public DispatchObject { typedef std::pair VarPair; /// Hold variable/value pairs typedef std::vector Varray; - + /// \return Number of commands in the block virtual unsigned int Ncommands() const = 0; + /// \return iterator to first command in the block. virtual const_iterator begin() const = 0; + /// \return iterator to last command in the block. virtual const_iterator end() const = 0; + /// Start control block. Check/init variables. virtual void Start(Varray&) = 0; + /// Update variables and increment, check control state. virtual DoneType CheckDone(Varray&) = 0; protected: std::string description_; ///< Describe control TODO private? }; /// Loop over mask expression etc -class Control_For : public Control { +class Control_For_Mask : public Control { public: - Control_For() {} + Control_For_Mask() {} void Help() const; - DispatchObject* Alloc() const { return (DispatchObject*)new Control_For(); } + DispatchObject* Alloc() const { return (DispatchObject*)new Control_For_Mask(); } int SetupControl(CpptrajState&, ArgList&); bool EndControl(ArgList const& a) const { return (a.CommandIs("done")); } From e96f75c45489fee5380ad09868dcee1d940aab15 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 14:51:23 -0400 Subject: [PATCH 15/75] DRR - Cpptraj: Allow multiple masks --- src/ArgList.cpp | 1 - src/ArgList.h | 2 +- src/Control.cpp | 79 ++++++++++++++++++++++++++----------------------- src/Control.h | 14 ++++++--- 4 files changed, 53 insertions(+), 43 deletions(-) diff --git a/src/ArgList.cpp b/src/ArgList.cpp index a593486c64..bcea49dcc1 100644 --- a/src/ArgList.cpp +++ b/src/ArgList.cpp @@ -440,7 +440,6 @@ bool ArgList::hasKey(const char *key) { /** \param key string to search for * \return true if key is found, false if not. */ -// NOTE: Should this be ignoring previously marked strings? bool ArgList::Contains(const char *key) const { for (unsigned int arg = 0; arg < arglist_.size(); arg++) if (!marked_[arg]) { diff --git a/src/ArgList.h b/src/ArgList.h index 0b82344be8..6768cd19e2 100644 --- a/src/ArgList.h +++ b/src/ArgList.h @@ -89,7 +89,7 @@ class ArgList { double getKeyDouble(const char*, double); /// \return true if the key is present in the list bool hasKey(const char*); - /// \return true if they key is in the list but do not mark. + /// \return true if they key is in the list and unmarked; do not mark. bool Contains(const char*) const; private: /// Empty string to return when args not found diff --git a/src/Control.cpp b/src/Control.cpp index d17d1edf66..35b147f17a 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -7,47 +7,49 @@ void Control_For_Mask::Help() const { } int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { - mask_.ResetMask(); - varname_.clear(); - commands_.clear(); - varType_ = UNKNOWN; - // formask {atoms|residues|molecules} inmask [TOP KEYWORDS] + Masks_.clear(); + description_.clear(); + Topology* currentTop = 0; + // formask {atoms|residues|molecules} inmask [TOP KEYWORDS] ... std::string inmask_arg = argIn.GetStringKey("in"); - if (!inmask_arg.empty()) { - if (mask_.SetMaskString( inmask_arg )) return 1; - if (argIn.hasKey("atoms")) varType_ = ATOMS; - else if (argIn.hasKey("residues")) varType_ = RESIDUES; - else if (argIn.hasKey("molecules")) varType_ = MOLECULES; - if (varType_ == UNKNOWN) { + while (!inmask_arg.empty()) { + Masks_.push_back( MaskHolder() ); + MaskHolder& MH = Masks_.back(); + if (MH.mask_.SetMaskString( inmask_arg )) return 1; + if (argIn.hasKey("atoms")) MH.varType_ = ATOMS; + else if (argIn.hasKey("residues")) MH.varType_ = RESIDUES; + else if (argIn.hasKey("molecules")) MH.varType_ = MOLECULES; + if (MH.varType_ == UNKNOWN) { mprinterr("Error: One of {atoms|residues|molecules} not specfied.\n"); return 1; } Topology* top = State.DSL().GetTopByIndex( argIn ); - if (top == 0) return 1; - varname_ = argIn.GetStringNext(); - if (varname_.empty()) { + if (top != 0) currentTop = top; + if (currentTop == 0) return 1; + MH.varname_ = argIn.GetStringNext(); + if (MH.varname_.empty()) { mprinterr("Error: 'for inmask': missing variable name.\n"); return 1; } - varname_ = "$" + varname_; - if (top->SetupIntegerMask( mask_ )) return 1; - mask_.MaskInfo(); - if (mask_.None()) return 1; + MH.varname_ = "$" + MH.varname_; + if (currentTop->SetupIntegerMask( MH.mask_ )) return 1; + MH.mask_.MaskInfo(); + if (MH.mask_.None()) return 1; static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; - description_.assign("for " + std::string(TypeStr[varType_]) + - varname_ + " inmask " + mask_.MaskExpression() + " do"); - } - if (varname_.empty()) { - mprinterr("Error: for: No variable name/loop type specified.\n"); - return 1; + description_.append("for " + std::string(TypeStr[MH.varType_]) + + MH.varname_ + " inmask " + MH.mask_.MaskExpression() + " do "); + inmask_arg = argIn.GetStringKey("in"); } + return 0; } void Control_For_Mask::Start(Varray& CurrentVars) { - atom_ = mask_.begin(); - // Init CurrentVars - CurrentVars.push_back( VarPair(varname_, "") ); + for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { + MH->atom_ = MH->mask_.begin(); + // Init CurrentVars + CurrentVars.push_back( VarPair(MH->varname_, "") ); + } mprintf("DEBUG: Start: CurrentVars:"); for (Varray::const_iterator vp = CurrentVars.begin(); vp != CurrentVars.end(); ++vp) mprintf(" %s=%s", vp->first.c_str(), vp->second.c_str()); @@ -55,17 +57,20 @@ void Control_For_Mask::Start(Varray& CurrentVars) { } Control::DoneType Control_For_Mask::CheckDone(Varray& CurrentVars) { - if (atom_ == mask_.end()) return DONE; - std::string atomStr = "@" + integerToString(*atom_ + 1); - mprintf("DEBUG: Control_For_Mask: %s\n", atomStr.c_str()); - // Update CurrentVars - Varray::iterator it = CurrentVars.begin(); - for (; it != CurrentVars.end(); ++it) { - if (it->first == varname_) { - it->second = atomStr; - break; + for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { + // Exit as soon as one is done TODO check all + if (MH->atom_ == MH->mask_.end()) return DONE; + std::string atomStr = "@" + integerToString(*(MH->atom_) + 1); + mprintf("DEBUG: Control_For_Mask: %s\n", atomStr.c_str()); + // Update CurrentVars + Varray::iterator it = CurrentVars.begin(); + for (; it != CurrentVars.end(); ++it) { + if (it->first == MH->varname_) { + it->second = atomStr; + break; + } } + ++(MH->atom_); } - ++atom_; return NOT_DONE; } diff --git a/src/Control.h b/src/Control.h index 456101acd5..a3029c03b7 100644 --- a/src/Control.h +++ b/src/Control.h @@ -54,10 +54,16 @@ class Control_For_Mask : public Control { DoneType CheckDone(Varray&); private: enum ForType {ATOMS=0, RESIDUES, MOLECULES, UNKNOWN}; - AtomMask mask_; - AtomMask::const_iterator atom_; - std::string varname_; + class MaskHolder { + public: + MaskHolder() : varType_(UNKNOWN) {} + AtomMask mask_; + AtomMask::const_iterator atom_; + std::string varname_; + ForType varType_; + }; + typedef std::vector Marray; + Marray Masks_; ArgArray commands_; - ForType varType_; }; #endif From 184a77528a1b124d2856ca18090b83e1187addd0 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 14:57:32 -0400 Subject: [PATCH 16/75] DRR - Cpptraj: Add some error checking and improve output messages. --- src/Control.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 35b147f17a..2e290590d7 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -1,3 +1,4 @@ +#include // std::min #include "Control.h" #include "CpptrajStdio.h" #include "StringRoutines.h" @@ -6,12 +7,15 @@ void Control_For_Mask::Help() const { mprintf("\t{atoms|residues|molecules} in %s\n", DataSetList::TopIdxArgs); } +/** Set up each mask. */ int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { Masks_.clear(); - description_.clear(); Topology* currentTop = 0; + static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; + description_.assign("for "); // formask {atoms|residues|molecules} inmask [TOP KEYWORDS] ... std::string inmask_arg = argIn.GetStringKey("in"); + int Nselected = -1; while (!inmask_arg.empty()) { Masks_.push_back( MaskHolder() ); MaskHolder& MH = Masks_.back(); @@ -35,11 +39,17 @@ int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { if (currentTop->SetupIntegerMask( MH.mask_ )) return 1; MH.mask_.MaskInfo(); if (MH.mask_.None()) return 1; - static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; - description_.append("for " + std::string(TypeStr[MH.varType_]) + - MH.varname_ + " inmask " + MH.mask_.MaskExpression() + " do "); + if (Nselected == -1) + Nselected = MH.mask_.Nselected(); + else if (MH.mask_.Nselected() != Nselected) + mprintf("Warning: # selected %i != previous # selected %i\n", + MH.mask_.Nselected(), Nselected); + if (description_ != "for ") description_.append(", "); + description_.append(std::string(TypeStr[MH.varType_]) + + MH.varname_ + " in " + MH.mask_.MaskExpression()); inmask_arg = argIn.GetStringKey("in"); } + description_.append(" do"); return 0; } From 13a34d74a60d058deccc606a7cc7d071c4a7ebb9 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 15:17:44 -0400 Subject: [PATCH 17/75] DRR - Cpptraj: Make residues and molecules work as well --- src/Control.cpp | 68 ++++++++++++++++++++++++++++++++++--------------- src/Control.h | 5 ++-- 2 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 2e290590d7..be49673f54 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -14,12 +14,13 @@ int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; description_.assign("for "); // formask {atoms|residues|molecules} inmask [TOP KEYWORDS] ... - std::string inmask_arg = argIn.GetStringKey("in"); - int Nselected = -1; - while (!inmask_arg.empty()) { + std::string inMaskArg = argIn.GetStringKey("in"); + int Niterations = -1; + while (!inMaskArg.empty()) { Masks_.push_back( MaskHolder() ); MaskHolder& MH = Masks_.back(); - if (MH.mask_.SetMaskString( inmask_arg )) return 1; + AtomMask currentMask; + if (currentMask.SetMaskString( inMaskArg )) return 1; if (argIn.hasKey("atoms")) MH.varType_ = ATOMS; else if (argIn.hasKey("residues")) MH.varType_ = RESIDUES; else if (argIn.hasKey("molecules")) MH.varType_ = MOLECULES; @@ -36,18 +37,41 @@ int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { return 1; } MH.varname_ = "$" + MH.varname_; - if (currentTop->SetupIntegerMask( MH.mask_ )) return 1; - MH.mask_.MaskInfo(); - if (MH.mask_.None()) return 1; - if (Nselected == -1) - Nselected = MH.mask_.Nselected(); - else if (MH.mask_.Nselected() != Nselected) - mprintf("Warning: # selected %i != previous # selected %i\n", - MH.mask_.Nselected(), Nselected); + if (currentTop->SetupIntegerMask( currentMask )) return 1; + currentMask.MaskInfo(); + if (currentMask.None()) return 1; + // Set up indices + if (MH.varType_ == ATOMS) + MH.Idxs_ = currentMask.Selected(); + else if (MH.varType_ == RESIDUES) { + int curRes = -1; + for (AtomMask::const_iterator at = currentMask.begin(); at != currentMask.end(); ++at) { + int res = (*currentTop)[*at].ResNum(); + if (res != curRes) { + MH.Idxs_.push_back( res ); + curRes = res; + } + } + } else if (MH.varType_ == MOLECULES) { + int curMol = -1; + for (AtomMask::const_iterator at = currentMask.begin(); at != currentMask.end(); ++at) { + int mol = (*currentTop)[*at].MolNum(); + if (mol != curMol) { + MH.Idxs_.push_back( mol ); + curMol = mol; + } + } + } + // Check number of values + if (Niterations == -1) + Niterations = (int)MH.Idxs_.size(); + else if ((int)MH.Idxs_.size() != Niterations) + mprintf("Warning: # iterations %zu != previous # iterations %i\n", + MH.Idxs_.size(), Niterations); if (description_ != "for ") description_.append(", "); description_.append(std::string(TypeStr[MH.varType_]) + - MH.varname_ + " in " + MH.mask_.MaskExpression()); - inmask_arg = argIn.GetStringKey("in"); + MH.varname_ + " in " + currentMask.MaskExpression()); + inMaskArg = argIn.GetStringKey("in"); } description_.append(" do"); @@ -56,7 +80,7 @@ int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { void Control_For_Mask::Start(Varray& CurrentVars) { for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { - MH->atom_ = MH->mask_.begin(); + MH->idx_ = MH->Idxs_.begin(); // Init CurrentVars CurrentVars.push_back( VarPair(MH->varname_, "") ); } @@ -68,19 +92,21 @@ void Control_For_Mask::Start(Varray& CurrentVars) { Control::DoneType Control_For_Mask::CheckDone(Varray& CurrentVars) { for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { - // Exit as soon as one is done TODO check all - if (MH->atom_ == MH->mask_.end()) return DONE; - std::string atomStr = "@" + integerToString(*(MH->atom_) + 1); - mprintf("DEBUG: Control_For_Mask: %s\n", atomStr.c_str()); + // Exit as soon as one is done TODO check all? + if (MH->idx_ == MH->Idxs_.end()) return DONE; + // Get variable value + static const char* prefix[] = {"@", ":", "^"}; + std::string maskStr = prefix[MH->varType_] + integerToString(*(MH->idx_) + 1); + mprintf("DEBUG: Control_For_Mask: %s\n", maskStr.c_str()); // Update CurrentVars Varray::iterator it = CurrentVars.begin(); for (; it != CurrentVars.end(); ++it) { if (it->first == MH->varname_) { - it->second = atomStr; + it->second = maskStr; break; } } - ++(MH->atom_); + ++(MH->idx_); } return NOT_DONE; } diff --git a/src/Control.h b/src/Control.h index a3029c03b7..d47e3516a6 100644 --- a/src/Control.h +++ b/src/Control.h @@ -54,11 +54,12 @@ class Control_For_Mask : public Control { DoneType CheckDone(Varray&); private: enum ForType {ATOMS=0, RESIDUES, MOLECULES, UNKNOWN}; + typedef std::vector Iarray; class MaskHolder { public: MaskHolder() : varType_(UNKNOWN) {} - AtomMask mask_; - AtomMask::const_iterator atom_; + Iarray Idxs_; ///< Hold selected atom/residue/molecule indices + Iarray::const_iterator idx_; ///< Hold current atom/residue/molecule index std::string varname_; ForType varType_; }; From 353242826d3af4c8afc785e3d361eb815e4281eb Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 15:20:07 -0400 Subject: [PATCH 18/75] DRR - Cpptraj: Move debug statements. Add code docs. --- src/Command.cpp | 4 ++++ src/Control.cpp | 6 ++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 1b54224108..e7c7610d11 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -524,6 +524,10 @@ int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) int Command::ExecuteControlBlock(int block, CpptrajState& State, Control::Varray CurrentVars) { control_[block]->Start(CurrentVars); + mprintf("DEBUG: Start: CurrentVars:"); + for (Control::Varray::const_iterator vp = CurrentVars.begin(); vp != CurrentVars.end(); ++vp) + mprintf(" %s=%s", vp->first.c_str(), vp->second.c_str()); + mprintf("\n"); Control::DoneType ret = control_[block]->CheckDone(CurrentVars); while (ret == Control::NOT_DONE) { for (Control::const_iterator it = control_[block]->begin(); diff --git a/src/Control.cpp b/src/Control.cpp index be49673f54..405117e0c5 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -78,18 +78,16 @@ int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { return 0; } +/** For each mask add variable to CurrentVars and initialize iterator. */ void Control_For_Mask::Start(Varray& CurrentVars) { for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { MH->idx_ = MH->Idxs_.begin(); // Init CurrentVars CurrentVars.push_back( VarPair(MH->varname_, "") ); } - mprintf("DEBUG: Start: CurrentVars:"); - for (Varray::const_iterator vp = CurrentVars.begin(); vp != CurrentVars.end(); ++vp) - mprintf(" %s=%s", vp->first.c_str(), vp->second.c_str()); - mprintf("\n"); } +/** For each mask check if done, then update CurrentVars, then increment. */ Control::DoneType Control_For_Mask::CheckDone(Varray& CurrentVars) { for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { // Exit as soon as one is done TODO check all? From e9bc8b13f4f1168e0cd63f75c1239efc2602e4c0 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 15:29:04 -0400 Subject: [PATCH 19/75] DRR - Cpptraj: Reorganize split of Dispatch --- src/Command.cpp | 23 ++++++++++++----------- src/Command.h | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index e7c7610d11..00735c355c 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -487,13 +487,6 @@ void Command::ListCommands(DispatchObject::Otype typeIn) { ListCommandsForType( typeIn ); } -CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& commandIn) -{ - ArgList cmdArg( commandIn ); - cmdArg.MarkArg(0); // Always mark the first arg as the command - return Dispatch(State, cmdArg); -} - /** \return true if any control blocks remain. */ bool Command::UnterminatedControl() { if (!control_.empty()) { @@ -564,10 +557,13 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State, Control::Varray /** Search for the given command and execute it. EXE commands are executed * immediately and then freed. ACT and ANA commands are sent to the - * CpptrajState for later execution. + * CpptrajState for later execution. CTL commands set up control blocks + * which will be executed when completed. */ -CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) +CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& commandIn) { + ArgList cmdArg( commandIn ); + cmdArg.MarkArg(0); // Always mark the first arg as the command // Check for control block if (!control_.empty()) { // In control block. Check if current block should end. @@ -608,6 +604,13 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) } return CpptrajState::OK; } + return ExecuteCommand( State, cmdArg ); +} + +#undef NEW_BLOCK + +/** Search for and execute the given command. */ +CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList& cmdArg ) { // Look for command in command list. Cmd const& cmd = SearchToken( cmdArg ); CpptrajState::RetType ret_val = CpptrajState::OK; @@ -648,8 +651,6 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, ArgList& cmdArg) return ret_val; } -#undef NEW_BLOCK - /** Read command input from file. */ CpptrajState::RetType Command::ProcessInput(CpptrajState& State, std::string const& inputFilename) { diff --git a/src/Command.h b/src/Command.h index 3a8846ea50..ec1dd59295 100644 --- a/src/Command.h +++ b/src/Command.h @@ -28,7 +28,7 @@ class Command { static void ListCommandsForType(DispatchObject::Otype); static int AddControlBlock(Control*, CpptrajState&, ArgList&); static int ExecuteControlBlock(int, CpptrajState&, Control::Varray); - static CpptrajState::RetType Dispatch(CpptrajState&, ArgList&); + static CpptrajState::RetType ExecuteCommand(CpptrajState&, ArgList&); static CmdList commands_; ///< Master list of commands. static const Cmd EMPTY_; ///< Empty command. From 3e16242f712b513531ee6baa860344751f85e4e9 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 15:32:49 -0400 Subject: [PATCH 20/75] DRR - Cpptraj: Actually execute the commands. --- src/Command.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Command.cpp b/src/Command.cpp index 00735c355c..8e07bbc4da 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -547,6 +547,7 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State, Control::Varray } for (int i = 0; i < block; i++) mprintf(" "); mprintf("%s %s\n", modCmd.Command(), modCmd.ArgString().c_str()); + if ( ExecuteCommand(State, modCmd) != CpptrajState::OK ) return 1; } } ret = control_[block]->CheckDone(CurrentVars); From 8da3065fa23cf6a83bb554813b5e165e1e431102 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 28 Sep 2017 15:43:16 -0400 Subject: [PATCH 21/75] DRR - Cpptraj: Modify test to use new loop syntax --- test/Test_IRED/RunTest.sh | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/test/Test_IRED/RunTest.sh b/test/Test_IRED/RunTest.sh index ef7ee40f61..c9d47df8ac 100755 --- a/test/Test_IRED/RunTest.sh +++ b/test/Test_IRED/RunTest.sh @@ -11,24 +11,12 @@ Requires mathlib TOP="1IEE_A_prot.prmtop" INPUT="ired.in" -echo "trajin 1IEE_A_test.mdcrd" > $INPUT -N=0 -# Define N-H vectors. H atom is always N atom plus one. -for NATOM in 25 41 61 68 92 102 117 136 146 156 166 183 205 \ - 229 246 253 272 284 298 319 343 350 371 382 401 408 \ - 422 446 462 472 482 492 514 534 549 560 574 594 608 \ - 622 639 649 663 677 701 715 729 741 748 759 773 785 \ - 806 813 832 851 868 887 901 912 936 960 984 994 1008 \ - 1020 1027 1051 1079 1086 1097 1121 1135 1154 1164 1178 1211 1221 \ - 1232 1242 1261 1280 1291 1302 1314 1333 1347 1357 1368 1384 1398 \ - 1408 1418 1440 1462 1481 1497 1508 1520 1527 1541 1548 1565 1579 \ - 1589 1613 1629 1639 1663 1687 1701 1725 1735 1757 1764 1778 1790 \ - 1806 1823 1833 1857 1876 1900 1907 1917 1941 ; do - ((HATOM = NATOM + 1)) - echo "vector v$N @$NATOM ired @$HATOM" >> $INPUT - ((N++)) +cat > $INPUT <> $INPUT < Date: Thu, 28 Sep 2017 16:04:19 -0400 Subject: [PATCH 22/75] DRR - Cpptraj: Hide debug info. Make outpout formatting a little nicer. --- src/Command.cpp | 35 +++++++++++++++++++++-------------- src/Control.cpp | 8 ++++++-- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 8e07bbc4da..3fa8d8f2a1 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -504,23 +504,25 @@ int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) return 1; control_.push_back( ctl ); ctlidx_++; - mprintf("CONTROL: "); + mprintf(" BLOCK %2i: ", ctlidx_); for (int i = 0; i < ctlidx_; i++) mprintf(" "); mprintf("%s\n", ctl->Description().c_str()); - mprintf("DEBUG: Begin control block %i\n", ctlidx_); + //mprintf("DEBUG: Begin control block %i\n", ctlidx_); return 0; } #define NEW_BLOCK "__NEW_BLOCK__" - +/** Execute the specified control block. */ int Command::ExecuteControlBlock(int block, CpptrajState& State, Control::Varray CurrentVars) { control_[block]->Start(CurrentVars); - mprintf("DEBUG: Start: CurrentVars:"); - for (Control::Varray::const_iterator vp = CurrentVars.begin(); vp != CurrentVars.end(); ++vp) - mprintf(" %s=%s", vp->first.c_str(), vp->second.c_str()); - mprintf("\n"); + if (State.Debug() > 0) { + mprintf("DEBUG: Start: CurrentVars:"); + for (Control::Varray::const_iterator vp = CurrentVars.begin(); vp != CurrentVars.end(); ++vp) + mprintf(" %s=%s", vp->first.c_str(), vp->second.c_str()); + mprintf("\n"); + } Control::DoneType ret = control_[block]->CheckDone(CurrentVars); while (ret == Control::NOT_DONE) { for (Control::const_iterator it = control_[block]->begin(); @@ -545,14 +547,17 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State, Control::Varray } } } + // Print modified command and execute. for (int i = 0; i < block; i++) mprintf(" "); - mprintf("%s %s\n", modCmd.Command(), modCmd.ArgString().c_str()); + mprintf(" [%s %s]\n", modCmd.Command(), modCmd.ArgString().c_str()); if ( ExecuteCommand(State, modCmd) != CpptrajState::OK ) return 1; } } ret = control_[block]->CheckDone(CurrentVars); } if (ret == Control::ERROR) return 1; + //for (int i = 0; i < block; i++) mprintf(" "); + //mprintf("\n"); return 0; } @@ -569,21 +574,23 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& if (!control_.empty()) { // In control block. Check if current block should end. if ( control_[ctlidx_]->EndControl( cmdArg ) ) { - mprintf("DEBUG: End control block %i.\n", ctlidx_); - mprintf("CONTROL: "); + //mprintf("DEBUG: End control block %i.\n", ctlidx_); + mprintf(" BLOCK %2i: ", ctlidx_); for (int i = 0; i < ctlidx_; i++) mprintf(" "); mprintf("END\n"); ctlidx_--; if (ctlidx_ < 0) { // Outermost control structure is ended. Execute control block(s). - mprintf("DEBUG: Executing %u control block(s).\n", control_.size()); + mprintf("CONTROL: Executing %u control block(s).\n", control_.size()); if (ExecuteControlBlock(0, State, Control::Varray())) return CpptrajState::ERR; + // Control block finished, clean up for (unsigned int i = 0; i < control_.size(); i++) { - mprintf("DEBUG: %u : %u commands.\n", i, control_[i]->Ncommands()); + //mprintf("DEBUG: %u : %u commands.\n", i, control_[i]->Ncommands()); delete control_[i]; } control_.clear(); + mprintf("CONTROL: Control block finished.\n\n"); } } else { // Check if this is another control statement (silently) @@ -591,7 +598,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& if (ctlCmd.Empty()) { // Add this command to current control block. control_[ctlidx_]->AddCommand( cmdArg ); - mprintf("DEBUG: Added command '%s' to control block %i.\n", cmdArg.Command(), ctlidx_); + mprintf("\tAdded command '%s' to control block %i.\n", cmdArg.Command(), ctlidx_); } else { // Tell current block that a new block is being created control_[ctlidx_]->AddCommand(NEW_BLOCK); @@ -631,7 +638,7 @@ CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList& cmd DispatchObject* obj = cmd.Alloc(); switch (cmd.Destination()) { case Cmd::CTL: - mprintf("DEBUG: Initial control statement detected.\n"); + mprintf("CONTROL: Starting control block.\n"); if (AddControlBlock( (Control*)obj, State, cmdArg )) { delete obj; return CpptrajState::ERR; diff --git a/src/Control.cpp b/src/Control.cpp index 405117e0c5..c49fec35ba 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -9,6 +9,7 @@ void Control_For_Mask::Help() const { /** Set up each mask. */ int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { + mprintf(" Setting up 'formask' loop.\n"); Masks_.clear(); Topology* currentTop = 0; static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; @@ -65,14 +66,17 @@ int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { // Check number of values if (Niterations == -1) Niterations = (int)MH.Idxs_.size(); - else if ((int)MH.Idxs_.size() != Niterations) + else if ((int)MH.Idxs_.size() != Niterations) { mprintf("Warning: # iterations %zu != previous # iterations %i\n", MH.Idxs_.size(), Niterations); + Niterations = std::min((int)MH.Idxs_.size(), Niterations); + } if (description_ != "for ") description_.append(", "); description_.append(std::string(TypeStr[MH.varType_]) + MH.varname_ + " in " + currentMask.MaskExpression()); inMaskArg = argIn.GetStringKey("in"); } + mprintf("\tLoop will execute for %i iterations.\n", Niterations); description_.append(" do"); return 0; @@ -95,7 +99,7 @@ Control::DoneType Control_For_Mask::CheckDone(Varray& CurrentVars) { // Get variable value static const char* prefix[] = {"@", ":", "^"}; std::string maskStr = prefix[MH->varType_] + integerToString(*(MH->idx_) + 1); - mprintf("DEBUG: Control_For_Mask: %s\n", maskStr.c_str()); + //mprintf("DEBUG: Control_For_Mask: %s\n", maskStr.c_str()); // Update CurrentVars Varray::iterator it = CurrentVars.begin(); for (; it != CurrentVars.end(); ++it) { From 7c32f24025f54db57cf63c5e402154b1b4357f35 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 2 Oct 2017 09:11:38 -0400 Subject: [PATCH 23/75] DRR - Cpptraj: Switch from 'formask in' back to 'for inmask' in preparation for adding generic variables to for loop. --- src/Command.cpp | 2 +- src/Control.cpp | 14 +++++++------- src/Control.h | 6 +++--- test/Test_IRED/RunTest.sh | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 3fa8d8f2a1..9c6a6ec44e 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -370,7 +370,7 @@ void Command::Init() { Command::AddCmd( new Analysis_VectorMath(), Cmd::ANA, 1, "vectormath" ); Command::AddCmd( new Analysis_Wavelet(), Cmd::ANA, 1, "wavelet" ); // CONTROL STRUCTURES - Command::AddCmd( new Control_For_Mask(), Cmd::CTL, 1, "formask" ); + Command::AddCmd( new Control_For(), Cmd::CTL, 1, "for" ); // DEPRECATED COMMANDS Command::AddCmd( new Deprecated_AvgCoord(), Cmd::DEP, 1, "avgcoord" ); Command::AddCmd( new Deprecated_DihScan(), Cmd::DEP, 1, "dihedralscan" ); diff --git a/src/Control.cpp b/src/Control.cpp index c49fec35ba..84c4105c99 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -3,19 +3,19 @@ #include "CpptrajStdio.h" #include "StringRoutines.h" -void Control_For_Mask::Help() const { +void Control_For::Help() const { mprintf("\t{atoms|residues|molecules} in %s\n", DataSetList::TopIdxArgs); } /** Set up each mask. */ -int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { +int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { mprintf(" Setting up 'formask' loop.\n"); Masks_.clear(); Topology* currentTop = 0; static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; description_.assign("for "); - // formask {atoms|residues|molecules} inmask [TOP KEYWORDS] ... - std::string inMaskArg = argIn.GetStringKey("in"); + // for {atoms|residues|molecules} inmask [TOP KEYWORDS] ... + std::string inMaskArg = argIn.GetStringKey("inmask"); int Niterations = -1; while (!inMaskArg.empty()) { Masks_.push_back( MaskHolder() ); @@ -83,7 +83,7 @@ int Control_For_Mask::SetupControl(CpptrajState& State, ArgList& argIn) { } /** For each mask add variable to CurrentVars and initialize iterator. */ -void Control_For_Mask::Start(Varray& CurrentVars) { +void Control_For::Start(Varray& CurrentVars) { for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { MH->idx_ = MH->Idxs_.begin(); // Init CurrentVars @@ -92,14 +92,14 @@ void Control_For_Mask::Start(Varray& CurrentVars) { } /** For each mask check if done, then update CurrentVars, then increment. */ -Control::DoneType Control_For_Mask::CheckDone(Varray& CurrentVars) { +Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { // Exit as soon as one is done TODO check all? if (MH->idx_ == MH->Idxs_.end()) return DONE; // Get variable value static const char* prefix[] = {"@", ":", "^"}; std::string maskStr = prefix[MH->varType_] + integerToString(*(MH->idx_) + 1); - //mprintf("DEBUG: Control_For_Mask: %s\n", maskStr.c_str()); + //mprintf("DEBUG: Control_For: %s\n", maskStr.c_str()); // Update CurrentVars Varray::iterator it = CurrentVars.begin(); for (; it != CurrentVars.end(); ++it) { diff --git a/src/Control.h b/src/Control.h index d47e3516a6..c381aa2575 100644 --- a/src/Control.h +++ b/src/Control.h @@ -37,11 +37,11 @@ class Control : public DispatchObject { }; /// Loop over mask expression etc -class Control_For_Mask : public Control { +class Control_For : public Control { public: - Control_For_Mask() {} + Control_For() {} void Help() const; - DispatchObject* Alloc() const { return (DispatchObject*)new Control_For_Mask(); } + DispatchObject* Alloc() const { return (DispatchObject*)new Control_For(); } int SetupControl(CpptrajState&, ArgList&); bool EndControl(ArgList const& a) const { return (a.CommandIs("done")); } diff --git a/test/Test_IRED/RunTest.sh b/test/Test_IRED/RunTest.sh index c9d47df8ac..37212b7a37 100755 --- a/test/Test_IRED/RunTest.sh +++ b/test/Test_IRED/RunTest.sh @@ -13,7 +13,7 @@ TOP="1IEE_A_prot.prmtop" INPUT="ired.in" cat > $INPUT < Date: Mon, 2 Oct 2017 09:34:22 -0400 Subject: [PATCH 24/75] DRR - Cpptraj: Reorganize argument parsing loop in preparation for supporting different for loop types --- src/Control.cpp | 131 +++++++++++++++++++++----------------- test/Test_IRED/RunTest.sh | 2 +- 2 files changed, 75 insertions(+), 58 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 84c4105c99..2f30b31c1c 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -9,75 +9,92 @@ void Control_For::Help() const { /** Set up each mask. */ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { - mprintf(" Setting up 'formask' loop.\n"); + mprintf(" Setting up 'for' loop.\n"); Masks_.clear(); Topology* currentTop = 0; static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; - description_.assign("for "); - // for {atoms|residues|molecules} inmask [TOP KEYWORDS] ... - std::string inMaskArg = argIn.GetStringKey("inmask"); + description_.assign("for ("); + // [=;;[]] int Niterations = -1; - while (!inMaskArg.empty()) { - Masks_.push_back( MaskHolder() ); - MaskHolder& MH = Masks_.back(); - AtomMask currentMask; - if (currentMask.SetMaskString( inMaskArg )) return 1; - if (argIn.hasKey("atoms")) MH.varType_ = ATOMS; - else if (argIn.hasKey("residues")) MH.varType_ = RESIDUES; - else if (argIn.hasKey("molecules")) MH.varType_ = MOLECULES; - if (MH.varType_ == UNKNOWN) { + int iarg = 0; + while (iarg < argIn.Nargs()) + { + // Advance to next unmarked argument. + while (argIn.Marked(iarg) && iarg < argIn.Nargs()) iarg++; + if (iarg == argIn.Nargs()) break; + // Determine 'for' type + ForType ftype = UNKNOWN; + if ( argIn[iarg] == "atoms" ) ftype = ATOMS; + else if ( argIn[iarg] == "residues" ) ftype = RESIDUES; + else if ( argIn[iarg] == "molecules" ) ftype = MOLECULES; + if (ftype == UNKNOWN) { mprinterr("Error: One of {atoms|residues|molecules} not specfied.\n"); return 1; } - Topology* top = State.DSL().GetTopByIndex( argIn ); - if (top != 0) currentTop = top; - if (currentTop == 0) return 1; - MH.varname_ = argIn.GetStringNext(); - if (MH.varname_.empty()) { - mprinterr("Error: 'for inmask': missing variable name.\n"); - return 1; - } - MH.varname_ = "$" + MH.varname_; - if (currentTop->SetupIntegerMask( currentMask )) return 1; - currentMask.MaskInfo(); - if (currentMask.None()) return 1; - // Set up indices - if (MH.varType_ == ATOMS) - MH.Idxs_ = currentMask.Selected(); - else if (MH.varType_ == RESIDUES) { - int curRes = -1; - for (AtomMask::const_iterator at = currentMask.begin(); at != currentMask.end(); ++at) { - int res = (*currentTop)[*at].ResNum(); - if (res != curRes) { - MH.Idxs_.push_back( res ); - curRes = res; - } + argIn.MarkArg(iarg); + // Set up for specific type + if (ftype == ATOMS || ftype == RESIDUES || ftype == MOLECULES) + { + // {atoms|residues|molecules} inmask [TOP KEYWORDS] + if (argIn[iarg+2] != "inmask") { + mprinterr("Error: Expected 'inmask', got %s\n", argIn[iarg+2].c_str()); + return 1; + } + Masks_.push_back( MaskHolder() ); + MaskHolder& MH = Masks_.back(); + AtomMask currentMask; + if (currentMask.SetMaskString( argIn.GetStringKey("inmask") )) return 1; + MH.varType_ = ftype; + Topology* top = State.DSL().GetTopByIndex( argIn ); + if (top != 0) currentTop = top; + if (currentTop == 0) return 1; + MH.varname_ = argIn.GetStringNext(); + if (MH.varname_.empty()) { + mprinterr("Error: 'for inmask': missing variable name.\n"); + return 1; } - } else if (MH.varType_ == MOLECULES) { - int curMol = -1; - for (AtomMask::const_iterator at = currentMask.begin(); at != currentMask.end(); ++at) { - int mol = (*currentTop)[*at].MolNum(); - if (mol != curMol) { - MH.Idxs_.push_back( mol ); - curMol = mol; + MH.varname_ = "$" + MH.varname_; + // Set up mask + if (currentTop->SetupIntegerMask( currentMask )) return 1; + currentMask.MaskInfo(); + if (currentMask.None()) return 1; + // Set up indices + if (MH.varType_ == ATOMS) + MH.Idxs_ = currentMask.Selected(); + else if (MH.varType_ == RESIDUES) { + int curRes = -1; + for (AtomMask::const_iterator at = currentMask.begin(); at != currentMask.end(); ++at) { + int res = (*currentTop)[*at].ResNum(); + if (res != curRes) { + MH.Idxs_.push_back( res ); + curRes = res; + } + } + } else if (MH.varType_ == MOLECULES) { + int curMol = -1; + for (AtomMask::const_iterator at = currentMask.begin(); at != currentMask.end(); ++at) { + int mol = (*currentTop)[*at].MolNum(); + if (mol != curMol) { + MH.Idxs_.push_back( mol ); + curMol = mol; + } } } - } - // Check number of values - if (Niterations == -1) - Niterations = (int)MH.Idxs_.size(); - else if ((int)MH.Idxs_.size() != Niterations) { - mprintf("Warning: # iterations %zu != previous # iterations %i\n", - MH.Idxs_.size(), Niterations); - Niterations = std::min((int)MH.Idxs_.size(), Niterations); - } - if (description_ != "for ") description_.append(", "); - description_.append(std::string(TypeStr[MH.varType_]) + - MH.varname_ + " in " + currentMask.MaskExpression()); - inMaskArg = argIn.GetStringKey("in"); + // Check number of values + if (Niterations == -1) + Niterations = (int)MH.Idxs_.size(); + else if ((int)MH.Idxs_.size() != Niterations) { + mprintf("Warning: # iterations %zu != previous # iterations %i\n", + MH.Idxs_.size(), Niterations); + Niterations = std::min((int)MH.Idxs_.size(), Niterations); + } + if (description_ != "for (") description_.append(", "); + description_.append(std::string(TypeStr[MH.varType_]) + + MH.varname_ + " inmask " + currentMask.MaskExpression()); + } // END for mask setup } mprintf("\tLoop will execute for %i iterations.\n", Niterations); - description_.append(" do"); + description_.append(") do"); return 0; } diff --git a/test/Test_IRED/RunTest.sh b/test/Test_IRED/RunTest.sh index 37212b7a37..46389a5a4a 100755 --- a/test/Test_IRED/RunTest.sh +++ b/test/Test_IRED/RunTest.sh @@ -13,7 +13,7 @@ TOP="1IEE_A_prot.prmtop" INPUT="ired.in" cat > $INPUT < Date: Mon, 2 Oct 2017 09:35:39 -0400 Subject: [PATCH 25/75] DRR - Cpptraj: Niterations => MaxIterations --- src/Control.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 2f30b31c1c..041668f4a6 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -15,7 +15,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; description_.assign("for ("); // [=;;[]] - int Niterations = -1; + int MaxIterations = -1; int iarg = 0; while (iarg < argIn.Nargs()) { @@ -81,19 +81,19 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } } // Check number of values - if (Niterations == -1) - Niterations = (int)MH.Idxs_.size(); - else if ((int)MH.Idxs_.size() != Niterations) { + if (MaxIterations == -1) + MaxIterations = (int)MH.Idxs_.size(); + else if ((int)MH.Idxs_.size() != MaxIterations) { mprintf("Warning: # iterations %zu != previous # iterations %i\n", - MH.Idxs_.size(), Niterations); - Niterations = std::min((int)MH.Idxs_.size(), Niterations); + MH.Idxs_.size(), MaxIterations); + MaxIterations = std::min((int)MH.Idxs_.size(), MaxIterations); } if (description_ != "for (") description_.append(", "); description_.append(std::string(TypeStr[MH.varType_]) + MH.varname_ + " inmask " + currentMask.MaskExpression()); } // END for mask setup } - mprintf("\tLoop will execute for %i iterations.\n", Niterations); + mprintf("\tLoop will execute for %i iterations.\n", MaxIterations); description_.append(") do"); return 0; From 45fa18d6cb7c5008db0fb2d0b6cc5bf8fab07304 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 2 Oct 2017 09:40:32 -0400 Subject: [PATCH 26/75] DRR - Cpptraj: Generalize # iterations check --- src/Control.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 041668f4a6..84b81a0ab8 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -32,6 +32,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { return 1; } argIn.MarkArg(iarg); + int Niterations = -1; // Set up for specific type if (ftype == ATOMS || ftype == RESIDUES || ftype == MOLECULES) { @@ -80,18 +81,19 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } } } - // Check number of values - if (MaxIterations == -1) - MaxIterations = (int)MH.Idxs_.size(); - else if ((int)MH.Idxs_.size() != MaxIterations) { - mprintf("Warning: # iterations %zu != previous # iterations %i\n", - MH.Idxs_.size(), MaxIterations); - MaxIterations = std::min((int)MH.Idxs_.size(), MaxIterations); - } + Niterations = (int)MH.Idxs_.size(); if (description_ != "for (") description_.append(", "); description_.append(std::string(TypeStr[MH.varType_]) + MH.varname_ + " inmask " + currentMask.MaskExpression()); } // END for mask setup + // Check number of values + if (MaxIterations == -1) + MaxIterations = Niterations; + else if (Niterations != MaxIterations) { + mprintf("Warning: # iterations %i != previous # iterations %i\n", + Niterations, MaxIterations); + MaxIterations = std::min(Niterations, MaxIterations); + } } mprintf("\tLoop will execute for %i iterations.\n", MaxIterations); description_.append(") do"); From cefcd894c58db7f179660e01b24d07de7c7d9332 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 2 Oct 2017 12:08:52 -0400 Subject: [PATCH 27/75] DRR - Cpptraj: Initial incarnation of the generic integer for loop variable type --- src/Control.cpp | 96 ++++++++++++++++++++++++++++++++++++++++++++++--- src/Control.h | 10 +++++- 2 files changed, 101 insertions(+), 5 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 84b81a0ab8..5961999231 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -14,7 +14,6 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { Topology* currentTop = 0; static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; description_.assign("for ("); - // [=;;[]] int MaxIterations = -1; int iarg = 0; while (iarg < argIn.Nargs()) @@ -27,11 +26,15 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { if ( argIn[iarg] == "atoms" ) ftype = ATOMS; else if ( argIn[iarg] == "residues" ) ftype = RESIDUES; else if ( argIn[iarg] == "molecules" ) ftype = MOLECULES; + else if ( argIn[iarg].find(";") != std::string::npos ) + ftype = VARIABLE; if (ftype == UNKNOWN) { mprinterr("Error: One of {atoms|residues|molecules} not specfied.\n"); return 1; } argIn.MarkArg(iarg); + Masks_.push_back( MaskHolder() ); + MaskHolder& MH = Masks_.back(); int Niterations = -1; // Set up for specific type if (ftype == ATOMS || ftype == RESIDUES || ftype == MOLECULES) @@ -41,8 +44,6 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { mprinterr("Error: Expected 'inmask', got %s\n", argIn[iarg+2].c_str()); return 1; } - Masks_.push_back( MaskHolder() ); - MaskHolder& MH = Masks_.back(); AtomMask currentMask; if (currentMask.SetMaskString( argIn.GetStringKey("inmask") )) return 1; MH.varType_ = ftype; @@ -85,7 +86,92 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { if (description_ != "for (") description_.append(", "); description_.append(std::string(TypeStr[MH.varType_]) + MH.varname_ + " inmask " + currentMask.MaskExpression()); - } // END for mask setup + } else if (ftype == VARIABLE) { + // [=;;[]] + ArgList varArg( argIn[iarg], ";" ); + if (varArg.Nargs() != 3) { + mprinterr("Error: Malformed 'for' loop variable.\n" + "Error: Expected '[=;;[]]'\n" + "Error: Got '%s'\n", argIn[iarg].c_str()); + return 1; + } + // First argument: = + ArgList startArg( varArg[0], "=" ); + if (startArg.Nargs() != 2) { + mprinterr("Error: Malformed 'start' argument.\n" + "Error: Expected =, got '%s'\n", varArg[0].c_str()); + return 1; + } + MH.varname_ = startArg[0]; + if (!validInteger(startArg[1])) { + if (startArg[1][0] != '$') { + mprinterr("Error: Expected start argument to be integer or variable.\n"); + return 1; + } + MH.startArg_ = startArg[1]; + } else + MH.start_ = convertToInteger(startArg[1]); + // Second argument: + size_t pos0 = MH.varname_.size(); + size_t pos1 = pos0 + 1; + MH.endOp_ = NO_OP; + if ( varArg[1][pos0] == '<' ) + MH.endOp_ = LESS_THAN; + else if (varArg[1][pos0] == '>') + MH.endOp_ = GREATER_THAN; + if (MH.endOp_ == NO_OP) { + mprinterr("Error: Unrecognized op: '%s'\n", varArg[1].substr(pos0, pos1-pos0).c_str()); + return 1; + } + std::string endStr = varArg[1].substr(pos1); + if (!validInteger(endStr)) { + if (endStr[0] != '$') { + mprinterr("Error: Expected end argument to be integer or variable.\n"); + return 1; + } + MH.endArg_ = endStr; + } else + MH.end_ = convertToInteger(endStr); + // Third argument: [] + pos1 = pos0 + 2; + MH.incOp_ = NO_OP; + bool needValue = false; + if ( varArg[2][pos0] == '+' ) { + if (varArg[2][pos0+1] == '+') { + MH.incOp_ = INCREMENT; + MH.val_ = 1; + } else if (varArg[2][pos0+1] == '=') { + MH.incOp_ = INCREMENT; + needValue = true; + } + } else if ( varArg[2][pos0] == '-' ) { + if (varArg[2][pos0+1] == '-' ) { + MH.incOp_ = DECREMENT; + MH.val_ = 1; + } else if (varArg[2][pos0+1] == '=') { + MH.incOp_ = DECREMENT; + needValue = true; + } + } + if (MH.incOp_ == NO_OP) { + mprinterr("Error: Unrecognized op: '%s'\n", varArg[2].substr(pos0, pos1-pos0).c_str()); + return 1; + } + if (needValue) { + std::string incStr = varArg[2].substr(pos1); + if (!validInteger(incStr)) { + mprinterr("Error: increment value is not a valid integer.\n"); + return 1; + } + MH.val_ = convertToInteger(incStr); + } + if (MH.incOp_ == DECREMENT) + MH.val_ = -MH.val_; + // DEBUG + mprintf("DEBUG: start=%i endOp=%i end=%i incOp=%i val=%i startArg=%s endArg=%s\n", + MH.start_, (int)MH.endOp_, MH.end_, (int)MH.incOp_, MH.val_, + MH.startArg_.c_str(), MH.endArg_.c_str()); + } // Check number of values if (MaxIterations == -1) MaxIterations = Niterations; @@ -96,6 +182,8 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } } mprintf("\tLoop will execute for %i iterations.\n", MaxIterations); + if (MaxIterations < 1) + mprintf("Warning: Loop has less than 1 iteration.\n"); description_.append(") do"); return 0; diff --git a/src/Control.h b/src/Control.h index c381aa2575..9f200a4958 100644 --- a/src/Control.h +++ b/src/Control.h @@ -53,7 +53,8 @@ class Control_For : public Control { void Start(Varray&); DoneType CheckDone(Varray&); private: - enum ForType {ATOMS=0, RESIDUES, MOLECULES, UNKNOWN}; + enum ForType {ATOMS=0, RESIDUES, MOLECULES, VARIABLE, UNKNOWN}; + enum OpType { INCREMENT, DECREMENT, LESS_THAN, GREATER_THAN, NO_OP }; typedef std::vector Iarray; class MaskHolder { public: @@ -62,6 +63,13 @@ class Control_For : public Control { Iarray::const_iterator idx_; ///< Hold current atom/residue/molecule index std::string varname_; ForType varType_; + OpType endOp_; + OpType incOp_; + int start_; + int end_; + int val_; + std::string startArg_; + std::string endArg_; }; typedef std::vector Marray; Marray Masks_; From f09fb56d4f247bb9e06863974d47d07ac9e36029 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 2 Oct 2017 12:19:36 -0400 Subject: [PATCH 28/75] DRR - Cpptraj: Add description --- src/Control.cpp | 23 ++++++++++++++++++++--- src/Control.h | 2 +- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 5961999231..edc7a89f10 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -13,6 +13,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { Masks_.clear(); Topology* currentTop = 0; static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; + static const char* OpStr[] = {"+=", "-=", "<", ">"}; description_.assign("for ("); int MaxIterations = -1; int iarg = 0; @@ -27,7 +28,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { else if ( argIn[iarg] == "residues" ) ftype = RESIDUES; else if ( argIn[iarg] == "molecules" ) ftype = MOLECULES; else if ( argIn[iarg].find(";") != std::string::npos ) - ftype = VARIABLE; + ftype = INTEGER; if (ftype == UNKNOWN) { mprinterr("Error: One of {atoms|residues|molecules} not specfied.\n"); return 1; @@ -37,6 +38,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { MaskHolder& MH = Masks_.back(); int Niterations = -1; // Set up for specific type + if (description_ != "for (") description_.append(", "); if (ftype == ATOMS || ftype == RESIDUES || ftype == MOLECULES) { // {atoms|residues|molecules} inmask [TOP KEYWORDS] @@ -83,10 +85,9 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } } Niterations = (int)MH.Idxs_.size(); - if (description_ != "for (") description_.append(", "); description_.append(std::string(TypeStr[MH.varType_]) + MH.varname_ + " inmask " + currentMask.MaskExpression()); - } else if (ftype == VARIABLE) { + } else if (ftype == INTEGER) { // [=;;[]] ArgList varArg( argIn[iarg], ";" ); if (varArg.Nargs() != 3) { @@ -165,6 +166,22 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } MH.val_ = convertToInteger(incStr); } + // Description + MH.varname_ = "$" + MH.varname_; + std::string sval, eval; + if (MH.startArg_.empty()) + sval = integerToString(MH.start_); + else + sval = MH.startArg_; + if (MH.endArg_.empty()) + eval = integerToString(MH.end_); + else + eval = MH.endArg_; + description_.append("(" + MH.varname_ + "=" + sval + "; " + + MH.varname_ + std::string(OpStr[MH.endOp_]) + eval + "; " + + MH.varname_ + std::string(OpStr[MH.incOp_]) + + integerToString(MH.val_) + ")"); + // If decrementing just negate value if (MH.incOp_ == DECREMENT) MH.val_ = -MH.val_; // DEBUG diff --git a/src/Control.h b/src/Control.h index 9f200a4958..8eed39937f 100644 --- a/src/Control.h +++ b/src/Control.h @@ -53,7 +53,7 @@ class Control_For : public Control { void Start(Varray&); DoneType CheckDone(Varray&); private: - enum ForType {ATOMS=0, RESIDUES, MOLECULES, VARIABLE, UNKNOWN}; + enum ForType {ATOMS=0, RESIDUES, MOLECULES, INTEGER, UNKNOWN}; enum OpType { INCREMENT, DECREMENT, LESS_THAN, GREATER_THAN, NO_OP }; typedef std::vector Iarray; class MaskHolder { From 10418af188f72f419a1e9b053949fa9aaa1464a0 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 2 Oct 2017 14:10:34 -0400 Subject: [PATCH 29/75] DRR - Cpptraj: Enable integer for loop. Allow variable to start after beginning of argument. --- src/Command.cpp | 17 ++++++++++---- src/Control.cpp | 62 ++++++++++++++++++++++++++++++++++--------------- src/Control.h | 3 ++- 3 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 9c6a6ec44e..f93a792dcf 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -535,13 +535,20 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State, Control::Varray // Replace variable names in command with entries from CurrentVars ArgList modCmd = *it; for (int n = 0; n < modCmd.Nargs(); n++) { - if (modCmd[n][0] == '$') { + size_t pos = modCmd[n].find("$"); + if (pos != std::string::npos) { + // Argument is/contains a variable. + std::string var_in_arg = modCmd[n].substr(pos); + // See if variable occurs in CurrentVars Control::Varray::const_iterator vp = CurrentVars.begin(); for (; vp != CurrentVars.end(); ++vp) - if (vp->first == modCmd[n]) break; - if (vp != CurrentVars.end()) - modCmd.ChangeArg(n, vp->second); - else { + if (vp->first == var_in_arg) break; + // If found replace with value from CurrentVars + if (vp != CurrentVars.end()) { + std::string arg = modCmd[n]; + arg.replace(pos, vp->first.size(), vp->second); + modCmd.ChangeArg(n, arg); + } else { mprinterr("Error: Unrecognized variable in command: %s\n", modCmd[n].c_str()); return 1; } diff --git a/src/Control.cpp b/src/Control.cpp index edc7a89f10..ae2f6aa9fc 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -89,6 +89,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { MH.varname_ + " inmask " + currentMask.MaskExpression()); } else if (ftype == INTEGER) { // [=;;[]] + MH.varType_ = ftype; ArgList varArg( argIn[iarg], ";" ); if (varArg.Nargs() != 3) { mprinterr("Error: Malformed 'for' loop variable.\n" @@ -140,7 +141,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { if ( varArg[2][pos0] == '+' ) { if (varArg[2][pos0+1] == '+') { MH.incOp_ = INCREMENT; - MH.val_ = 1; + MH.inc_ = 1; } else if (varArg[2][pos0+1] == '=') { MH.incOp_ = INCREMENT; needValue = true; @@ -148,7 +149,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } else if ( varArg[2][pos0] == '-' ) { if (varArg[2][pos0+1] == '-' ) { MH.incOp_ = DECREMENT; - MH.val_ = 1; + MH.inc_ = 1; } else if (varArg[2][pos0+1] == '=') { MH.incOp_ = DECREMENT; needValue = true; @@ -164,7 +165,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { mprinterr("Error: increment value is not a valid integer.\n"); return 1; } - MH.val_ = convertToInteger(incStr); + MH.inc_ = convertToInteger(incStr); } // Description MH.varname_ = "$" + MH.varname_; @@ -180,13 +181,13 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { description_.append("(" + MH.varname_ + "=" + sval + "; " + MH.varname_ + std::string(OpStr[MH.endOp_]) + eval + "; " + MH.varname_ + std::string(OpStr[MH.incOp_]) + - integerToString(MH.val_) + ")"); + integerToString(MH.inc_) + ")"); // If decrementing just negate value if (MH.incOp_ == DECREMENT) - MH.val_ = -MH.val_; + MH.inc_ = -MH.inc_; // DEBUG mprintf("DEBUG: start=%i endOp=%i end=%i incOp=%i val=%i startArg=%s endArg=%s\n", - MH.start_, (int)MH.endOp_, MH.end_, (int)MH.incOp_, MH.val_, + MH.start_, (int)MH.endOp_, MH.end_, (int)MH.incOp_, MH.inc_, MH.startArg_.c_str(), MH.endArg_.c_str()); } // Check number of values @@ -209,30 +210,53 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { /** For each mask add variable to CurrentVars and initialize iterator. */ void Control_For::Start(Varray& CurrentVars) { for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { - MH->idx_ = MH->Idxs_.begin(); + if (MH->varType_ == INTEGER) + MH->currentVal_ = MH->start_; // TODO search currentvars + else + MH->idx_ = MH->Idxs_.begin(); // Init CurrentVars CurrentVars.push_back( VarPair(MH->varname_, "") ); } } +static inline void UpdateCurrentVars(Control::Varray& CurrentVars, std::string const& varname, + std::string const& value) +{ + //mprintf("DEBUG: UpdateCurrentVars: %s = %s\n", varname.c_str(), value.c_str()); + Control::Varray::iterator it = CurrentVars.begin(); + for (; it != CurrentVars.end(); ++it) { + if (it->first == varname) { + it->second = value; + break; + } + } +} + /** For each mask check if done, then update CurrentVars, then increment. */ Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { + static const char* prefix[] = {"@", ":", "^"}; for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { // Exit as soon as one is done TODO check all? - if (MH->idx_ == MH->Idxs_.end()) return DONE; - // Get variable value - static const char* prefix[] = {"@", ":", "^"}; - std::string maskStr = prefix[MH->varType_] + integerToString(*(MH->idx_) + 1); - //mprintf("DEBUG: Control_For: %s\n", maskStr.c_str()); - // Update CurrentVars - Varray::iterator it = CurrentVars.begin(); - for (; it != CurrentVars.end(); ++it) { - if (it->first == MH->varname_) { - it->second = maskStr; - break; + if (MH->varType_ == INTEGER) { + if (MH->endOp_ == LESS_THAN) { + if (MH->currentVal_ >= MH->end_) return DONE; + } else if (MH->endOp_ == GREATER_THAN) { + if (MH->currentVal_ <= MH->end_) return DONE; } + // Get variable value and update CurrentVars + UpdateCurrentVars(CurrentVars, MH->varname_, integerToString( MH->currentVal_ )); + // Increment + MH->currentVal_ += MH->inc_; + } else { + if (MH->idx_ == MH->Idxs_.end()) return DONE; + // Get variable value + std::string maskStr = prefix[MH->varType_] + integerToString(*(MH->idx_) + 1); + //mprintf("DEBUG: Control_For: %s\n", maskStr.c_str()); + // Update CurrentVars + UpdateCurrentVars(CurrentVars, MH->varname_, maskStr); + // Increment + ++(MH->idx_); } - ++(MH->idx_); } return NOT_DONE; } diff --git a/src/Control.h b/src/Control.h index 8eed39937f..a44a97faf7 100644 --- a/src/Control.h +++ b/src/Control.h @@ -67,7 +67,8 @@ class Control_For : public Control { OpType incOp_; int start_; int end_; - int val_; + int inc_; + int currentVal_; std::string startArg_; std::string endArg_; }; From 4a6320febde1f4afb38219d70def789870af3af5 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 2 Oct 2017 14:13:02 -0400 Subject: [PATCH 30/75] DRR - Cpptraj: Test using integer for variable in data set name --- test/Test_IRED/RunTest.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Test_IRED/RunTest.sh b/test/Test_IRED/RunTest.sh index 46389a5a4a..b2c05472f6 100755 --- a/test/Test_IRED/RunTest.sh +++ b/test/Test_IRED/RunTest.sh @@ -13,8 +13,8 @@ TOP="1IEE_A_prot.prmtop" INPUT="ired.in" cat > $INPUT < Date: Mon, 2 Oct 2017 15:07:51 -0400 Subject: [PATCH 31/75] DRR - Cpptraj: Add range checks. Calculate number of iterations for integer loop. --- src/Control.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index ae2f6aa9fc..3415d38cc0 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -166,6 +166,10 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { return 1; } MH.inc_ = convertToInteger(incStr); + if (MH.inc_ < 1) { + mprinterr("Error: Extra '-' detected in increment.\n"); + return 1; + } } // Description MH.varname_ = "$" + MH.varname_; @@ -178,6 +182,27 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { eval = integerToString(MH.end_); else eval = MH.endArg_; + // Check end > start for increment, start > end for decrement + int maxval, minval; + if (MH.incOp_ == INCREMENT) { + if (MH.start_ >= MH.end_) { + mprinterr("Error: start must be less than end for increment.\n"); + return 1; + } + minval = MH.start_; + maxval = MH.end_; + } else { + if (MH.end_ >= MH.start_) { + mprinterr("Error: end must be less than start for decrement.\n"); + return 1; + } + minval = MH.end_; + maxval = MH.start_; + } + // Figure out number of iterations + Niterations = (maxval - minval) / MH.inc_; + if (((maxval-minval) % MH.inc_) > 0) Niterations++; + // Update description description_.append("(" + MH.varname_ + "=" + sval + "; " + MH.varname_ + std::string(OpStr[MH.endOp_]) + eval + "; " + MH.varname_ + std::string(OpStr[MH.incOp_]) + @@ -200,8 +225,10 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } } mprintf("\tLoop will execute for %i iterations.\n", MaxIterations); - if (MaxIterations < 1) - mprintf("Warning: Loop has less than 1 iteration.\n"); + if (MaxIterations < 1) { + mprinterr("Error: Loop has less than 1 iteration.\n"); + return 1; + } description_.append(") do"); return 0; From e948e985147869b31ca46f54743bceab0076886f Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 2 Oct 2017 15:24:56 -0400 Subject: [PATCH 32/75] DRR - Cpptraj: Allow integer loop without end condition as long as there is at least one end condition in the block --- src/Control.cpp | 112 ++++++++++++++++++++++++++---------------------- 1 file changed, 60 insertions(+), 52 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 3415d38cc0..e21f2021d2 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -91,7 +91,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { // [=;;[]] MH.varType_ = ftype; ArgList varArg( argIn[iarg], ";" ); - if (varArg.Nargs() != 3) { + if (varArg.Nargs() < 2 || varArg.Nargs() > 3) { mprinterr("Error: Malformed 'for' loop variable.\n" "Error: Expected '[=;;[]]'\n" "Error: Got '%s'\n", argIn[iarg].c_str()); @@ -117,50 +117,56 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { size_t pos0 = MH.varname_.size(); size_t pos1 = pos0 + 1; MH.endOp_ = NO_OP; - if ( varArg[1][pos0] == '<' ) - MH.endOp_ = LESS_THAN; - else if (varArg[1][pos0] == '>') - MH.endOp_ = GREATER_THAN; - if (MH.endOp_ == NO_OP) { - mprinterr("Error: Unrecognized op: '%s'\n", varArg[1].substr(pos0, pos1-pos0).c_str()); - return 1; - } - std::string endStr = varArg[1].substr(pos1); - if (!validInteger(endStr)) { - if (endStr[0] != '$') { - mprinterr("Error: Expected end argument to be integer or variable.\n"); + int iargIdx = 1; + if (varArg.Nargs() == 3) { + iargIdx = 2; + if ( varArg[1][pos0] == '<' ) + MH.endOp_ = LESS_THAN; + else if (varArg[1][pos0] == '>') + MH.endOp_ = GREATER_THAN; + if (MH.endOp_ == NO_OP) { + mprinterr("Error: Unrecognized end op: '%s'\n", + varArg[1].substr(pos0, pos1-pos0).c_str()); return 1; } - MH.endArg_ = endStr; - } else - MH.end_ = convertToInteger(endStr); + std::string endStr = varArg[1].substr(pos1); + if (!validInteger(endStr)) { + if (endStr[0] != '$') { + mprinterr("Error: Expected end argument to be integer or variable.\n"); + return 1; + } + MH.endArg_ = endStr; + } else + MH.end_ = convertToInteger(endStr); + } // Third argument: [] pos1 = pos0 + 2; MH.incOp_ = NO_OP; bool needValue = false; - if ( varArg[2][pos0] == '+' ) { - if (varArg[2][pos0+1] == '+') { + if ( varArg[iargIdx][pos0] == '+' ) { + if (varArg[iargIdx][pos0+1] == '+') { MH.incOp_ = INCREMENT; MH.inc_ = 1; - } else if (varArg[2][pos0+1] == '=') { + } else if (varArg[iargIdx][pos0+1] == '=') { MH.incOp_ = INCREMENT; needValue = true; } - } else if ( varArg[2][pos0] == '-' ) { - if (varArg[2][pos0+1] == '-' ) { + } else if ( varArg[iargIdx][pos0] == '-' ) { + if (varArg[iargIdx][pos0+1] == '-' ) { MH.incOp_ = DECREMENT; MH.inc_ = 1; - } else if (varArg[2][pos0+1] == '=') { + } else if (varArg[iargIdx][pos0+1] == '=') { MH.incOp_ = DECREMENT; needValue = true; } } if (MH.incOp_ == NO_OP) { - mprinterr("Error: Unrecognized op: '%s'\n", varArg[2].substr(pos0, pos1-pos0).c_str()); + mprinterr("Error: Unrecognized increment op: '%s'\n", + varArg[iargIdx].substr(pos0, pos1-pos0).c_str()); return 1; } if (needValue) { - std::string incStr = varArg[2].substr(pos1); + std::string incStr = varArg[iargIdx].substr(pos1); if (!validInteger(incStr)) { mprinterr("Error: increment value is not a valid integer.\n"); return 1; @@ -178,35 +184,37 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { sval = integerToString(MH.start_); else sval = MH.startArg_; - if (MH.endArg_.empty()) - eval = integerToString(MH.end_); - else - eval = MH.endArg_; - // Check end > start for increment, start > end for decrement - int maxval, minval; - if (MH.incOp_ == INCREMENT) { - if (MH.start_ >= MH.end_) { - mprinterr("Error: start must be less than end for increment.\n"); - return 1; - } - minval = MH.start_; - maxval = MH.end_; - } else { - if (MH.end_ >= MH.start_) { - mprinterr("Error: end must be less than start for decrement.\n"); - return 1; + description_.append("(" + MH.varname_ + "=" + sval + "; "); + if (iargIdx == 2) { + // End argument present + if (MH.endArg_.empty()) + eval = integerToString(MH.end_); + else + eval = MH.endArg_; + description_.append(MH.varname_ + std::string(OpStr[MH.endOp_]) + eval + "; "); + // Check end > start for increment, start > end for decrement + int maxval, minval; + if (MH.incOp_ == INCREMENT) { + if (MH.start_ >= MH.end_) { + mprinterr("Error: start must be less than end for increment.\n"); + return 1; + } + minval = MH.start_; + maxval = MH.end_; + } else { + if (MH.end_ >= MH.start_) { + mprinterr("Error: end must be less than start for decrement.\n"); + return 1; + } + minval = MH.end_; + maxval = MH.start_; } - minval = MH.end_; - maxval = MH.start_; + // Figure out number of iterations + Niterations = (maxval - minval) / MH.inc_; + if (((maxval-minval) % MH.inc_) > 0) Niterations++; } - // Figure out number of iterations - Niterations = (maxval - minval) / MH.inc_; - if (((maxval-minval) % MH.inc_) > 0) Niterations++; - // Update description - description_.append("(" + MH.varname_ + "=" + sval + "; " + - MH.varname_ + std::string(OpStr[MH.endOp_]) + eval + "; " + - MH.varname_ + std::string(OpStr[MH.incOp_]) + - integerToString(MH.inc_) + ")"); + description_.append( MH.varname_ + std::string(OpStr[MH.incOp_]) + + integerToString(MH.inc_) + ")" ); // If decrementing just negate value if (MH.incOp_ == DECREMENT) MH.inc_ = -MH.inc_; @@ -218,7 +226,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { // Check number of values if (MaxIterations == -1) MaxIterations = Niterations; - else if (Niterations != MaxIterations) { + else if (Niterations != -1 && Niterations != MaxIterations) { mprintf("Warning: # iterations %i != previous # iterations %i\n", Niterations, MaxIterations); MaxIterations = std::min(Niterations, MaxIterations); From bafe82cb7d52f388623d2df84ed3d36715f28538 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 2 Oct 2017 15:26:04 -0400 Subject: [PATCH 33/75] DRR - Cpptraj: Update input, no longer need end condition --- test/Test_IRED/RunTest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Test_IRED/RunTest.sh b/test/Test_IRED/RunTest.sh index b2c05472f6..fae58cd0ac 100755 --- a/test/Test_IRED/RunTest.sh +++ b/test/Test_IRED/RunTest.sh @@ -13,7 +13,7 @@ TOP="1IEE_A_prot.prmtop" INPUT="ired.in" cat > $INPUT < Date: Mon, 2 Oct 2017 15:30:35 -0400 Subject: [PATCH 34/75] DRR - Cpptraj: Fix up help --- src/Control.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index e21f2021d2..db0b074e38 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -4,7 +4,9 @@ #include "StringRoutines.h" void Control_For::Help() const { - mprintf("\t{atoms|residues|molecules} in %s\n", DataSetList::TopIdxArgs); + mprintf("\t[ {atoms|residues|molecules} inmask %s ...\n" + "\t =;[;][] ... ]\n", + DataSetList::TopIdxArgs); } /** Set up each mask. */ @@ -39,6 +41,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { int Niterations = -1; // Set up for specific type if (description_ != "for (") description_.append(", "); + // ------------------------------------------- if (ftype == ATOMS || ftype == RESIDUES || ftype == MOLECULES) { // {atoms|residues|molecules} inmask [TOP KEYWORDS] @@ -87,13 +90,14 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { Niterations = (int)MH.Idxs_.size(); description_.append(std::string(TypeStr[MH.varType_]) + MH.varname_ + " inmask " + currentMask.MaskExpression()); + // ------------------------------------------- } else if (ftype == INTEGER) { - // [=;;[]] + // [=;[;][]] MH.varType_ = ftype; ArgList varArg( argIn[iarg], ";" ); if (varArg.Nargs() < 2 || varArg.Nargs() > 3) { mprinterr("Error: Malformed 'for' loop variable.\n" - "Error: Expected '[=;;[]]'\n" + "Error: Expected '[=;[;][]]'\n" "Error: Got '%s'\n", argIn[iarg].c_str()); return 1; } From db7f86a8e50344e14747236b77f03cf3887028a9 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 2 Oct 2017 15:41:15 -0400 Subject: [PATCH 35/75] DRR - Cpptraj: Better variable name recognition in input --- src/Command.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index f93a792dcf..b23e0d18de 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -1,3 +1,4 @@ +#include // isalnum #include #include // std::sort() #include "Command.h" @@ -537,8 +538,11 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State, Control::Varray for (int n = 0; n < modCmd.Nargs(); n++) { size_t pos = modCmd[n].find("$"); if (pos != std::string::npos) { - // Argument is/contains a variable. - std::string var_in_arg = modCmd[n].substr(pos); + // Argument is/contains a variable. Find first non-alphanumeric char + size_t len = 1; + for (size_t pos1 = pos+1; pos1 < modCmd[n].size(); pos1++, len++) + if (!isalnum(modCmd[n][pos1])) break; + std::string var_in_arg = modCmd[n].substr(pos, len); // See if variable occurs in CurrentVars Control::Varray::const_iterator vp = CurrentVars.begin(); for (; vp != CurrentVars.end(); ++vp) @@ -549,7 +553,7 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State, Control::Varray arg.replace(pos, vp->first.size(), vp->second); modCmd.ChangeArg(n, arg); } else { - mprinterr("Error: Unrecognized variable in command: %s\n", modCmd[n].c_str()); + mprinterr("Error: Unrecognized variable in command: %s\n", var_in_arg.c_str()); return 1; } } From c91697408d8ce227b7a99ffae82147a3fc9de635 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 2 Oct 2017 15:48:08 -0400 Subject: [PATCH 36/75] DRR - Cpptraj: Fix order of evaluations leading to small memory error. Hide debug info --- src/Control.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index db0b074e38..1ea69046b8 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -22,7 +22,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { while (iarg < argIn.Nargs()) { // Advance to next unmarked argument. - while (argIn.Marked(iarg) && iarg < argIn.Nargs()) iarg++; + while (iarg < argIn.Nargs() && argIn.Marked(iarg)) iarg++; if (iarg == argIn.Nargs()) break; // Determine 'for' type ForType ftype = UNKNOWN; @@ -223,9 +223,9 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { if (MH.incOp_ == DECREMENT) MH.inc_ = -MH.inc_; // DEBUG - mprintf("DEBUG: start=%i endOp=%i end=%i incOp=%i val=%i startArg=%s endArg=%s\n", - MH.start_, (int)MH.endOp_, MH.end_, (int)MH.incOp_, MH.inc_, - MH.startArg_.c_str(), MH.endArg_.c_str()); + //mprintf("DEBUG: start=%i endOp=%i end=%i incOp=%i val=%i startArg=%s endArg=%s\n", + // MH.start_, (int)MH.endOp_, MH.end_, (int)MH.incOp_, MH.inc_, + // MH.startArg_.c_str(), MH.endArg_.c_str()); } // Check number of values if (MaxIterations == -1) From 40cfca180e126ce23f510820709ab9dc087fa8f9 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 09:33:09 -0400 Subject: [PATCH 37/75] DRR - Cpptraj: Initial incarnation of the VariableArray class. --- src/VariableArray.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++ src/VariableArray.h | 20 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/VariableArray.cpp create mode 100644 src/VariableArray.h diff --git a/src/VariableArray.cpp b/src/VariableArray.cpp new file mode 100644 index 0000000000..795cc914cd --- /dev/null +++ b/src/VariableArray.cpp @@ -0,0 +1,45 @@ +#include "VariableArray.h" +#include "CpptrajStdio.h" + +/** Add variable/value to array if it doesnt exist, otherwise set value. */ +void VariableArray::AddVariable(std::string const& varname, std::string const& value) +{ + Varray::iterator it = CurrentVars_.begin(); + for (; it != CurrentVars_.end(); ++it) + if (it->first == varname) + break; + if (it == CurrentVars_.end()) + CurrentVars_.push_back( Vpair(varname, value) ); + else + it->second = value; +} + +/** Replace all variables in given ArgList with their values. */ +ArgList VariableArray::ReplaceVariables(ArgList const& argIn) { + ArgList modCmd = argIn; + for (int n = 0; n < modCmd.Nargs(); n++) { + size_t pos = modCmd[n].find("$"); + if (pos != std::string::npos) { + // Argument is/contains a variable. Find first non-alphanumeric char + size_t len = 1; + for (size_t pos1 = pos+1; pos1 < modCmd[n].size(); pos1++, len++) + if (!isalnum(modCmd[n][pos1])) break; + std::string var_in_arg = modCmd[n].substr(pos, len); + // See if variable occurs in CurrentVars_ + Varray::const_iterator vp = CurrentVars_.begin(); + for (; vp != CurrentVars_.end(); ++vp) + if (vp->first == var_in_arg) break; + // If found replace with value from CurrentVars_ + if (vp != CurrentVars_.end()) { + std::string arg = modCmd[n]; + arg.replace(pos, vp->first.size(), vp->second); + modCmd.ChangeArg(n, arg); + } else { + mprinterr("Error: Unrecognized variable in command: %s\n", var_in_arg.c_str()); + return ArgList(); + } + } + } + return modCmd; +} + diff --git a/src/VariableArray.h b/src/VariableArray.h new file mode 100644 index 0000000000..bea2a2bd7c --- /dev/null +++ b/src/VariableArray.h @@ -0,0 +1,20 @@ +#ifndef INC_VARIABLEARRAY_H +#define INC_VARIABLEARRAY_H +#include "ArgList.h" +/// Hold script variables and their values. +class VariableArray { + public: + /// Hold variable and corresponding value. + typedef std::pair Vpair; + /// Hold list of variables and corresponding values. + typedef std::vector Varray; + /// CONSTRUCTOR + VariableArray() {} + /// Add variable with initial value. + void AddVariable(std::string const&, std::string const&); + /// Replace all variables in given ArgList with their values. + ArgList ReplaceVariables(ArgList const&); + private: + Varray CurrentVars_; ///< Hold all current variables +}; +#endif From 5ce3b1f562f6d1aea9b6fd7c991e0b64c6b938c3 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 09:35:03 -0400 Subject: [PATCH 38/75] DRR - Cpptraj: Change function name --- src/VariableArray.cpp | 2 +- src/VariableArray.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/VariableArray.cpp b/src/VariableArray.cpp index 795cc914cd..5d8f867545 100644 --- a/src/VariableArray.cpp +++ b/src/VariableArray.cpp @@ -2,7 +2,7 @@ #include "CpptrajStdio.h" /** Add variable/value to array if it doesnt exist, otherwise set value. */ -void VariableArray::AddVariable(std::string const& varname, std::string const& value) +void VariableArray::UpdateVariable(std::string const& varname, std::string const& value) { Varray::iterator it = CurrentVars_.begin(); for (; it != CurrentVars_.end(); ++it) diff --git a/src/VariableArray.h b/src/VariableArray.h index bea2a2bd7c..71a312a33d 100644 --- a/src/VariableArray.h +++ b/src/VariableArray.h @@ -10,8 +10,8 @@ class VariableArray { typedef std::vector Varray; /// CONSTRUCTOR VariableArray() {} - /// Add variable with initial value. - void AddVariable(std::string const&, std::string const&); + /// Add/update variable with given value. + void UpdateVariable(std::string const&, std::string const&); /// Replace all variables in given ArgList with their values. ArgList ReplaceVariables(ArgList const&); private: From b12be92f12def8c2101688f35859adbc1fc7285f Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 09:47:21 -0400 Subject: [PATCH 39/75] DRR - Cpptraj: Place current script variables in separate class. Should allow more flexibility. --- src/Command.cpp | 46 +++++++++++-------------------------------- src/Command.h | 11 +++++++---- src/Control.cpp | 19 +++--------------- src/Control.h | 5 ++--- src/VariableArray.cpp | 5 +++++ src/VariableArray.h | 11 +++++++---- src/cpptrajdepend | 19 +++++++++--------- src/cpptrajfiles | 1 + 8 files changed, 47 insertions(+), 70 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index b23e0d18de..eed02986bc 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -179,6 +179,8 @@ Command::CtlArray Command::control_ = Command::CtlArray(); int Command::ctlidx_ = -1; +Control::Varray Command::CurrentVars_ = Control::Varray(); + /** Initialize all commands. Should only be called once as program starts. */ void Command::Init() { // GENERAL @@ -515,56 +517,32 @@ int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) #define NEW_BLOCK "__NEW_BLOCK__" /** Execute the specified control block. */ -int Command::ExecuteControlBlock(int block, CpptrajState& State, Control::Varray CurrentVars) +int Command::ExecuteControlBlock(int block, CpptrajState& State) { - control_[block]->Start(CurrentVars); - if (State.Debug() > 0) { + control_[block]->Start(CurrentVars_); + if (State.Debug() >= 0) { mprintf("DEBUG: Start: CurrentVars:"); - for (Control::Varray::const_iterator vp = CurrentVars.begin(); vp != CurrentVars.end(); ++vp) - mprintf(" %s=%s", vp->first.c_str(), vp->second.c_str()); - mprintf("\n"); + CurrentVars_.PrintVariables(); } - Control::DoneType ret = control_[block]->CheckDone(CurrentVars); + Control::DoneType ret = control_[block]->CheckDone(CurrentVars_); while (ret == Control::NOT_DONE) { for (Control::const_iterator it = control_[block]->begin(); it != control_[block]->end(); ++it) { // Check if we need to execute a new block if (it->CommandIs(NEW_BLOCK)) { - if (ExecuteControlBlock(block+1, State, CurrentVars)) return 1; + if (ExecuteControlBlock(block+1, State)) return 1; } else { // Replace variable names in command with entries from CurrentVars - ArgList modCmd = *it; - for (int n = 0; n < modCmd.Nargs(); n++) { - size_t pos = modCmd[n].find("$"); - if (pos != std::string::npos) { - // Argument is/contains a variable. Find first non-alphanumeric char - size_t len = 1; - for (size_t pos1 = pos+1; pos1 < modCmd[n].size(); pos1++, len++) - if (!isalnum(modCmd[n][pos1])) break; - std::string var_in_arg = modCmd[n].substr(pos, len); - // See if variable occurs in CurrentVars - Control::Varray::const_iterator vp = CurrentVars.begin(); - for (; vp != CurrentVars.end(); ++vp) - if (vp->first == var_in_arg) break; - // If found replace with value from CurrentVars - if (vp != CurrentVars.end()) { - std::string arg = modCmd[n]; - arg.replace(pos, vp->first.size(), vp->second); - modCmd.ChangeArg(n, arg); - } else { - mprinterr("Error: Unrecognized variable in command: %s\n", var_in_arg.c_str()); - return 1; - } - } - } + ArgList modCmd = CurrentVars_.ReplaceVariables( *it ); + if (modCmd.empty()) return 1; // Print modified command and execute. for (int i = 0; i < block; i++) mprintf(" "); mprintf(" [%s %s]\n", modCmd.Command(), modCmd.ArgString().c_str()); if ( ExecuteCommand(State, modCmd) != CpptrajState::OK ) return 1; } } - ret = control_[block]->CheckDone(CurrentVars); + ret = control_[block]->CheckDone(CurrentVars_); } if (ret == Control::ERROR) return 1; //for (int i = 0; i < block; i++) mprintf(" "); @@ -594,7 +572,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& if (ctlidx_ < 0) { // Outermost control structure is ended. Execute control block(s). mprintf("CONTROL: Executing %u control block(s).\n", control_.size()); - if (ExecuteControlBlock(0, State, Control::Varray())) return CpptrajState::ERR; + if (ExecuteControlBlock(0, State)) return CpptrajState::ERR; // Control block finished, clean up for (unsigned int i = 0; i < control_.size(); i++) { //mprintf("DEBUG: %u : %u commands.\n", i, control_[i]->Ncommands()); diff --git a/src/Command.h b/src/Command.h index ec1dd59295..14a4cdace6 100644 --- a/src/Command.h +++ b/src/Command.h @@ -27,15 +27,18 @@ class Command { static Cmd const& SearchTokenType(DispatchObject::Otype, const char*, bool); static void ListCommandsForType(DispatchObject::Otype); static int AddControlBlock(Control*, CpptrajState&, ArgList&); - static int ExecuteControlBlock(int, CpptrajState&, Control::Varray); + static ArgList ReplaceVariables(ArgList const&); + static int ExecuteControlBlock(int, CpptrajState&); static CpptrajState::RetType ExecuteCommand(CpptrajState&, ArgList&); static CmdList commands_; ///< Master list of commands. static const Cmd EMPTY_; ///< Empty command. typedef std::vector Carray; - static Carray names_; ///< Array of pointers to all command names, for ReadLine + static Carray names_; ///< Array of pointers to all command names, for ReadLine typedef std::vector CtlArray; - static CtlArray control_; - static int ctlidx_; + static CtlArray control_; ///< Array of control blocks + static int ctlidx_; ///< Point to current control block + /// Array of script variables and their current values. + static Control::Varray CurrentVars_; }; #endif diff --git a/src/Control.cpp b/src/Control.cpp index 1ea69046b8..1828c6fa76 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -254,20 +254,7 @@ void Control_For::Start(Varray& CurrentVars) { else MH->idx_ = MH->Idxs_.begin(); // Init CurrentVars - CurrentVars.push_back( VarPair(MH->varname_, "") ); - } -} - -static inline void UpdateCurrentVars(Control::Varray& CurrentVars, std::string const& varname, - std::string const& value) -{ - //mprintf("DEBUG: UpdateCurrentVars: %s = %s\n", varname.c_str(), value.c_str()); - Control::Varray::iterator it = CurrentVars.begin(); - for (; it != CurrentVars.end(); ++it) { - if (it->first == varname) { - it->second = value; - break; - } + CurrentVars.UpdateVariable( MH->varname_, "" ); } } @@ -283,7 +270,7 @@ Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { if (MH->currentVal_ <= MH->end_) return DONE; } // Get variable value and update CurrentVars - UpdateCurrentVars(CurrentVars, MH->varname_, integerToString( MH->currentVal_ )); + CurrentVars.UpdateVariable( MH->varname_, integerToString( MH->currentVal_ )); // Increment MH->currentVal_ += MH->inc_; } else { @@ -292,7 +279,7 @@ Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { std::string maskStr = prefix[MH->varType_] + integerToString(*(MH->idx_) + 1); //mprintf("DEBUG: Control_For: %s\n", maskStr.c_str()); // Update CurrentVars - UpdateCurrentVars(CurrentVars, MH->varname_, maskStr); + CurrentVars.UpdateVariable( MH->varname_, maskStr ); // Increment ++(MH->idx_); } diff --git a/src/Control.h b/src/Control.h index a44a97faf7..a80f361e43 100644 --- a/src/Control.h +++ b/src/Control.h @@ -1,6 +1,7 @@ #ifndef INC_CONTROL_H #define INC_CONTROL_H #include "CpptrajState.h" +#include "VariableArray.h" /// Control structures. class Control : public DispatchObject { public: @@ -18,10 +19,8 @@ class Control : public DispatchObject { enum DoneType { DONE = 0, NOT_DONE, ERROR }; - /// Hold variable, value - typedef std::pair VarPair; /// Hold variable/value pairs - typedef std::vector Varray; + typedef VariableArray Varray; /// \return Number of commands in the block virtual unsigned int Ncommands() const = 0; /// \return iterator to first command in the block. diff --git a/src/VariableArray.cpp b/src/VariableArray.cpp index 5d8f867545..f03e3a4a9e 100644 --- a/src/VariableArray.cpp +++ b/src/VariableArray.cpp @@ -43,3 +43,8 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn) { return modCmd; } +void VariableArray::PrintVariables() const { + for (Varray::const_iterator vp = CurrentVars_.begin(); vp != CurrentVars_.end(); ++vp) + mprintf(" %s=%s", vp->first.c_str(), vp->second.c_str()); + mprintf("\n"); +} diff --git a/src/VariableArray.h b/src/VariableArray.h index 71a312a33d..ecd5073786 100644 --- a/src/VariableArray.h +++ b/src/VariableArray.h @@ -4,17 +4,20 @@ /// Hold script variables and their values. class VariableArray { public: - /// Hold variable and corresponding value. - typedef std::pair Vpair; - /// Hold list of variables and corresponding values. - typedef std::vector Varray; /// CONSTRUCTOR VariableArray() {} /// Add/update variable with given value. void UpdateVariable(std::string const&, std::string const&); /// Replace all variables in given ArgList with their values. ArgList ReplaceVariables(ArgList const&); + /// Print all variable/value pairs to stdout + void PrintVariables() const; private: + /// Hold variable and corresponding value. + typedef std::pair Vpair; + /// Hold list of variables and corresponding values. + typedef std::vector Varray; + Varray CurrentVars_; ///< Hold all current variables }; #endif diff --git a/src/cpptrajdepend b/src/cpptrajdepend index c60635411c..cc3ff172cc 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -149,7 +149,7 @@ CmdInput.o : CmdInput.cpp CmdInput.h StringRoutines.h CmdList.o : CmdList.cpp Cmd.h CmdList.h DispatchObject.h ComplexArray.o : ComplexArray.cpp ArrayIterator.h ComplexArray.h Constraints.o : Constraints.cpp ArgList.h Atom.h AtomExtra.h AtomMask.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 ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h Vec3.h -Control.o : Control.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Control.o : Control.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h VariableArray.h Vec3.h CoordinateInfo.o : CoordinateInfo.cpp Box.h CoordinateInfo.h CpptrajStdio.h Matrix_3x3.h Parallel.h ReplicaDimArray.h Vec3.h Corr.o : Corr.cpp ArrayIterator.h ComplexArray.h Corr.h PubFFT.h CpptrajFile.o : CpptrajFile.cpp CpptrajFile.h CpptrajStdio.h FileIO.h FileIO_Bzip2.h FileIO_Gzip.h FileIO_Mpi.h FileIO_Std.h FileName.h Parallel.h StringRoutines.h @@ -215,21 +215,21 @@ EnsembleOut_Multi.o : EnsembleOut_Multi.cpp ActionFrameCounter.h ArgList.h Atom. EnsembleOut_Single.o : EnsembleOut_Single.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h EnsembleOut.h EnsembleOut_Single.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h TrajectoryFile.h TrajectoryIO.h Vec3.h EnsembleOutList.o : EnsembleOutList.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h EnsembleOut.h EnsembleOutList.h EnsembleOut_Multi.h EnsembleOut_Single.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h TrajectoryFile.h TrajectoryIO.h Vec3.h Ewald.o : Ewald.cpp Atom.h AtomExtra.h AtomMask.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajStdio.h Ewald.h FileName.h Frame.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h PairList.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Spline.h StringRoutines.h Timer.h Topology.h Vec3.h -Exec_Analyze.o : Exec_Analyze.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Analyze.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Exec_Analyze.o : Exec_Analyze.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Analyze.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h VariableArray.h Vec3.h Exec_Calc.o : Exec_Calc.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Calc.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h RPNcalc.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_Change.o : Exec_Change.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Change.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_ClusterMap.o : Exec_ClusterMap.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h ClusterMap.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_2D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_MatrixFlt.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ClusterMap.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_CombineCoords.o : Exec_CombineCoords.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CombineCoords.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_Commands.o : Exec_Commands.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Commands.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_CompareTop.o : Exec_CompareTop.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CompareTop.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h -Exec_CrdAction.o : Exec_CrdAction.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CrdAction.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Exec_CrdAction.o : Exec_CrdAction.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CrdAction.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h VariableArray.h Vec3.h Exec_CrdOut.o : Exec_CrdOut.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CrdOut.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_CreateSet.o : Exec_CreateSet.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_CreateSet.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h RPNcalc.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_DataFile.o : Exec_DataFile.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_DataFile.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_DataFilter.o : Exec_DataFilter.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Action_FilterByData.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h Array1D.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_DataFilter.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ProgressBar.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_DataSetCmd.o : Exec_DataSetCmd.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h ComplexArray.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_MatrixDbl.h DataSet_Vector.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_DataSetCmd.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_GenerateAmberRst.o : Exec_GenerateAmberRst.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h DistRoutines.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_GenerateAmberRst.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TorsionRoutines.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h -Exec_Help.o : Exec_Help.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Help.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Exec_Help.o : Exec_Help.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Help.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h VariableArray.h Vec3.h Exec_LoadCrd.o : Exec_LoadCrd.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_LoadCrd.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h Trajin_Single.h TrajoutList.h Trajout_Single.h Vec3.h Exec_LoadTraj.o : Exec_LoadTraj.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Coords_TRJ.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_LoadTraj.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajFrameIndex.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_ParmBox.o : Exec_ParmBox.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ParmBox.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h @@ -240,9 +240,9 @@ Exec_PermuteDihedrals.o : Exec_PermuteDihedrals.cpp Action.h ActionFrameCounter. Exec_Precision.o : Exec_Precision.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_Precision.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_PrintData.o : Exec_PrintData.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_PrintData.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_ReadData.o : Exec_ReadData.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ReadData.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h -Exec_ReadInput.o : Exec_ReadInput.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ReadInput.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Exec_ReadInput.o : Exec_ReadInput.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ReadInput.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h VariableArray.h Vec3.h Exec_RotateDihedral.o : Exec_RotateDihedral.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h DihedralSearch.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_RotateDihedral.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TorsionRoutines.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h -Exec_RunAnalysis.o : Exec_RunAnalysis.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_RunAnalysis.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +Exec_RunAnalysis.o : Exec_RunAnalysis.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_RunAnalysis.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h VariableArray.h Vec3.h Exec_ScaleDihedralK.o : Exec_ScaleDihedralK.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_ScaleDihedralK.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_SequenceAlign.o : Exec_SequenceAlign.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h BufferedLine.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_SequenceAlign.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Exec_System.o : Exec_System.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Exec.h Exec_System.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h @@ -335,13 +335,14 @@ Trajin_Single.o : Trajin_Single.cpp ArgList.h Atom.h AtomExtra.h AtomMask.h Base TrajIOarray.o : TrajIOarray.cpp ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h StringRoutines.h Topology.h TrajFrameCounter.h TrajIOarray.h TrajectoryFile.h TrajectoryIO.h Vec3.h Trajout_Single.o : Trajout_Single.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h StringRoutines.h Topology.h TrajectoryFile.h TrajectoryIO.h Trajout_Single.h Vec3.h TrajoutList.o : TrajoutList.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h TrajectoryFile.h TrajectoryIO.h TrajoutList.h Trajout_Single.h Vec3.h +VariableArray.o : VariableArray.cpp ArgList.h CpptrajStdio.h VariableArray.h Vec3.o : Vec3.cpp Constants.h CpptrajStdio.h Vec3.h ViewRst.o : ViewRst.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReplicaDimArray.h Residue.h Topology.h TrajectoryFile.h TrajectoryIO.h Trajout_Single.h Vec3.h ViewRst.h Action_Esander.o : Action_Esander.cpp Action.h ActionState.h Action_Esander.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h Energy_Sander.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h TextFormat.h Timer.h Topology.h Vec3.h -Command.o : Command.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.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_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_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_Translate.h Action_Unstrip.h Action_Unwrap.h Action_Vector.h Action_VelocityAutoCorr.h Action_Volmap.h Action_Volume.h Action_Watershell.h Analysis.h AnalysisList.h AnalysisState.h Analysis_AmdBias.h Analysis_AutoCorr.h Analysis_Average.h Analysis_Clustering.h Analysis_Corr.h Analysis_CrankShaft.h Analysis_CrdFluct.h Analysis_CrossCorr.h Analysis_CurveFit.h Analysis_Divergence.h Analysis_FFT.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_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 AtomExtra.h AtomMap.h AtomMask.h AxisType.h BaseIOtype.h Box.h BufferedLine.h CharMask.h ClusterDist.h ClusterList.h ClusterMap.h ClusterNode.h ClusterSieve.h Cmd.h CmdInput.h CmdList.h Command.h ComplexArray.h Constraints.h Control.h CoordinateInfo.h Corr.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.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_string.h Deprecated.h DihedralSearch.h Dimension.h DispatchObject.h DistRoutines.h Energy.h Energy_Sander.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Ewald.h Exec.h Exec_Analyze.h Exec_Calc.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_GenerateAmberRst.h Exec_Help.h Exec_LoadCrd.h Exec_LoadTraj.h Exec_ParmBox.h Exec_ParmSolvent.h Exec_ParmStrip.h Exec_ParmWrite.h Exec_PermuteDihedrals.h Exec_Precision.h Exec_PrintData.h Exec_ReadData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_ViewRst.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h Grid.h GridAction.h GridBin.h HistBin.h Hungarian.h ImageTypes.h ImagedAction.h InputTrajCommon.h MapAtom.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 ParameterTypes.h PubFFT.h RPNcalc.h Random.h Range.h ReferenceAction.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Spline.h StructureCheck.h SymmetricRmsdCalc.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Traj_AmberNetcdf.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h molsurf.h -Cpptraj.o : Cpptraj.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdInput.h CmdList.h Command.h Control.h CoordinateInfo.h Cpptraj.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReadLine.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h TopInfo.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h Version.h +Command.o : Command.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.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_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_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_Translate.h Action_Unstrip.h Action_Unwrap.h Action_Vector.h Action_VelocityAutoCorr.h Action_Volmap.h Action_Volume.h Action_Watershell.h Analysis.h AnalysisList.h AnalysisState.h Analysis_AmdBias.h Analysis_AutoCorr.h Analysis_Average.h Analysis_Clustering.h Analysis_Corr.h Analysis_CrankShaft.h Analysis_CrdFluct.h Analysis_CrossCorr.h Analysis_CurveFit.h Analysis_Divergence.h Analysis_FFT.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_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 AtomExtra.h AtomMap.h AtomMask.h AxisType.h BaseIOtype.h Box.h BufferedLine.h CharMask.h ClusterDist.h ClusterList.h ClusterMap.h ClusterNode.h ClusterSieve.h Cmd.h CmdInput.h CmdList.h Command.h ComplexArray.h Constraints.h Control.h CoordinateInfo.h Corr.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.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_string.h Deprecated.h DihedralSearch.h Dimension.h DispatchObject.h DistRoutines.h Energy.h Energy_Sander.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h Ewald.h Exec.h Exec_Analyze.h Exec_Calc.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_GenerateAmberRst.h Exec_Help.h Exec_LoadCrd.h Exec_LoadTraj.h Exec_ParmBox.h Exec_ParmSolvent.h Exec_ParmStrip.h Exec_ParmWrite.h Exec_PermuteDihedrals.h Exec_Precision.h Exec_PrintData.h Exec_ReadData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_ViewRst.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h Grid.h GridAction.h GridBin.h HistBin.h Hungarian.h ImageTypes.h ImagedAction.h InputTrajCommon.h MapAtom.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 ParameterTypes.h PubFFT.h RPNcalc.h Random.h Range.h ReferenceAction.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Spline.h StructureCheck.h SymmetricRmsdCalc.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Traj_AmberNetcdf.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h VariableArray.h Vec3.h molsurf.h +Cpptraj.o : Cpptraj.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdInput.h CmdList.h Command.h Control.h CoordinateInfo.h Cpptraj.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReadLine.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h StringRoutines.h TextFormat.h Timer.h TopInfo.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h VariableArray.h Vec3.h Version.h Energy_Sander.o : Energy_Sander.cpp ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h Energy_Sander.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReplicaDimArray.h Residue.h Topology.h Vec3.h -ReadLine.o : ReadLine.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdInput.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReadLine.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h +ReadLine.o : ReadLine.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Cmd.h CmdInput.h CmdList.h Command.h Control.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReadLine.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h VariableArray.h Vec3.h main.o : main.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h Cpptraj.h CpptrajFile.h CpptrajState.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOut.h EnsembleOutList.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h TrajectoryIO.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h Vec3.h molsurf.o : molsurf.c molsurf.h AmbPDB.o : AmbPDB.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h BufferedFrame.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReplicaDimArray.h Residue.h StringRoutines.h TextFormat.h Topology.h TrajFrameCounter.h Traj_AmberRestart.h TrajectoryFile.h TrajectoryIO.h Trajin.h Trajin_Single.h Trajout_Single.h Vec3.h diff --git a/src/cpptrajfiles b/src/cpptrajfiles index 1888e8cc37..40e9df6b6d 100644 --- a/src/cpptrajfiles +++ b/src/cpptrajfiles @@ -337,6 +337,7 @@ COMMON_SOURCES=ActionFrameCounter.cpp \ TrajIOarray.cpp \ Trajout_Single.cpp \ TrajoutList.cpp \ + VariableArray.cpp \ Vec3.cpp \ ViewRst.cpp From 5a002aee130ce939c39ea58ee35b267416bb6de8 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 09:53:56 -0400 Subject: [PATCH 40/75] DRR - Cpptraj: Start() does not have to add variables since this is done during CheckDone() if needed. --- src/Command.cpp | 4 ++-- src/Control.cpp | 6 ++---- src/Control.h | 8 ++++---- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index eed02986bc..afad5bc6ae 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -519,12 +519,12 @@ int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) /** Execute the specified control block. */ int Command::ExecuteControlBlock(int block, CpptrajState& State) { - control_[block]->Start(CurrentVars_); + control_[block]->Start(); + Control::DoneType ret = control_[block]->CheckDone(CurrentVars_); if (State.Debug() >= 0) { mprintf("DEBUG: Start: CurrentVars:"); CurrentVars_.PrintVariables(); } - Control::DoneType ret = control_[block]->CheckDone(CurrentVars_); while (ret == Control::NOT_DONE) { for (Control::const_iterator it = control_[block]->begin(); it != control_[block]->end(); ++it) diff --git a/src/Control.cpp b/src/Control.cpp index 1828c6fa76..0c1ee6a7e5 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -246,15 +246,13 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { return 0; } -/** For each mask add variable to CurrentVars and initialize iterator. */ -void Control_For::Start(Varray& CurrentVars) { +/** For each mask initialize iterator. For each integer set to start value. */ +void Control_For::Start() { for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { if (MH->varType_ == INTEGER) MH->currentVal_ = MH->start_; // TODO search currentvars else MH->idx_ = MH->Idxs_.begin(); - // Init CurrentVars - CurrentVars.UpdateVariable( MH->varname_, "" ); } } diff --git a/src/Control.h b/src/Control.h index a80f361e43..bb30734209 100644 --- a/src/Control.h +++ b/src/Control.h @@ -27,9 +27,9 @@ class Control : public DispatchObject { virtual const_iterator begin() const = 0; /// \return iterator to last command in the block. virtual const_iterator end() const = 0; - /// Start control block. Check/init variables. - virtual void Start(Varray&) = 0; - /// Update variables and increment, check control state. + /// Start control block. Init internal variables if necessary. + virtual void Start() = 0; + /// Add/update variables and increment, check control state. virtual DoneType CheckDone(Varray&) = 0; protected: std::string description_; ///< Describe control TODO private? @@ -49,7 +49,7 @@ class Control_For : public Control { unsigned int Ncommands() const { return commands_.size(); } const_iterator begin() const { return commands_.begin(); } const_iterator end() const { return commands_.end(); } - void Start(Varray&); + void Start(); DoneType CheckDone(Varray&); private: enum ForType {ATOMS=0, RESIDUES, MOLECULES, INTEGER, UNKNOWN}; From 62754913c4b11699307b257d2a2732449f49d4e5 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 10:18:40 -0400 Subject: [PATCH 41/75] DRR - Cpptraj: Have ChangeArg modify ArgLine as well. --- src/ArgList.cpp | 7 +++++++ src/ArgList.h | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ArgList.cpp b/src/ArgList.cpp index bcea49dcc1..b7c3dcc35d 100644 --- a/src/ArgList.cpp +++ b/src/ArgList.cpp @@ -207,6 +207,13 @@ void ArgList::RemoveFirstArg() { marked_.erase( marked_.begin() ); } +/** Replace argument at position with given argument. Update ArgLine. */ +void ArgList::ChangeArg(unsigned int idx, std::string const& arg) { + size_t pos = argline_.find( arglist_[idx], 0 ); + argline_.replace(pos, arglist_[idx].size(), arg); + arglist_[idx] = arg; +} + // ArgList::Command() /* \return pointer to the first argument */ diff --git a/src/ArgList.h b/src/ArgList.h index 6768cd19e2..1d2fa0a2db 100644 --- a/src/ArgList.h +++ b/src/ArgList.h @@ -62,7 +62,7 @@ class ArgList { /// Remove the first argument void RemoveFirstArg(); /// Change argument at position to new argument - void ChangeArg(int p, std::string const& a) { arglist_[p] = a; } + void ChangeArg(unsigned int, std::string const&); /// \return the first argument const char *Command() const; /// \return true if the first argument matches key From 7e4502dcd6854bfec843a91069cadbbb7aea9506 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 10:19:16 -0400 Subject: [PATCH 42/75] DRR - Cpptraj: Have ExecuteCommand modify commands so script variables can be used outside of control blocks. --- src/Command.cpp | 19 ++++++++++--------- src/Command.h | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index afad5bc6ae..1e1a84cceb 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -529,17 +529,13 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State) for (Control::const_iterator it = control_[block]->begin(); it != control_[block]->end(); ++it) { - // Check if we need to execute a new block if (it->CommandIs(NEW_BLOCK)) { + // Execute next control block if (ExecuteControlBlock(block+1, State)) return 1; } else { - // Replace variable names in command with entries from CurrentVars - ArgList modCmd = CurrentVars_.ReplaceVariables( *it ); - if (modCmd.empty()) return 1; - // Print modified command and execute. for (int i = 0; i < block; i++) mprintf(" "); - mprintf(" [%s %s]\n", modCmd.Command(), modCmd.ArgString().c_str()); - if ( ExecuteCommand(State, modCmd) != CpptrajState::OK ) return 1; + // Execute command + if ( ExecuteCommand(State, *it) != CpptrajState::OK ) return 1; } } ret = control_[block]->CheckDone(CurrentVars_); @@ -607,7 +603,12 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& #undef NEW_BLOCK /** Search for and execute the given command. */ -CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList& cmdArg ) { +CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList const& cmdArgIn ) { + // Replace variable names in command with entries from CurrentVars + ArgList cmdArg = CurrentVars_.ReplaceVariables( cmdArgIn ); + if (cmdArg.empty()) return CpptrajState::ERR; + // Print modified command and execute. + mprintf(" [%s]\n", cmdArg.ArgLine()); // Look for command in command list. Cmd const& cmd = SearchToken( cmdArg ); CpptrajState::RetType ret_val = CpptrajState::OK; @@ -672,7 +673,7 @@ CpptrajState::RetType Command::ProcessInput(CpptrajState& State, std::string con // Only attempt to execute if the command is not blank. if (!input.Empty()) { // Print the input line that will be sent to dispatch - mprintf(" [%s]\n", input.str()); + //mprintf(" [%s]\n", input.str()); # ifdef TIMER Timer time_cmd; // DEBUG time_cmd.Start(); // DEBUG diff --git a/src/Command.h b/src/Command.h index 14a4cdace6..59de58b681 100644 --- a/src/Command.h +++ b/src/Command.h @@ -29,7 +29,7 @@ class Command { static int AddControlBlock(Control*, CpptrajState&, ArgList&); static ArgList ReplaceVariables(ArgList const&); static int ExecuteControlBlock(int, CpptrajState&); - static CpptrajState::RetType ExecuteCommand(CpptrajState&, ArgList&); + static CpptrajState::RetType ExecuteCommand(CpptrajState&, ArgList const&); static CmdList commands_; ///< Master list of commands. static const Cmd EMPTY_; ///< Empty command. From 767bbe463a1167982ee5ddafe01c9ed2e2f481fb Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 10:20:27 -0400 Subject: [PATCH 43/75] DRR - Cpptraj: Script vars can be used outside of control blocks now. --- test/Test_IRED/RunTest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Test_IRED/RunTest.sh b/test/Test_IRED/RunTest.sh index fae58cd0ac..3e2c583961 100755 --- a/test/Test_IRED/RunTest.sh +++ b/test/Test_IRED/RunTest.sh @@ -18,7 +18,7 @@ for atoms Natom inmask :2-129@N&!:PRO atoms Hatom inmask :2-129@H v=1;v++ done matrix ired name matired order 2 -diagmatrix matired out ired.vec name ired.vec vecs 126 +diagmatrix matired out ired.vec name ired.vec vecs \$v ired order 2 modes ired.vec relax freq 500.0 NHdist 1.02 \ tstep 1.0 tcorr 10000.0 norm name MyIred \ out v0 noefile noe ds2matrix matrix_ds2.dat From e5d347a1406cc8d2419bc7e95eb4d20741bba0bf Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 10:33:36 -0400 Subject: [PATCH 44/75] DRR - Cpptraj: Properly clear control blocks when an error occurs. --- src/Command.cpp | 26 +++++++++++++------------- src/Command.h | 1 + 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 1e1a84cceb..8732f16ee3 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -388,14 +388,19 @@ void Command::Init() { names_.push_back( 0 ); } +void Command::ClearControlBlocks() { + for (CtlArray::iterator it = control_.begin(); it != control_.end(); ++it) + delete *it; + control_.clear(); + ctlidx_ = -1; +} + /** Free all commands. Should only be called just before program exit. Also * remove any remaining control blocks. */ void Command::Free() { commands_.Clear(); - for (CtlArray::iterator it = control_.begin(); it != control_.end(); ++it) - delete *it; - control_.clear(); + ClearControlBlocks(); } /** \param oIn Pointer to DispatchObject to add as command. @@ -568,13 +573,9 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& if (ctlidx_ < 0) { // Outermost control structure is ended. Execute control block(s). mprintf("CONTROL: Executing %u control block(s).\n", control_.size()); - if (ExecuteControlBlock(0, State)) return CpptrajState::ERR; - // Control block finished, clean up - for (unsigned int i = 0; i < control_.size(); i++) { - //mprintf("DEBUG: %u : %u commands.\n", i, control_[i]->Ncommands()); - delete control_[i]; - } - control_.clear(); + int cbret = ExecuteControlBlock(0, State); + ClearControlBlocks(); + if (cbret != 0) return CpptrajState::ERR; mprintf("CONTROL: Control block finished.\n\n"); } } else { @@ -591,6 +592,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& DispatchObject* obj = ctlCmd.Alloc(); if (AddControlBlock( (Control*)obj, State, cmdArg )) { delete obj; + ClearControlBlocks(); return CpptrajState::ERR; } } @@ -607,7 +609,7 @@ CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList cons // Replace variable names in command with entries from CurrentVars ArgList cmdArg = CurrentVars_.ReplaceVariables( cmdArgIn ); if (cmdArg.empty()) return CpptrajState::ERR; - // Print modified command and execute. + // Print modified command mprintf(" [%s]\n", cmdArg.ArgLine()); // Look for command in command list. Cmd const& cmd = SearchToken( cmdArg ); @@ -672,8 +674,6 @@ CpptrajState::RetType Command::ProcessInput(CpptrajState& State, std::string con } // Only attempt to execute if the command is not blank. if (!input.Empty()) { - // Print the input line that will be sent to dispatch - //mprintf(" [%s]\n", input.str()); # ifdef TIMER Timer time_cmd; // DEBUG time_cmd.Start(); // DEBUG diff --git a/src/Command.h b/src/Command.h index 59de58b681..089fdb4920 100644 --- a/src/Command.h +++ b/src/Command.h @@ -26,6 +26,7 @@ class Command { private: static Cmd const& SearchTokenType(DispatchObject::Otype, const char*, bool); static void ListCommandsForType(DispatchObject::Otype); + static void ClearControlBlocks(); static int AddControlBlock(Control*, CpptrajState&, ArgList&); static ArgList ReplaceVariables(ArgList const&); static int ExecuteControlBlock(int, CpptrajState&); From 4ed98dfd47331c3449adaf8f9d741d47cc891fd9 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 10:39:20 -0400 Subject: [PATCH 45/75] DRR - Cpptraj: Print command when adding to control block. Hide debug info. --- src/Command.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Command.cpp b/src/Command.cpp index 8732f16ee3..ecbc29ac7b 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -526,7 +526,7 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State) { control_[block]->Start(); Control::DoneType ret = control_[block]->CheckDone(CurrentVars_); - if (State.Debug() >= 0) { + if (State.Debug() > 0) { mprintf("DEBUG: Start: CurrentVars:"); CurrentVars_.PrintVariables(); } @@ -583,6 +583,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& Cmd const& ctlCmd = SearchTokenType(DispatchObject::CONTROL, cmdArg.Command(), true); if (ctlCmd.Empty()) { // Add this command to current control block. + mprintf(" [%s]\n", cmdArg.ArgLine()); control_[ctlidx_]->AddCommand( cmdArg ); mprintf("\tAdded command '%s' to control block %i.\n", cmdArg.Command(), ctlidx_); } else { From 23379ce445116162fe4897b10bce9ac9d97fc9d1 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 10:47:38 -0400 Subject: [PATCH 46/75] DRR - Cpptraj: Ensure control commands inside control blocks are printed as well. --- src/Command.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Command.cpp b/src/Command.cpp index ecbc29ac7b..300a129877 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -562,6 +562,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& cmdArg.MarkArg(0); // Always mark the first arg as the command // Check for control block if (!control_.empty()) { + mprintf(" [%s]\n", cmdArg.ArgLine()); // In control block. Check if current block should end. if ( control_[ctlidx_]->EndControl( cmdArg ) ) { //mprintf("DEBUG: End control block %i.\n", ctlidx_); @@ -583,7 +584,6 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& Cmd const& ctlCmd = SearchTokenType(DispatchObject::CONTROL, cmdArg.Command(), true); if (ctlCmd.Empty()) { // Add this command to current control block. - mprintf(" [%s]\n", cmdArg.ArgLine()); control_[ctlidx_]->AddCommand( cmdArg ); mprintf("\tAdded command '%s' to control block %i.\n", cmdArg.Command(), ctlidx_); } else { From a7637ce9d52569615756b5f5228bcfb18b290099 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 11:46:12 -0400 Subject: [PATCH 47/75] DRR - Cpptraj: Add molfirstres and mollastres for mask loop types. Improve help and error messages. --- src/Control.cpp | 50 ++++++++++++++++++++++++++++++++++++++++--------- src/Control.h | 2 +- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 0c1ee6a7e5..9a232e590e 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -4,9 +4,23 @@ #include "StringRoutines.h" void Control_For::Help() const { - mprintf("\t[ {atoms|residues|molecules} inmask %s ...\n" - "\t =;[;][] ... ]\n", + mprintf("\t{ {atoms|residues|molecules|molfirstres|mollastres}\n" + "\t inmask %s ... |\n" + "\t =;[;][] ... }\n", DataSetList::TopIdxArgs); + mprintf("\tEND KEYWORD: 'done'\n"); + mprintf(" Create a 'for' loop around specified mask(s) and/or integer value(s).\n" + " Any number and combination of masks and integers can be specified.\n" + " Variables created in the for loop can be referenced by prefacing\n" + " the name with a '$' character.\n" + " Available 'end OP' : '<' '>'\n" + " Available 'increment OP' : '++', '--', '+=', '-='\n" + " Note that variables are NOT incremented after the final loop iteration,\n" + " i.e. loop variables always retain their final value.\n" + " Example:\n" + "\tfor atoms A0 inmask :1-27&!@H= i=1;i++\n" + "\t distance d$i :TCS $A0 out $i.dat\n" + "\tdone\n"); } /** Set up each mask. */ @@ -14,7 +28,8 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { mprintf(" Setting up 'for' loop.\n"); Masks_.clear(); Topology* currentTop = 0; - static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES " }; + static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES ", + "MOL_FIRST_RES ", "MOL_LAST_RES " }; static const char* OpStr[] = {"+=", "-=", "<", ">"}; description_.assign("for ("); int MaxIterations = -1; @@ -26,13 +41,18 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { if (iarg == argIn.Nargs()) break; // Determine 'for' type ForType ftype = UNKNOWN; + bool isMaskFor = true; if ( argIn[iarg] == "atoms" ) ftype = ATOMS; else if ( argIn[iarg] == "residues" ) ftype = RESIDUES; else if ( argIn[iarg] == "molecules" ) ftype = MOLECULES; - else if ( argIn[iarg].find(";") != std::string::npos ) + else if ( argIn[iarg] == "molfirstres" ) ftype = MOLFIRSTRES; + else if ( argIn[iarg] == "mollastres" ) ftype = MOLLASTRES; + else if ( argIn[iarg].find(";") != std::string::npos ) { + isMaskFor = false; ftype = INTEGER; + } if (ftype == UNKNOWN) { - mprinterr("Error: One of {atoms|residues|molecules} not specfied.\n"); + mprinterr("Error: for loop type not specfied.\n"); return 1; } argIn.MarkArg(iarg); @@ -42,7 +62,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { // Set up for specific type if (description_ != "for (") description_.append(", "); // ------------------------------------------- - if (ftype == ATOMS || ftype == RESIDUES || ftype == MOLECULES) + if (isMaskFor) { // {atoms|residues|molecules} inmask [TOP KEYWORDS] if (argIn[iarg+2] != "inmask") { @@ -77,12 +97,24 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { curRes = res; } } - } else if (MH.varType_ == MOLECULES) { + } else if (MH.varType_ == MOLECULES || + MH.varType_ == MOLFIRSTRES || + MH.varType_ == MOLLASTRES) + { int curMol = -1; for (AtomMask::const_iterator at = currentMask.begin(); at != currentMask.end(); ++at) { int mol = (*currentTop)[*at].MolNum(); if (mol != curMol) { - MH.Idxs_.push_back( mol ); + if (MH.varType_ == MOLECULES) + MH.Idxs_.push_back( mol ); + else { + int res; + if (MH.varType_ == MOLFIRSTRES) + res = (*currentTop)[ currentTop->Mol( mol ).BeginAtom() ].ResNum(); + else // MOLLASTRES + res = (*currentTop)[ currentTop->Mol( mol ).EndAtom()-1 ].ResNum(); + MH.Idxs_.push_back( res ); + } curMol = mol; } } @@ -258,7 +290,7 @@ void Control_For::Start() { /** For each mask check if done, then update CurrentVars, then increment. */ Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { - static const char* prefix[] = {"@", ":", "^"}; + static const char* prefix[] = {"@", ":", "^", ":", ":"}; for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { // Exit as soon as one is done TODO check all? if (MH->varType_ == INTEGER) { diff --git a/src/Control.h b/src/Control.h index bb30734209..8b51a1d313 100644 --- a/src/Control.h +++ b/src/Control.h @@ -52,7 +52,7 @@ class Control_For : public Control { void Start(); DoneType CheckDone(Varray&); private: - enum ForType {ATOMS=0, RESIDUES, MOLECULES, INTEGER, UNKNOWN}; + enum ForType {ATOMS=0, RESIDUES, MOLECULES, MOLFIRSTRES, MOLLASTRES, INTEGER, UNKNOWN}; enum OpType { INCREMENT, DECREMENT, LESS_THAN, GREATER_THAN, NO_OP }; typedef std::vector Iarray; class MaskHolder { From 53bf0c8c480e65699a15fb6d326ecf0685a95f05 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 11:51:10 -0400 Subject: [PATCH 48/75] DRR - Cpptraj: Do not allow variables to be used as for loop start/end args yet. --- src/Control.cpp | 28 +++++++++------------------- src/Control.h | 2 -- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 9a232e590e..99351879d9 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -142,11 +142,9 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } MH.varname_ = startArg[0]; if (!validInteger(startArg[1])) { - if (startArg[1][0] != '$') { - mprinterr("Error: Expected start argument to be integer or variable.\n"); - return 1; - } - MH.startArg_ = startArg[1]; + // TODO allow variables + mprinterr("Error: Start argument must be an integer.\n"); + return 1; } else MH.start_ = convertToInteger(startArg[1]); // Second argument: @@ -167,11 +165,9 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } std::string endStr = varArg[1].substr(pos1); if (!validInteger(endStr)) { - if (endStr[0] != '$') { - mprinterr("Error: Expected end argument to be integer or variable.\n"); - return 1; - } - MH.endArg_ = endStr; + // TODO allow variables + mprinterr("Error: End argument must be an integer.\n"); + return 1; } else MH.end_ = convertToInteger(endStr); } @@ -215,18 +211,12 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { } // Description MH.varname_ = "$" + MH.varname_; - std::string sval, eval; - if (MH.startArg_.empty()) - sval = integerToString(MH.start_); - else - sval = MH.startArg_; + std::string sval = integerToString(MH.start_); description_.append("(" + MH.varname_ + "=" + sval + "; "); + std::string eval; if (iargIdx == 2) { // End argument present - if (MH.endArg_.empty()) - eval = integerToString(MH.end_); - else - eval = MH.endArg_; + eval = integerToString(MH.end_); description_.append(MH.varname_ + std::string(OpStr[MH.endOp_]) + eval + "; "); // Check end > start for increment, start > end for decrement int maxval, minval; diff --git a/src/Control.h b/src/Control.h index 8b51a1d313..e9f45fca9e 100644 --- a/src/Control.h +++ b/src/Control.h @@ -68,8 +68,6 @@ class Control_For : public Control { int end_; int inc_; int currentVal_; - std::string startArg_; - std::string endArg_; }; typedef std::vector Marray; Marray Masks_; From 728b0d70b0ec5ebddc817f01faee9145e44fdded Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 11:59:36 -0400 Subject: [PATCH 49/75] DRR - Cpptraj: Improve code docs and cleanup variable names. --- src/Control.cpp | 10 +++++----- src/Control.h | 28 ++++++++++++++-------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 99351879d9..80e36c96a6 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -26,7 +26,7 @@ void Control_For::Help() const { /** Set up each mask. */ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { mprintf(" Setting up 'for' loop.\n"); - Masks_.clear(); + Vars_.clear(); Topology* currentTop = 0; static const char* TypeStr[] = { "ATOMS ", "RESIDUES ", "MOLECULES ", "MOL_FIRST_RES ", "MOL_LAST_RES " }; @@ -56,8 +56,8 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { return 1; } argIn.MarkArg(iarg); - Masks_.push_back( MaskHolder() ); - MaskHolder& MH = Masks_.back(); + Vars_.push_back( LoopVar() ); + LoopVar& MH = Vars_.back(); int Niterations = -1; // Set up for specific type if (description_ != "for (") description_.append(", "); @@ -270,7 +270,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { /** For each mask initialize iterator. For each integer set to start value. */ void Control_For::Start() { - for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { + for (Marray::iterator MH = Vars_.begin(); MH != Vars_.end(); ++MH) { if (MH->varType_ == INTEGER) MH->currentVal_ = MH->start_; // TODO search currentvars else @@ -281,7 +281,7 @@ void Control_For::Start() { /** For each mask check if done, then update CurrentVars, then increment. */ Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { static const char* prefix[] = {"@", ":", "^", ":", ":"}; - for (Marray::iterator MH = Masks_.begin(); MH != Masks_.end(); ++MH) { + for (Marray::iterator MH = Vars_.begin(); MH != Vars_.end(); ++MH) { // Exit as soon as one is done TODO check all? if (MH->varType_ == INTEGER) { if (MH->endOp_ == LESS_THAN) { diff --git a/src/Control.h b/src/Control.h index e9f45fca9e..c99fd62a98 100644 --- a/src/Control.h +++ b/src/Control.h @@ -55,22 +55,22 @@ class Control_For : public Control { enum ForType {ATOMS=0, RESIDUES, MOLECULES, MOLFIRSTRES, MOLLASTRES, INTEGER, UNKNOWN}; enum OpType { INCREMENT, DECREMENT, LESS_THAN, GREATER_THAN, NO_OP }; typedef std::vector Iarray; - class MaskHolder { + class LoopVar { public: - MaskHolder() : varType_(UNKNOWN) {} - Iarray Idxs_; ///< Hold selected atom/residue/molecule indices - Iarray::const_iterator idx_; ///< Hold current atom/residue/molecule index - std::string varname_; - ForType varType_; - OpType endOp_; - OpType incOp_; - int start_; - int end_; - int inc_; - int currentVal_; + LoopVar() : varType_(UNKNOWN) {} + Iarray Idxs_; ///< (MASK only) Selected atom/residue/molecule indices + Iarray::const_iterator idx_; ///< (MASK only) Current atom/residue/molecule index + std::string varname_; ///< Loop variable name + ForType varType_; ///< Loop variable type + OpType endOp_; ///< (INTEGER only) end operator + OpType incOp_; ///< (INTEGER only) increment operator + int start_; ///< (INTEGER only) initial value + int end_; ///< (INTEGER only) end value + int inc_; ///< (INTEGER only) increment value + int currentVal_; ///< (INTEGER only) current value }; - typedef std::vector Marray; - Marray Masks_; + typedef std::vector Marray; + Marray Vars_; ArgArray commands_; }; #endif From ad6154cbc3085553d1ef34b2ba8b5778fc893965 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 12:14:14 -0400 Subject: [PATCH 50/75] DRR - Cpptraj: Fix up code docs --- src/Command.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 300a129877..dc2c9c186a 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -388,6 +388,7 @@ void Command::Init() { names_.push_back( 0 ); } +/** Clear any existing control blocks. */ void Command::ClearControlBlocks() { for (CtlArray::iterator it = control_.begin(); it != control_.end(); ++it) delete *it; @@ -546,15 +547,14 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State) ret = control_[block]->CheckDone(CurrentVars_); } if (ret == Control::ERROR) return 1; - //for (int i = 0; i < block; i++) mprintf(" "); - //mprintf("\n"); return 0; } -/** Search for the given command and execute it. EXE commands are executed - * immediately and then freed. ACT and ANA commands are sent to the - * CpptrajState for later execution. CTL commands set up control blocks - * which will be executed when completed. +/** Handle the given command. If inside a control block, if the command is + * a control command a new block will be created, otherwise the command will + * be added to the current control block. Once all control blocks are + * complete they will be executed. If not inside a control block, just + * execute the command. */ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& commandIn) { @@ -605,7 +605,12 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& #undef NEW_BLOCK -/** Search for and execute the given command. */ +/** Search for the given command and execute it. Replace any variables in + * command with their values. EXE commands are executed immediately and + * then freed. ACT and ANA commands are sent to the CpptrajState for later + * execution. CTL commands set up control blocks which will be executed when + * the outer control block is completed. + */ CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList const& cmdArgIn ) { // Replace variable names in command with entries from CurrentVars ArgList cmdArg = CurrentVars_.ReplaceVariables( cmdArgIn ); From a2af2c37e44708e8ba93c43e48fd55a69c92cc7a Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 13:30:45 -0400 Subject: [PATCH 51/75] DRR - Cpptraj: Add a way to set script variables --- src/Command.cpp | 23 ++++++++++++++--------- src/Control.cpp | 31 ++++++++++++++++++++++++++++++- src/Control.h | 40 ++++++++++++++++++++++++++++++---------- 3 files changed, 74 insertions(+), 20 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index dc2c9c186a..86cb565517 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -374,6 +374,7 @@ void Command::Init() { Command::AddCmd( new Analysis_Wavelet(), Cmd::ANA, 1, "wavelet" ); // CONTROL STRUCTURES Command::AddCmd( new Control_For(), Cmd::CTL, 1, "for" ); + Command::AddCmd( new Control_Set(), Cmd::CTL, 1, "set" ); // DEPRECATED COMMANDS Command::AddCmd( new Deprecated_AvgCoord(), Cmd::DEP, 1, "avgcoord" ); Command::AddCmd( new Deprecated_DihScan(), Cmd::DEP, 1, "dihedralscan" ); @@ -509,15 +510,20 @@ bool Command::UnterminatedControl() { /** Create new control block with given Control. */ int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) { - if ( ctl->SetupControl( State, cmdArg ) ) + if ( ctl->SetupControl( State, cmdArg, CurrentVars_ ) ) return 1; - control_.push_back( ctl ); - ctlidx_++; - mprintf(" BLOCK %2i: ", ctlidx_); - for (int i = 0; i < ctlidx_; i++) - mprintf(" "); - mprintf("%s\n", ctl->Description().c_str()); - //mprintf("DEBUG: Begin control block %i\n", ctlidx_); + if ( ctl->IsBlock() ) { + if (ctlidx_ == -1) mprintf("CONTROL: Starting control block.\n"); + control_.push_back( ctl ); + ctlidx_++; + mprintf(" BLOCK %2i: ", ctlidx_); + for (int i = 0; i < ctlidx_; i++) + mprintf(" "); + mprintf("%s\n", ctl->Description().c_str()); + //mprintf("DEBUG: Begin control block %i\n", ctlidx_); + } else + // Not a block. Can delete now. + delete ctl; return 0; } @@ -636,7 +642,6 @@ CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList cons DispatchObject* obj = cmd.Alloc(); switch (cmd.Destination()) { case Cmd::CTL: - mprintf("CONTROL: Starting control block.\n"); if (AddControlBlock( (Control*)obj, State, cmdArg )) { delete obj; return CpptrajState::ERR; diff --git a/src/Control.cpp b/src/Control.cpp index 80e36c96a6..5957560e21 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -24,7 +24,7 @@ void Control_For::Help() const { } /** Set up each mask. */ -int Control_For::SetupControl(CpptrajState& State, ArgList& argIn) { +int Control_For::SetupControl(CpptrajState& State, ArgList& argIn, Varray& CurrentVars) { mprintf(" Setting up 'for' loop.\n"); Vars_.clear(); Topology* currentTop = 0; @@ -306,3 +306,32 @@ Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { } return NOT_DONE; } + +// ============================================================================= +void Control_Set::Help() const { + mprintf("\t=\n"); +} + +int Control_Set::SetupControl(CpptrajState& State, ArgList& argIn, Varray& CurrentVars) +{ + int iarg = 0; + while (iarg < argIn.Nargs()) { + while (iarg < argIn.Nargs() && argIn.Marked(iarg)) iarg++; + if (iarg == argIn.Nargs()) break; + if ( argIn[iarg].find("=") != std::string::npos ) { + // = + ArgList equals( argIn[iarg], "=" ); + if (equals.Nargs() != 2) { + mprinterr("Error: Expected =\n"); + return 1; + } + CurrentVars.UpdateVariable( "$" + equals[0], equals[1] ); + mprintf("\tVariable '%s' set to '%s'\n", equals[0].c_str(), equals[1].c_str()); + argIn.MarkArg(iarg); + } else { + mprinterr("Error: Unrecognized syntax: %s\n", argIn[iarg].c_str()); + return 1; + } + } + return 0; +} diff --git a/src/Control.h b/src/Control.h index c99fd62a98..60ee2b301e 100644 --- a/src/Control.h +++ b/src/Control.h @@ -7,22 +7,24 @@ class Control : public DispatchObject { public: typedef std::vector ArgArray; typedef ArgArray::const_iterator const_iterator; + /// Hold variable/value pairs + typedef VariableArray Varray; + Control() : DispatchObject(CONTROL) {} /// Set up control structure. - virtual int SetupControl(CpptrajState&, ArgList&) = 0; + virtual int SetupControl(CpptrajState&, ArgList&, Varray&) = 0; + /// \return true if this is a control block, false otherwise. + virtual bool IsBlock() const = 0; + + // ----- BLOCK ------------------------------- + /// \return Description of control structure. + std::string const& Description() const { return description_; } /// Check for control structure end command. virtual bool EndControl(ArgList const&) const = 0; /// Add command to control structure. virtual void AddCommand(ArgList const&) = 0; - /// \return Description of control structure. - std::string const& Description() const { return description_; } enum DoneType { DONE = 0, NOT_DONE, ERROR }; - - /// Hold variable/value pairs - typedef VariableArray Varray; - /// \return Number of commands in the block - virtual unsigned int Ncommands() const = 0; /// \return iterator to first command in the block. virtual const_iterator begin() const = 0; /// \return iterator to last command in the block. @@ -42,11 +44,11 @@ class Control_For : public Control { void Help() const; DispatchObject* Alloc() const { return (DispatchObject*)new Control_For(); } - int SetupControl(CpptrajState&, ArgList&); + int SetupControl(CpptrajState&, ArgList&, Varray&); bool EndControl(ArgList const& a) const { return (a.CommandIs("done")); } void AddCommand(ArgList const& c) { commands_.push_back(c); } + bool IsBlock() const { return true; } - unsigned int Ncommands() const { return commands_.size(); } const_iterator begin() const { return commands_.begin(); } const_iterator end() const { return commands_.end(); } void Start(); @@ -73,4 +75,22 @@ class Control_For : public Control { Marray Vars_; ArgArray commands_; }; + +/// Create/update script variables +class Control_Set : public Control { + public: + Control_Set() {} + void Help() const; + DispatchObject* Alloc() const { return (DispatchObject*)new Control_Set(); } + + int SetupControl(CpptrajState&, ArgList&, Varray&); + bool IsBlock() const { return false; } + + bool EndControl(ArgList const& a) const { return false; } + void AddCommand(ArgList const& c) {} + const_iterator begin() const { return const_iterator(); } + const_iterator end() const { return const_iterator(); } + void Start() {} + DoneType CheckDone(Varray&) { return ERROR; } +}; #endif From eea426c9c2aaa94b0b498bdf4ae65ce36eb2f996 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 3 Oct 2017 13:47:05 -0400 Subject: [PATCH 52/75] DRR - Cpptraj: Code cleanup --- src/Command.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Command.h b/src/Command.h index 089fdb4920..f05c2440ab 100644 --- a/src/Command.h +++ b/src/Command.h @@ -9,8 +9,6 @@ class Command { static void Free(); /// List commands of given type, or all if type is NONE static void ListCommands(DispatchObject::Otype); - /// Add a command to the list of commands - static void AddCmd(DispatchObject*, Cmd::DestType, int, ...); /// \return command corresponding to first argument in ArgList. static Cmd const& SearchToken(ArgList&); /// \return command of given type corresponding to given command key. @@ -24,12 +22,19 @@ class Command { /// \return Pointer to command name address. static const char* CmdToken(int idx) { return names_[idx]; } private: + /// Add a command to the list of commands + static void AddCmd(DispatchObject*, Cmd::DestType, int, ...); + /// Search for command of given type with given name; can be silent. static Cmd const& SearchTokenType(DispatchObject::Otype, const char*, bool); + /// List all commands for given type static void ListCommandsForType(DispatchObject::Otype); + /// Clear all existing control blocks static void ClearControlBlocks(); + /// Add a new control block static int AddControlBlock(Control*, CpptrajState&, ArgList&); - static ArgList ReplaceVariables(ArgList const&); + /// Execute specified control block static int ExecuteControlBlock(int, CpptrajState&); + /// Execute given command static CpptrajState::RetType ExecuteCommand(CpptrajState&, ArgList const&); static CmdList commands_; ///< Master list of commands. From f0023bbdb899329ce20d4fb6491f3e98986535e7 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 4 Oct 2017 08:31:07 -0400 Subject: [PATCH 53/75] DRR - Cpptraj: Allow any amount of whitespace in set. --- src/Control.cpp | 32 +++++++++++++------------------- src/Control.h | 4 ++-- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 5957560e21..9951c744ba 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -309,29 +309,23 @@ Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { // ============================================================================= void Control_Set::Help() const { - mprintf("\t=\n"); + mprintf("\t=\n" + " Set script variable to value .\n"); } int Control_Set::SetupControl(CpptrajState& State, ArgList& argIn, Varray& CurrentVars) { - int iarg = 0; - while (iarg < argIn.Nargs()) { - while (iarg < argIn.Nargs() && argIn.Marked(iarg)) iarg++; - if (iarg == argIn.Nargs()) break; - if ( argIn[iarg].find("=") != std::string::npos ) { - // = - ArgList equals( argIn[iarg], "=" ); - if (equals.Nargs() != 2) { - mprinterr("Error: Expected =\n"); - return 1; - } - CurrentVars.UpdateVariable( "$" + equals[0], equals[1] ); - mprintf("\tVariable '%s' set to '%s'\n", equals[0].c_str(), equals[1].c_str()); - argIn.MarkArg(iarg); - } else { - mprinterr("Error: Unrecognized syntax: %s\n", argIn[iarg].c_str()); - return 1; - } + // In this case allow any amount of whitespace, so re-tokenize the original + // argument line, minus the command. + ArgList remaining = argIn.RemainingArgs(); + ArgList equals( remaining.ArgLineStr(), " =" ); + if (equals.Nargs() != 2) { + mprinterr("Error: Expected =\n"); + return 1; } + CurrentVars.UpdateVariable( "$" + equals[0], equals[1] ); + mprintf("\tVariable '%s' set to '%s'\n", equals[0].c_str(), equals[1].c_str()); + for (int iarg = 0; iarg < argIn.Nargs(); iarg++) + argIn.MarkArg( iarg ); return 0; } diff --git a/src/Control.h b/src/Control.h index 60ee2b301e..eb7bf9e489 100644 --- a/src/Control.h +++ b/src/Control.h @@ -23,7 +23,7 @@ class Control : public DispatchObject { virtual bool EndControl(ArgList const&) const = 0; /// Add command to control structure. virtual void AddCommand(ArgList const&) = 0; - + /// Control states enum DoneType { DONE = 0, NOT_DONE, ERROR }; /// \return iterator to first command in the block. virtual const_iterator begin() const = 0; @@ -37,7 +37,7 @@ class Control : public DispatchObject { std::string description_; ///< Describe control TODO private? }; -/// Loop over mask expression etc +/// Loop over mask expression or integer class Control_For : public Control { public: Control_For() {} From 1b6b60ef1e2b62525a885f35725d3dfd8ec30d50 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 4 Oct 2017 08:32:33 -0400 Subject: [PATCH 54/75] DRR - Cpptraj: Add loops test --- test/Test_Control/RunTest.sh | 42 +++++++++++++++++++++++++ test/Test_Control/TRP.CA.dist.dat.save | 11 +++++++ test/Test_Control/TRP.rms.dat.save | 11 +++++++ test/Test_Control/TRP.tocenter.dat.save | 11 +++++++ test/Test_Control/TRP.vec.dat.save | 11 +++++++ test/Test_Control/nh.dat.save | 11 +++++++ test/Test_Control/rms.nofit.dat.save | 11 +++++++ 7 files changed, 108 insertions(+) create mode 100755 test/Test_Control/RunTest.sh create mode 100644 test/Test_Control/TRP.CA.dist.dat.save create mode 100644 test/Test_Control/TRP.rms.dat.save create mode 100644 test/Test_Control/TRP.tocenter.dat.save create mode 100644 test/Test_Control/TRP.vec.dat.save create mode 100644 test/Test_Control/nh.dat.save create mode 100644 test/Test_Control/rms.nofit.dat.save diff --git a/test/Test_Control/RunTest.sh b/test/Test_Control/RunTest.sh new file mode 100755 index 0000000000..ed25d5fc41 --- /dev/null +++ b/test/Test_Control/RunTest.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +. ../MasterTest.sh + +CleanFiles for.in TRP.vec.dat TRP.rms.dat TRP.CA.dist.dat TRP.tocenter.dat \ + nh.dat rms.nofit.dat + +INPUT='-i for.in' +cat > for.in < Date: Wed, 4 Oct 2017 09:05:35 -0400 Subject: [PATCH 55/75] DRR - Cpptraj: Distinguish control blocks from controls. --- src/Cmd.h | 4 +-- src/Command.cpp | 54 ++++++++++++++++++------------------- src/Command.h | 6 ++--- src/Control.cpp | 24 +++++++++-------- src/Control.h | 60 ++++++++++++++++++------------------------ src/DispatchObject.cpp | 1 + src/DispatchObject.h | 2 +- 7 files changed, 72 insertions(+), 79 deletions(-) diff --git a/src/Cmd.h b/src/Cmd.h index ddbd61f75b..acfb96efbe 100644 --- a/src/Cmd.h +++ b/src/Cmd.h @@ -11,8 +11,8 @@ class Cmd { public: typedef std::vector< std::string > Sarray; // TODO put in common header? - /// Command destinations. EXEcute, ACTion, ANAlysis, ConTroL, DEPrecated. - enum DestType { EXE = 0, ACT, ANA, CTL, DEP }; + /// Command destinations. EXEcute, ACTion, ANAlysis, ConTroL, BLocK, DEPrecated. + enum DestType { EXE = 0, ACT, ANA, CTL, BLK, DEP }; /// CONSTRUCTOR Cmd() : object_(0), dest_(EXE) {} /// CONSTRUCTOR - takes destination, DispatchObject pointer, and keywords. diff --git a/src/Command.cpp b/src/Command.cpp index 86cb565517..1caaa3d8e7 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -179,7 +179,7 @@ Command::CtlArray Command::control_ = Command::CtlArray(); int Command::ctlidx_ = -1; -Control::Varray Command::CurrentVars_ = Control::Varray(); +VariableArray Command::CurrentVars_ = VariableArray(); /** Initialize all commands. Should only be called once as program starts. */ void Command::Init() { @@ -373,7 +373,7 @@ void Command::Init() { Command::AddCmd( new Analysis_VectorMath(), Cmd::ANA, 1, "vectormath" ); Command::AddCmd( new Analysis_Wavelet(), Cmd::ANA, 1, "wavelet" ); // CONTROL STRUCTURES - Command::AddCmd( new Control_For(), Cmd::CTL, 1, "for" ); + Command::AddCmd( new ControlBlock_For(), Cmd::BLK, 1, "for" ); Command::AddCmd( new Control_Set(), Cmd::CTL, 1, "set" ); // DEPRECATED COMMANDS Command::AddCmd( new Deprecated_AvgCoord(), Cmd::DEP, 1, "avgcoord" ); @@ -508,22 +508,18 @@ bool Command::UnterminatedControl() { return false; } -/** Create new control block with given Control. */ -int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) { - if ( ctl->SetupControl( State, cmdArg, CurrentVars_ ) ) +/** Create new control block with given Block. */ +int Command::AddControlBlock(ControlBlock* ctl, CpptrajState& State, ArgList& cmdArg) { + if ( ctl->SetupBlock( State, cmdArg ) ) return 1; - if ( ctl->IsBlock() ) { - if (ctlidx_ == -1) mprintf("CONTROL: Starting control block.\n"); - control_.push_back( ctl ); - ctlidx_++; - mprintf(" BLOCK %2i: ", ctlidx_); - for (int i = 0; i < ctlidx_; i++) - mprintf(" "); - mprintf("%s\n", ctl->Description().c_str()); - //mprintf("DEBUG: Begin control block %i\n", ctlidx_); - } else - // Not a block. Can delete now. - delete ctl; + if (ctlidx_ == -1) mprintf("CONTROL: Starting control block.\n"); + control_.push_back( ctl ); + ctlidx_++; + mprintf(" BLOCK %2i: ", ctlidx_); + for (int i = 0; i < ctlidx_; i++) + mprintf(" "); + mprintf("%s\n", ctl->Description().c_str()); + //mprintf("DEBUG: Begin control block %i\n", ctlidx_); return 0; } @@ -532,14 +528,14 @@ int Command::AddControlBlock(Control* ctl, CpptrajState& State, ArgList& cmdArg) int Command::ExecuteControlBlock(int block, CpptrajState& State) { control_[block]->Start(); - Control::DoneType ret = control_[block]->CheckDone(CurrentVars_); + ControlBlock::DoneType ret = control_[block]->CheckDone(CurrentVars_); if (State.Debug() > 0) { mprintf("DEBUG: Start: CurrentVars:"); CurrentVars_.PrintVariables(); } - while (ret == Control::NOT_DONE) { - for (Control::const_iterator it = control_[block]->begin(); - it != control_[block]->end(); ++it) + while (ret == ControlBlock::NOT_DONE) { + for (ControlBlock::const_iterator it = control_[block]->begin(); + it != control_[block]->end(); ++it) { if (it->CommandIs(NEW_BLOCK)) { // Execute next control block @@ -552,7 +548,7 @@ int Command::ExecuteControlBlock(int block, CpptrajState& State) } ret = control_[block]->CheckDone(CurrentVars_); } - if (ret == Control::ERROR) return 1; + if (ret == ControlBlock::ERROR) return 1; return 0; } @@ -570,7 +566,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& if (!control_.empty()) { mprintf(" [%s]\n", cmdArg.ArgLine()); // In control block. Check if current block should end. - if ( control_[ctlidx_]->EndControl( cmdArg ) ) { + if ( control_[ctlidx_]->EndBlock( cmdArg ) ) { //mprintf("DEBUG: End control block %i.\n", ctlidx_); mprintf(" BLOCK %2i: ", ctlidx_); for (int i = 0; i < ctlidx_; i++) @@ -586,8 +582,8 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& mprintf("CONTROL: Control block finished.\n\n"); } } else { - // Check if this is another control statement (silently) - Cmd const& ctlCmd = SearchTokenType(DispatchObject::CONTROL, cmdArg.Command(), true); + // Check if this is another control block statement (silently) + Cmd const& ctlCmd = SearchTokenType(DispatchObject::BLOCK, cmdArg.Command(), true); if (ctlCmd.Empty()) { // Add this command to current control block. control_[ctlidx_]->AddCommand( cmdArg ); @@ -597,7 +593,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& control_[ctlidx_]->AddCommand(NEW_BLOCK); // Create new control block DispatchObject* obj = ctlCmd.Alloc(); - if (AddControlBlock( (Control*)obj, State, cmdArg )) { + if (AddControlBlock( (ControlBlock*)obj, State, cmdArg )) { delete obj; ClearControlBlocks(); return CpptrajState::ERR; @@ -642,7 +638,11 @@ CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList cons DispatchObject* obj = cmd.Alloc(); switch (cmd.Destination()) { case Cmd::CTL: - if (AddControlBlock( (Control*)obj, State, cmdArg )) { + ret_val = ((Control_Set*)obj)->SetupControl(State, cmdArg, CurrentVars_); + delete obj; + break; + case Cmd::BLK: + if (AddControlBlock( (ControlBlock*)obj, State, cmdArg )) { delete obj; return CpptrajState::ERR; } diff --git a/src/Command.h b/src/Command.h index f05c2440ab..2d9ea426b7 100644 --- a/src/Command.h +++ b/src/Command.h @@ -31,7 +31,7 @@ class Command { /// Clear all existing control blocks static void ClearControlBlocks(); /// Add a new control block - static int AddControlBlock(Control*, CpptrajState&, ArgList&); + static int AddControlBlock(ControlBlock*, CpptrajState&, ArgList&); /// Execute specified control block static int ExecuteControlBlock(int, CpptrajState&); /// Execute given command @@ -41,10 +41,10 @@ class Command { static const Cmd EMPTY_; ///< Empty command. typedef std::vector Carray; static Carray names_; ///< Array of pointers to all command names, for ReadLine - typedef std::vector CtlArray; + typedef std::vector CtlArray; static CtlArray control_; ///< Array of control blocks static int ctlidx_; ///< Point to current control block /// Array of script variables and their current values. - static Control::Varray CurrentVars_; + static VariableArray CurrentVars_; }; #endif diff --git a/src/Control.cpp b/src/Control.cpp index 9951c744ba..485ee3018f 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -3,7 +3,7 @@ #include "CpptrajStdio.h" #include "StringRoutines.h" -void Control_For::Help() const { +void ControlBlock_For::Help() const { mprintf("\t{ {atoms|residues|molecules|molfirstres|mollastres}\n" "\t inmask %s ... |\n" "\t =;[;][] ... }\n", @@ -23,8 +23,8 @@ void Control_For::Help() const { "\tdone\n"); } -/** Set up each mask. */ -int Control_For::SetupControl(CpptrajState& State, ArgList& argIn, Varray& CurrentVars) { +/** Set up each mask/integer loop. */ +int ControlBlock_For::SetupBlock(CpptrajState& State, ArgList& argIn) { mprintf(" Setting up 'for' loop.\n"); Vars_.clear(); Topology* currentTop = 0; @@ -269,7 +269,7 @@ int Control_For::SetupControl(CpptrajState& State, ArgList& argIn, Varray& Curre } /** For each mask initialize iterator. For each integer set to start value. */ -void Control_For::Start() { +void ControlBlock_For::Start() { for (Marray::iterator MH = Vars_.begin(); MH != Vars_.end(); ++MH) { if (MH->varType_ == INTEGER) MH->currentVal_ = MH->start_; // TODO search currentvars @@ -279,7 +279,7 @@ void Control_For::Start() { } /** For each mask check if done, then update CurrentVars, then increment. */ -Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { +ControlBlock::DoneType ControlBlock_For::CheckDone(Varray& CurrentVars) { static const char* prefix[] = {"@", ":", "^", ":", ":"}; for (Marray::iterator MH = Vars_.begin(); MH != Vars_.end(); ++MH) { // Exit as soon as one is done TODO check all? @@ -297,7 +297,7 @@ Control::DoneType Control_For::CheckDone(Varray& CurrentVars) { if (MH->idx_ == MH->Idxs_.end()) return DONE; // Get variable value std::string maskStr = prefix[MH->varType_] + integerToString(*(MH->idx_) + 1); - //mprintf("DEBUG: Control_For: %s\n", maskStr.c_str()); + //mprintf("DEBUG: ControlBlock_For: %s\n", maskStr.c_str()); // Update CurrentVars CurrentVars.UpdateVariable( MH->varname_, maskStr ); // Increment @@ -313,19 +313,21 @@ void Control_Set::Help() const { " Set script variable to value .\n"); } -int Control_Set::SetupControl(CpptrajState& State, ArgList& argIn, Varray& CurrentVars) +/** Set up variable with value. In this case allow any amount of whitespace, + * so re-tokenize the original argument line (minus the command). + */ +CpptrajState::RetType + Control_Set::SetupControl(CpptrajState& State, ArgList& argIn, Varray& CurrentVars) { - // In this case allow any amount of whitespace, so re-tokenize the original - // argument line, minus the command. ArgList remaining = argIn.RemainingArgs(); ArgList equals( remaining.ArgLineStr(), " =" ); if (equals.Nargs() != 2) { mprinterr("Error: Expected =\n"); - return 1; + return CpptrajState::ERR; } CurrentVars.UpdateVariable( "$" + equals[0], equals[1] ); mprintf("\tVariable '%s' set to '%s'\n", equals[0].c_str(), equals[1].c_str()); for (int iarg = 0; iarg < argIn.Nargs(); iarg++) argIn.MarkArg( iarg ); - return 0; + return CpptrajState::OK; } diff --git a/src/Control.h b/src/Control.h index eb7bf9e489..07af311657 100644 --- a/src/Control.h +++ b/src/Control.h @@ -2,53 +2,48 @@ #define INC_CONTROL_H #include "CpptrajState.h" #include "VariableArray.h" -/// Control structures. -class Control : public DispatchObject { +/// Control block structures. +class ControlBlock : public DispatchObject { public: typedef std::vector ArgArray; typedef ArgArray::const_iterator const_iterator; /// Hold variable/value pairs typedef VariableArray Varray; + /// Control block states + enum DoneType { DONE = 0, NOT_DONE, ERROR }; - Control() : DispatchObject(CONTROL) {} - /// Set up control structure. - virtual int SetupControl(CpptrajState&, ArgList&, Varray&) = 0; - /// \return true if this is a control block, false otherwise. - virtual bool IsBlock() const = 0; - - // ----- BLOCK ------------------------------- - /// \return Description of control structure. + ControlBlock() : DispatchObject(BLOCK) {} + virtual ~ControlBlock() {} + /// \return Description of control block. std::string const& Description() const { return description_; } - /// Check for control structure end command. - virtual bool EndControl(ArgList const&) const = 0; - /// Add command to control structure. + /// Set up control block. + virtual int SetupBlock(CpptrajState&, ArgList&) = 0; + /// Check for control block end command. + virtual bool EndBlock(ArgList const&) const = 0; + /// Add command to control block. virtual void AddCommand(ArgList const&) = 0; - /// Control states - enum DoneType { DONE = 0, NOT_DONE, ERROR }; /// \return iterator to first command in the block. virtual const_iterator begin() const = 0; /// \return iterator to last command in the block. virtual const_iterator end() const = 0; /// Start control block. Init internal variables if necessary. virtual void Start() = 0; - /// Add/update variables and increment, check control state. + /// Add/update variables and increment, check block state. virtual DoneType CheckDone(Varray&) = 0; protected: std::string description_; ///< Describe control TODO private? }; /// Loop over mask expression or integer -class Control_For : public Control { +class ControlBlock_For : public ControlBlock { public: - Control_For() {} + ControlBlock_For() {} void Help() const; - DispatchObject* Alloc() const { return (DispatchObject*)new Control_For(); } + DispatchObject* Alloc() const { return (DispatchObject*)new ControlBlock_For(); } - int SetupControl(CpptrajState&, ArgList&, Varray&); - bool EndControl(ArgList const& a) const { return (a.CommandIs("done")); } + int SetupBlock(CpptrajState&, ArgList&); + bool EndBlock(ArgList const& a) const { return (a.CommandIs("done")); } void AddCommand(ArgList const& c) { commands_.push_back(c); } - bool IsBlock() const { return true; } - const_iterator begin() const { return commands_.begin(); } const_iterator end() const { return commands_.end(); } void Start(); @@ -75,22 +70,17 @@ class Control_For : public Control { Marray Vars_; ArgArray commands_; }; - +// ============================================================================= /// Create/update script variables -class Control_Set : public Control { +class Control_Set : public DispatchObject { public: - Control_Set() {} + /// Hold variable/value pairs + typedef VariableArray Varray; + + Control_Set() : DispatchObject(CONTROL) {} void Help() const; DispatchObject* Alloc() const { return (DispatchObject*)new Control_Set(); } - int SetupControl(CpptrajState&, ArgList&, Varray&); - bool IsBlock() const { return false; } - - bool EndControl(ArgList const& a) const { return false; } - void AddCommand(ArgList const& c) {} - const_iterator begin() const { return const_iterator(); } - const_iterator end() const { return const_iterator(); } - void Start() {} - DoneType CheckDone(Varray&) { return ERROR; } + CpptrajState::RetType SetupControl(CpptrajState&, ArgList&, Varray&); }; #endif diff --git a/src/DispatchObject.cpp b/src/DispatchObject.cpp index d800907018..487d725ac9 100644 --- a/src/DispatchObject.cpp +++ b/src/DispatchObject.cpp @@ -12,6 +12,7 @@ const char* DispatchObject::ObjKeyword(Otype typeIn) { case GENERAL: return "General"; case SYSTEM: return "System"; case CONTROL: return "Control"; + case BLOCK: return "Block"; case HIDDEN: return 0; case DEPRECATED: return 0; } diff --git a/src/DispatchObject.h b/src/DispatchObject.h index 1719b5c6e7..5dec098d27 100644 --- a/src/DispatchObject.h +++ b/src/DispatchObject.h @@ -9,7 +9,7 @@ class DispatchObject { public: /// Object categories. HIDDEN and DEPRECATED should always be last. enum Otype { NONE=0, GENERAL, SYSTEM, COORDS, TRAJ, PARM, ACTION, ANALYSIS, - CONTROL, + CONTROL, BLOCK, HIDDEN, DEPRECATED }; /// CONSTRUCTOR DispatchObject() : type_(NONE) {} From 2d87483fbc91a59051f41f336cf18fd5476f2688 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 4 Oct 2017 09:08:30 -0400 Subject: [PATCH 56/75] DRR - Cpptraj: Add test requirements and enable test. --- test/Makefile | 6 +++++- test/Test_Control/RunTest.sh | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/test/Makefile b/test/Makefile index 75bc462826..5db7095b2e 100644 --- a/test/Makefile +++ b/test/Makefile @@ -423,6 +423,9 @@ test.scaledihedralk: test.phipsi: @-cd Test_PhiPsi && ./RunTest.sh $(OPT) +test.control: + @-cd Test_Control && ./RunTest.sh $(OPT) + # Every test target should go here. COMPLETETESTS=test.general \ test.strip \ @@ -559,7 +562,8 @@ COMPLETETESTS=test.general \ test.translate \ test.replicatecell \ test.scaledihedralk \ - test.phipsi + test.phipsi \ + test.control test.all: $(MAKE) test.complete summary diff --git a/test/Test_Control/RunTest.sh b/test/Test_Control/RunTest.sh index ed25d5fc41..4dedf52c8d 100755 --- a/test/Test_Control/RunTest.sh +++ b/test/Test_Control/RunTest.sh @@ -5,6 +5,9 @@ CleanFiles for.in TRP.vec.dat TRP.rms.dat TRP.CA.dist.dat TRP.tocenter.dat \ nh.dat rms.nofit.dat +TESTNAME='Loop tests' +Requires netcdf maxthreads 10 + INPUT='-i for.in' cat > for.in < Date: Wed, 4 Oct 2017 09:18:06 -0400 Subject: [PATCH 57/75] DRR - Cpptraj: Make Control inheritable --- src/Command.cpp | 2 +- src/Control.h | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 1caaa3d8e7..e6f5574c2e 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -638,7 +638,7 @@ CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList cons DispatchObject* obj = cmd.Alloc(); switch (cmd.Destination()) { case Cmd::CTL: - ret_val = ((Control_Set*)obj)->SetupControl(State, cmdArg, CurrentVars_); + ret_val = ((Control*)obj)->SetupControl(State, cmdArg, CurrentVars_); delete obj; break; case Cmd::BLK: diff --git a/src/Control.h b/src/Control.h index 07af311657..0d66adac7d 100644 --- a/src/Control.h +++ b/src/Control.h @@ -71,13 +71,22 @@ class ControlBlock_For : public ControlBlock { ArgArray commands_; }; // ============================================================================= -/// Create/update script variables -class Control_Set : public DispatchObject { +/// Work with script variables +class Control : public DispatchObject { public: /// Hold variable/value pairs typedef VariableArray Varray; - Control_Set() : DispatchObject(CONTROL) {} + Control() : DispatchObject(CONTROL) {} + virtual ~Control() {} + virtual CpptrajState::RetType SetupControl(CpptrajState&, ArgList&, Varray&) = 0; +}; + +/// Create/update script variables +class Control_Set : public Control { + public: + + Control_Set() {} void Help() const; DispatchObject* Alloc() const { return (DispatchObject*)new Control_Set(); } From 18c219f01392500fca2feaf736c04f8c7b9cd03d Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 4 Oct 2017 10:54:41 -0400 Subject: [PATCH 58/75] DRR - Cpptraj: Add 'show' command --- src/Command.cpp | 1 + src/Control.cpp | 13 +++++++++++++ src/Control.h | 11 ++++++++++- test/Test_Control/RunTest.sh | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Command.cpp b/src/Command.cpp index e6f5574c2e..4411a83294 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -375,6 +375,7 @@ void Command::Init() { // CONTROL STRUCTURES Command::AddCmd( new ControlBlock_For(), Cmd::BLK, 1, "for" ); Command::AddCmd( new Control_Set(), Cmd::CTL, 1, "set" ); + Command::AddCmd( new Control_Show(), Cmd::CTL, 1, "show" ); // DEPRECATED COMMANDS Command::AddCmd( new Deprecated_AvgCoord(), Cmd::DEP, 1, "avgcoord" ); Command::AddCmd( new Deprecated_DihScan(), Cmd::DEP, 1, "dihedralscan" ); diff --git a/src/Control.cpp b/src/Control.cpp index 485ee3018f..a5c20a2cf6 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -331,3 +331,16 @@ CpptrajState::RetType argIn.MarkArg( iarg ); return CpptrajState::OK; } +// ----------------------------------------------------------------------------- +void Control_Show::Help() const { + mprintf(" Show all current script variables and their values.\n"); +} + +CpptrajState::RetType + Control_Show::SetupControl(CpptrajState& State, ArgList& argIn, Varray& CurrentVars) +{ + //for (Varray::const_iterator it = CurrentVars.begin(); it != CurrentVars.end(); ++it) + // mprintf("\t%s = %s\n", it->first.c_str(), it->second.c_str()); + CurrentVars.PrintVariables(); + return CpptrajState::OK; +} diff --git a/src/Control.h b/src/Control.h index 0d66adac7d..1490c2d853 100644 --- a/src/Control.h +++ b/src/Control.h @@ -85,11 +85,20 @@ class Control : public DispatchObject { /// Create/update script variables class Control_Set : public Control { public: - Control_Set() {} void Help() const; DispatchObject* Alloc() const { return (DispatchObject*)new Control_Set(); } CpptrajState::RetType SetupControl(CpptrajState&, ArgList&, Varray&); }; + +/// List all variables and values. +class Control_Show : public Control { + public: + Control_Show() {} + void Help() const; + DispatchObject* Alloc() const { return (DispatchObject*)new Control_Show(); } + + CpptrajState::RetType SetupControl(CpptrajState&, ArgList&, Varray&); +}; #endif diff --git a/test/Test_Control/RunTest.sh b/test/Test_Control/RunTest.sh index 4dedf52c8d..c71919fc82 100755 --- a/test/Test_Control/RunTest.sh +++ b/test/Test_Control/RunTest.sh @@ -30,6 +30,7 @@ rms :1-12&!@H= for residues R1 inmask :1-12 r=1;r++ rms R\$r \$R1&!@H= nofit out rms.nofit.dat done +show EOF RunCpptraj "$TESTNAME" DoTest TRP.vec.dat.save TRP.vec.dat From 225ee81f007f167733993a65b841acd7a2da2b28 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 4 Oct 2017 13:10:19 -0400 Subject: [PATCH 59/75] DRR - Cpptraj: No need for separate BLOCK DispatchObject; 'for' is distinguished by its destination. This way it shows up in the CONTROL category for help. --- src/Command.cpp | 4 ++-- src/Control.h | 2 +- src/DispatchObject.cpp | 1 - src/DispatchObject.h | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 4411a83294..5fea571ca5 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -584,8 +584,8 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& } } else { // Check if this is another control block statement (silently) - Cmd const& ctlCmd = SearchTokenType(DispatchObject::BLOCK, cmdArg.Command(), true); - if (ctlCmd.Empty()) { + Cmd const& ctlCmd = SearchTokenType(DispatchObject::CONTROL, cmdArg.Command(), true); + if (ctlCmd.Empty() || ctlCmd.Destination() != Cmd::BLK) { // TODO just check Destination? // Add this command to current control block. control_[ctlidx_]->AddCommand( cmdArg ); mprintf("\tAdded command '%s' to control block %i.\n", cmdArg.Command(), ctlidx_); diff --git a/src/Control.h b/src/Control.h index 1490c2d853..885678f71b 100644 --- a/src/Control.h +++ b/src/Control.h @@ -12,7 +12,7 @@ class ControlBlock : public DispatchObject { /// Control block states enum DoneType { DONE = 0, NOT_DONE, ERROR }; - ControlBlock() : DispatchObject(BLOCK) {} + ControlBlock() : DispatchObject(CONTROL) {} virtual ~ControlBlock() {} /// \return Description of control block. std::string const& Description() const { return description_; } diff --git a/src/DispatchObject.cpp b/src/DispatchObject.cpp index 487d725ac9..d800907018 100644 --- a/src/DispatchObject.cpp +++ b/src/DispatchObject.cpp @@ -12,7 +12,6 @@ const char* DispatchObject::ObjKeyword(Otype typeIn) { case GENERAL: return "General"; case SYSTEM: return "System"; case CONTROL: return "Control"; - case BLOCK: return "Block"; case HIDDEN: return 0; case DEPRECATED: return 0; } diff --git a/src/DispatchObject.h b/src/DispatchObject.h index 5dec098d27..1719b5c6e7 100644 --- a/src/DispatchObject.h +++ b/src/DispatchObject.h @@ -9,7 +9,7 @@ class DispatchObject { public: /// Object categories. HIDDEN and DEPRECATED should always be last. enum Otype { NONE=0, GENERAL, SYSTEM, COORDS, TRAJ, PARM, ACTION, ANALYSIS, - CONTROL, BLOCK, + CONTROL, HIDDEN, DEPRECATED }; /// CONSTRUCTOR DispatchObject() : type_(NONE) {} From 21c51121e849d9c84a02c6b13a0428b366e1ee16 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 4 Oct 2017 13:25:04 -0400 Subject: [PATCH 60/75] DRR - Cpptraj: Update code comments. --- src/Command.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 5fea571ca5..b00244435d 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -566,8 +566,9 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& // Check for control block if (!control_.empty()) { mprintf(" [%s]\n", cmdArg.ArgLine()); - // In control block. Check if current block should end. + // In control block. if ( control_[ctlidx_]->EndBlock( cmdArg ) ) { + // End the current control block. //mprintf("DEBUG: End control block %i.\n", ctlidx_); mprintf(" BLOCK %2i: ", ctlidx_); for (int i = 0; i < ctlidx_; i++) @@ -609,9 +610,9 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& #undef NEW_BLOCK /** Search for the given command and execute it. Replace any variables in - * command with their values. EXE commands are executed immediately and - * then freed. ACT and ANA commands are sent to the CpptrajState for later - * execution. CTL commands set up control blocks which will be executed when + * command with their values. EXE and CTL commands are executed immediately + * and then freed. ACT and ANA commands are sent to the CpptrajState for later + * execution. BLK commands set up control blocks which will be executed when * the outer control block is completed. */ CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList const& cmdArgIn ) { @@ -624,7 +625,7 @@ CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList cons Cmd const& cmd = SearchToken( cmdArg ); CpptrajState::RetType ret_val = CpptrajState::OK; if (cmd.Empty()) { - // Try to evaluate the expression + // Not a command. Try to evaluate the expression RPNcalc calc; calc.SetDebug( State.Debug() ); if (calc.ProcessExpression( cmdArg.ArgLineStr() )) From bce55c5a9d0b4fbefbb5c80102e9fec0504df64b Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 6 Oct 2017 09:25:18 -0400 Subject: [PATCH 61/75] DRR - Cpptraj: Add routines to remove leading whitespace --- src/StringRoutines.cpp | 13 +++++++++++++ src/StringRoutines.h | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/src/StringRoutines.cpp b/src/StringRoutines.cpp index 2f49e661a0..413fb56f4b 100644 --- a/src/StringRoutines.cpp +++ b/src/StringRoutines.cpp @@ -140,6 +140,19 @@ std::string NoTrailingWhitespace(std::string const& line) { return duplicate; } +void RemoveLeadingWhitespace(std::string& line) { + size_t pos = 0; + while (pos < line.size() && isspace(line[pos])) pos++; + if (pos > 0) + line = line.substr(pos, line.size() - pos); +} + +std::string NoLeadingWhitespace(std::string const& line) { + std::string duplicate(line); + RemoveLeadingWhitespace(duplicate); + return duplicate; +} + /// Remove all whitespace from string. void RemoveAllWhitespace(std::string& line) { if (line.empty()) return; diff --git a/src/StringRoutines.h b/src/StringRoutines.h index 06f72b9205..c58e4337f0 100644 --- a/src/StringRoutines.h +++ b/src/StringRoutines.h @@ -20,6 +20,10 @@ int FloatWidth(double); void RemoveTrailingWhitespace(std::string &); /// \return string stripped of trailing whitespace. std::string NoTrailingWhitespace(std::string const&); +/// Remove any leading whitespace from string. +void RemoveLeadingWhitespace(std::string&); +/// \return string stripped of leading whitespace. +std::string NoLeadingWhitespace(std::string const&); /// Remove all whitespace from a string void RemoveAllWhitespace(std::string&); /// \return string with all whitespace removed. From ce842c29f089b7a770aa45bde42b4a2a7393229a Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 6 Oct 2017 09:32:28 -0400 Subject: [PATCH 62/75] DRR - Cpptraj: Add ability to set script variables to number of atoms/residues/molecules in a given mask. --- src/Control.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 7 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index a5c20a2cf6..570fd7165b 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -5,7 +5,7 @@ void ControlBlock_For::Help() const { mprintf("\t{ {atoms|residues|molecules|molfirstres|mollastres}\n" - "\t inmask %s ... |\n" + "\t inmask [%s] ... |\n" "\t =;[;][] ... }\n", DataSetList::TopIdxArgs); mprintf("\tEND KEYWORD: 'done'\n"); @@ -309,8 +309,13 @@ ControlBlock::DoneType ControlBlock_For::CheckDone(Varray& CurrentVars) { // ============================================================================= void Control_Set::Help() const { - mprintf("\t=\n" - " Set script variable to value .\n"); + mprintf("\t{ = |\n" + "\t = {atoms|residues|molecules} inmask \n" + "\t [%s] }\n", + DataSetList::TopIdxArgs); + mprintf(" Set script variable to value . Alternatively\n" + " set script variable to the number of atoms/residues/molecules in\n" + " the given atom mask.\n"); } /** Set up variable with value. In this case allow any amount of whitespace, @@ -320,17 +325,60 @@ CpptrajState::RetType Control_Set::SetupControl(CpptrajState& State, ArgList& argIn, Varray& CurrentVars) { ArgList remaining = argIn.RemainingArgs(); - ArgList equals( remaining.ArgLineStr(), " =" ); - if (equals.Nargs() != 2) { + size_t pos = remaining.ArgLineStr().find_first_of("="); + if (pos == std::string::npos) { mprinterr("Error: Expected =\n"); return CpptrajState::ERR; } - CurrentVars.UpdateVariable( "$" + equals[0], equals[1] ); - mprintf("\tVariable '%s' set to '%s'\n", equals[0].c_str(), equals[1].c_str()); + std::string variable = NoWhitespace( remaining.ArgLineStr().substr(0, pos) ); + if (variable.empty()) { + mprinterr("Error: No variable name.\n"); + return CpptrajState::ERR; + } + ArgList equals( NoLeadingWhitespace(remaining.ArgLineStr().substr(pos+1)) ); + std::string value; + if (equals.Contains("inmask")) { + AtomMask mask( equals.GetStringKey("inmask") ); + Topology* top = State.DSL().GetTopByIndex( equals ); + if (top == 0) return CpptrajState::ERR; + if (top->SetupIntegerMask( mask )) return CpptrajState::ERR; + if (equals.hasKey("atoms")) + value = integerToString( mask.Nselected() ); + else if (equals.hasKey("residues")) { + int curRes = -1; + int nres = 0; + for (AtomMask::const_iterator at = mask.begin(); at != mask.end(); ++at) { + int res = (*top)[*at].ResNum(); + if (res != curRes) { + nres++; + curRes = res; + } + } + value = integerToString( nres ); + } else if (equals.hasKey("molecules")) { + int curMol = -1; + int nmol = 0; + for (AtomMask::const_iterator at = mask.begin(); at != mask.end(); ++at) { + int mol = (*top)[*at].MolNum(); + if (mol != curMol) { + nmol++; + curMol = mol; + } + } + value = integerToString( nmol ); + } else { + mprinterr("Error: Expected 'atoms', 'residues', or 'molecules'.\n"); + return CpptrajState::ERR; + } + } else + value = equals.ArgLineStr(); + CurrentVars.UpdateVariable( "$" + variable, value ); + mprintf("\tVariable '%s' set to '%s'\n", variable.c_str(), value.c_str()); for (int iarg = 0; iarg < argIn.Nargs(); iarg++) argIn.MarkArg( iarg ); return CpptrajState::OK; } + // ----------------------------------------------------------------------------- void Control_Show::Help() const { mprintf(" Show all current script variables and their values.\n"); From ebe52f80310a646598a1e3a346e5d715f2625549 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 6 Oct 2017 09:44:06 -0400 Subject: [PATCH 63/75] DRR - Cpptraj: Add 'trajinframes' option to set --- src/Control.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 570fd7165b..3f81e23fb1 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -311,11 +311,14 @@ ControlBlock::DoneType ControlBlock_For::CheckDone(Varray& CurrentVars) { void Control_Set::Help() const { mprintf("\t{ = |\n" "\t = {atoms|residues|molecules} inmask \n" - "\t [%s] }\n", + "\t [%s]\n" + "\t = trajinframes }\n", DataSetList::TopIdxArgs); - mprintf(" Set script variable to value . Alternatively\n" - " set script variable to the number of atoms/residues/molecules in\n" - " the given atom mask.\n"); + mprintf(" - Set script variable to value .\n" + " - Set script variable to the number of atoms/residues/molecules in\n" + " the given atom mask.\n" + " - Set script variable to the current number of frames that will\n" + " be read from all previous 'trajin' statements.\n"); } /** Set up variable with value. In this case allow any amount of whitespace, @@ -370,6 +373,8 @@ CpptrajState::RetType mprinterr("Error: Expected 'atoms', 'residues', or 'molecules'.\n"); return CpptrajState::ERR; } + } else if (equals.hasKey("trajinframes")) { + value = integerToString(State.InputTrajList().MaxFrames()); } else value = equals.ArgLineStr(); CurrentVars.UpdateVariable( "$" + variable, value ); From a9bba08f0fe3b01a0f14c0692577c53b097ac60e Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 6 Oct 2017 09:56:23 -0400 Subject: [PATCH 64/75] DRR - Cpptraj: Add option to append variables. --- src/Control.cpp | 28 +++++++++++++++++++--------- src/VariableArray.cpp | 13 +++++++++++++ src/VariableArray.h | 2 ++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 3f81e23fb1..07fc36fd2f 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -309,12 +309,13 @@ ControlBlock::DoneType ControlBlock_For::CheckDone(Varray& CurrentVars) { // ============================================================================= void Control_Set::Help() const { - mprintf("\t{ = |\n" - "\t = {atoms|residues|molecules} inmask \n" + mprintf("\t{ |\n" + "\t {atoms|residues|molecules} inmask \n" "\t [%s]\n" - "\t = trajinframes }\n", + "\t trajinframes }\n", DataSetList::TopIdxArgs); - mprintf(" - Set script variable to value .\n" + mprintf(" Set ( = '=') or append ( = '+=') a script variable.\n" + " - Set script variable to value .\n" " - Set script variable to the number of atoms/residues/molecules in\n" " the given atom mask.\n" " - Set script variable to the current number of frames that will\n" @@ -328,17 +329,23 @@ CpptrajState::RetType Control_Set::SetupControl(CpptrajState& State, ArgList& argIn, Varray& CurrentVars) { ArgList remaining = argIn.RemainingArgs(); - size_t pos = remaining.ArgLineStr().find_first_of("="); - if (pos == std::string::npos) { + size_t pos0 = remaining.ArgLineStr().find_first_of("="); + if (pos0 == std::string::npos) { mprinterr("Error: Expected =\n"); return CpptrajState::ERR; } - std::string variable = NoWhitespace( remaining.ArgLineStr().substr(0, pos) ); + size_t pos1 = pos0; + bool append = false; + if (pos0 > 0 && remaining.ArgLineStr()[pos0-1] == '+') { + pos0--; + append = true; + } + std::string variable = NoWhitespace( remaining.ArgLineStr().substr(0, pos0) ); if (variable.empty()) { mprinterr("Error: No variable name.\n"); return CpptrajState::ERR; } - ArgList equals( NoLeadingWhitespace(remaining.ArgLineStr().substr(pos+1)) ); + ArgList equals( NoLeadingWhitespace(remaining.ArgLineStr().substr(pos1+1)) ); std::string value; if (equals.Contains("inmask")) { AtomMask mask( equals.GetStringKey("inmask") ); @@ -377,7 +384,10 @@ CpptrajState::RetType value = integerToString(State.InputTrajList().MaxFrames()); } else value = equals.ArgLineStr(); - CurrentVars.UpdateVariable( "$" + variable, value ); + if (append) + CurrentVars.AppendVariable( "$" + variable, value ); + else + CurrentVars.UpdateVariable( "$" + variable, value ); mprintf("\tVariable '%s' set to '%s'\n", variable.c_str(), value.c_str()); for (int iarg = 0; iarg < argIn.Nargs(); iarg++) argIn.MarkArg( iarg ); diff --git a/src/VariableArray.cpp b/src/VariableArray.cpp index f03e3a4a9e..47813361f0 100644 --- a/src/VariableArray.cpp +++ b/src/VariableArray.cpp @@ -14,6 +14,19 @@ void VariableArray::UpdateVariable(std::string const& varname, std::string const it->second = value; } +/** Add variable/value to array if it doesnt exist, otherwise append value. */ +void VariableArray::AppendVariable(std::string const& varname, std::string const& value) +{ + Varray::iterator it = CurrentVars_.begin(); + for (; it != CurrentVars_.end(); ++it) + if (it->first == varname) + break; + if (it == CurrentVars_.end()) + CurrentVars_.push_back( Vpair(varname, value) ); + else + it->second += value; +} + /** Replace all variables in given ArgList with their values. */ ArgList VariableArray::ReplaceVariables(ArgList const& argIn) { ArgList modCmd = argIn; diff --git a/src/VariableArray.h b/src/VariableArray.h index ecd5073786..42669fbc9e 100644 --- a/src/VariableArray.h +++ b/src/VariableArray.h @@ -8,6 +8,8 @@ class VariableArray { VariableArray() {} /// Add/update variable with given value. void UpdateVariable(std::string const&, std::string const&); + /// Add/append variable with given value. + void AppendVariable(std::string const&, std::string const&); /// Replace all variables in given ArgList with their values. ArgList ReplaceVariables(ArgList const&); /// Print all variable/value pairs to stdout From 281e1cc3216ef75fec8a9322c2752fa13ba3f7c5 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 6 Oct 2017 10:07:12 -0400 Subject: [PATCH 65/75] DRR - Cpptraj: Slight change in output format of 'show' to make things more clear --- src/Control.cpp | 5 ++--- src/VariableArray.h | 13 ++++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Control.cpp b/src/Control.cpp index 07fc36fd2f..c316a72be9 100644 --- a/src/Control.cpp +++ b/src/Control.cpp @@ -402,8 +402,7 @@ void Control_Show::Help() const { CpptrajState::RetType Control_Show::SetupControl(CpptrajState& State, ArgList& argIn, Varray& CurrentVars) { - //for (Varray::const_iterator it = CurrentVars.begin(); it != CurrentVars.end(); ++it) - // mprintf("\t%s = %s\n", it->first.c_str(), it->second.c_str()); - CurrentVars.PrintVariables(); + for (Varray::const_iterator it = CurrentVars.begin(); it != CurrentVars.end(); ++it) + mprintf("\t%s = '%s'\n", it->first.c_str(), it->second.c_str()); return CpptrajState::OK; } diff --git a/src/VariableArray.h b/src/VariableArray.h index 42669fbc9e..0ed1f70c66 100644 --- a/src/VariableArray.h +++ b/src/VariableArray.h @@ -3,6 +3,10 @@ #include "ArgList.h" /// Hold script variables and their values. class VariableArray { + /// Hold variable and corresponding value. + typedef std::pair Vpair; + /// Hold list of variables and corresponding values. + typedef std::vector Varray; public: /// CONSTRUCTOR VariableArray() {} @@ -14,12 +18,11 @@ class VariableArray { ArgList ReplaceVariables(ArgList const&); /// Print all variable/value pairs to stdout void PrintVariables() const; - private: - /// Hold variable and corresponding value. - typedef std::pair Vpair; - /// Hold list of variables and corresponding values. - typedef std::vector Varray; + typedef Varray::const_iterator const_iterator; + const_iterator begin() const { return CurrentVars_.begin(); } + const_iterator end() const { return CurrentVars_.end(); } + private: Varray CurrentVars_; ///< Hold all current variables }; #endif From 758377cc92d4d80b36c07fcca96c007403680a20 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 6 Oct 2017 13:18:25 -0400 Subject: [PATCH 66/75] DRR - Cpptraj: First attempt at recognizing data sets as script vars --- src/Command.cpp | 2 +- src/VariableArray.cpp | 12 +++++++++--- src/VariableArray.h | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index b00244435d..8cbbefa763 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -617,7 +617,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& */ CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList const& cmdArgIn ) { // Replace variable names in command with entries from CurrentVars - ArgList cmdArg = CurrentVars_.ReplaceVariables( cmdArgIn ); + ArgList cmdArg = CurrentVars_.ReplaceVariables( cmdArgIn, State.DSL() ); if (cmdArg.empty()) return CpptrajState::ERR; // Print modified command mprintf(" [%s]\n", cmdArg.ArgLine()); diff --git a/src/VariableArray.cpp b/src/VariableArray.cpp index 47813361f0..384d4c6a4e 100644 --- a/src/VariableArray.cpp +++ b/src/VariableArray.cpp @@ -28,7 +28,7 @@ void VariableArray::AppendVariable(std::string const& varname, std::string const } /** Replace all variables in given ArgList with their values. */ -ArgList VariableArray::ReplaceVariables(ArgList const& argIn) { +ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& DSL) { ArgList modCmd = argIn; for (int n = 0; n < modCmd.Nargs(); n++) { size_t pos = modCmd[n].find("$"); @@ -48,8 +48,14 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn) { arg.replace(pos, vp->first.size(), vp->second); modCmd.ChangeArg(n, arg); } else { - mprinterr("Error: Unrecognized variable in command: %s\n", var_in_arg.c_str()); - return ArgList(); + // Not found in CurrentVars_; see if it occurs in DataSetList. + DataSet* ds = DSL.GetDataSet( modCmd[n] ); + if (ds == 0) { + mprinterr("Error: Unrecognized variable in command: %s\n", var_in_arg.c_str()); + return ArgList(); + } else { + mprintf("DEBUG: DataSet '%s'\n", ds->legend()); + } } } } diff --git a/src/VariableArray.h b/src/VariableArray.h index 0ed1f70c66..93cfa07e0e 100644 --- a/src/VariableArray.h +++ b/src/VariableArray.h @@ -1,6 +1,6 @@ #ifndef INC_VARIABLEARRAY_H #define INC_VARIABLEARRAY_H -#include "ArgList.h" +#include "DataSetList.h" /// Hold script variables and their values. class VariableArray { /// Hold variable and corresponding value. @@ -15,7 +15,7 @@ class VariableArray { /// Add/append variable with given value. void AppendVariable(std::string const&, std::string const&); /// Replace all variables in given ArgList with their values. - ArgList ReplaceVariables(ArgList const&); + ArgList ReplaceVariables(ArgList const&, DataSetList const&); /// Print all variable/value pairs to stdout void PrintVariables() const; From 83ed33e73f1a85d6320bac5792f9c923b54e3f69 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 6 Oct 2017 13:37:45 -0600 Subject: [PATCH 67/75] DRR - Cpptraj: Correctly recognize data set name --- src/VariableArray.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/VariableArray.cpp b/src/VariableArray.cpp index 384d4c6a4e..a9e93e562b 100644 --- a/src/VariableArray.cpp +++ b/src/VariableArray.cpp @@ -48,8 +48,16 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& arg.replace(pos, vp->first.size(), vp->second); modCmd.ChangeArg(n, arg); } else { - // Not found in CurrentVars_; see if it occurs in DataSetList. - DataSet* ds = DSL.GetDataSet( modCmd[n] ); + // Not found in CurrentVars_; see if this is a DataSet. + for (size_t pos1 = pos+len; pos1 < modCmd[n].size(); pos1++, len++) + if (!isalnum(modCmd[n][pos1]) && + modCmd[n][pos1] != '[' && + modCmd[n][pos1] != ':' && + modCmd[n][pos1] != ']' && + modCmd[n][pos1] != '%') + break; + var_in_arg = modCmd[n].substr(pos+1, len-1); + DataSet* ds = DSL.GetDataSet( var_in_arg ); if (ds == 0) { mprinterr("Error: Unrecognized variable in command: %s\n", var_in_arg.c_str()); return ArgList(); From 8d9808481dbae075e7fef403f1230aec8473fc2a Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 10 Oct 2017 13:28:11 -0600 Subject: [PATCH 68/75] DRR - Cpptraj: Replace script variable instance with data set value --- src/VariableArray.cpp | 23 ++++++++++++++++++++++- src/cpptrajdepend | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/VariableArray.cpp b/src/VariableArray.cpp index a9e93e562b..05745e3695 100644 --- a/src/VariableArray.cpp +++ b/src/VariableArray.cpp @@ -1,5 +1,8 @@ #include "VariableArray.h" #include "CpptrajStdio.h" +#include "DataSet_string.h" +#include "DataSet_1D.h" +#include "StringRoutines.h" /** Add variable/value to array if it doesnt exist, otherwise set value. */ void VariableArray::UpdateVariable(std::string const& varname, std::string const& value) @@ -62,7 +65,25 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& mprinterr("Error: Unrecognized variable in command: %s\n", var_in_arg.c_str()); return ArgList(); } else { - mprintf("DEBUG: DataSet '%s'\n", ds->legend()); + mprintf("\tDataSet '%s'\n", ds->legend()); + if (ds->Type() != DataSet::STRING && ds->Group() != DataSet::SCALAR_1D) { + mprinterr("Error: Only 1D data sets supported.\n"); + return ArgList(); + } + if (ds->Size() < 1) { + mprinterr("Error: Set is empty.\n"); + return ArgList(); + } + if (ds->Size() > 1) + mprintf("Warning: Only using first value.\n"); + std::string value; + if (ds->Type() == DataSet::STRING) + value = (*((DataSet_string*)ds))[0]; + else + value = doubleToString(((DataSet_1D*)ds)->Dval(0)); + std::string arg = modCmd[n]; + arg.replace(pos, var_in_arg.size()+1, value); + modCmd.ChangeArg(n, arg); } } } diff --git a/src/cpptrajdepend b/src/cpptrajdepend index cc3ff172cc..d9f60829be 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -335,7 +335,7 @@ Trajin_Single.o : Trajin_Single.cpp ArgList.h Atom.h AtomExtra.h AtomMask.h Base TrajIOarray.o : TrajIOarray.cpp ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h StringRoutines.h Topology.h TrajFrameCounter.h TrajIOarray.h TrajectoryFile.h TrajectoryIO.h Vec3.h Trajout_Single.o : Trajout_Single.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h StringRoutines.h Topology.h TrajectoryFile.h TrajectoryIO.h Trajout_Single.h Vec3.h TrajoutList.o : TrajoutList.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h TrajectoryFile.h TrajectoryIO.h TrajoutList.h Trajout_Single.h Vec3.h -VariableArray.o : VariableArray.cpp ArgList.h CpptrajStdio.h VariableArray.h +VariableArray.o : VariableArray.cpp ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_string.h Dimension.h FileIO.h FileName.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h VariableArray.h Vec3.h Vec3.o : Vec3.cpp Constants.h CpptrajStdio.h Vec3.h ViewRst.o : ViewRst.cpp ActionFrameCounter.h ArgList.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReplicaDimArray.h Residue.h Topology.h TrajectoryFile.h TrajectoryIO.h Trajout_Single.h Vec3.h ViewRst.h Action_Esander.o : Action_Esander.cpp Action.h ActionState.h Action_Esander.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h Energy_Sander.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h TextFormat.h Timer.h Topology.h Vec3.h From 0c874f527dadb1b0e390f15107c7c89cff0638f2 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 10 Oct 2017 15:46:04 -0400 Subject: [PATCH 69/75] DRR - Cpptraj: Improve output message and recognize dash and underscore in data set name --- src/VariableArray.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/VariableArray.cpp b/src/VariableArray.cpp index 05745e3695..65d387996f 100644 --- a/src/VariableArray.cpp +++ b/src/VariableArray.cpp @@ -57,6 +57,8 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& modCmd[n][pos1] != '[' && modCmd[n][pos1] != ':' && modCmd[n][pos1] != ']' && + modCmd[n][pos1] != '_' && + modCmd[n][pos1] != '-' && modCmd[n][pos1] != '%') break; var_in_arg = modCmd[n].substr(pos+1, len-1); @@ -65,7 +67,6 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& mprinterr("Error: Unrecognized variable in command: %s\n", var_in_arg.c_str()); return ArgList(); } else { - mprintf("\tDataSet '%s'\n", ds->legend()); if (ds->Type() != DataSet::STRING && ds->Group() != DataSet::SCALAR_1D) { mprinterr("Error: Only 1D data sets supported.\n"); return ArgList(); @@ -81,6 +82,8 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& value = (*((DataSet_string*)ds))[0]; else value = doubleToString(((DataSet_1D*)ds)->Dval(0)); + mprintf("\tReplaced variable '$%s' with value '%s' from DataSet '%s'\n", + var_in_arg.c_str(), value.c_str(), ds->legend()); std::string arg = modCmd[n]; arg.replace(pos, var_in_arg.size()+1, value); modCmd.ChangeArg(n, arg); From 06b52807ddcedb5d951e08cad5f16d1c69dc6c51 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 12 Oct 2017 09:59:41 -0400 Subject: [PATCH 70/75] DRR - Cpptraj: Replace all instances of script variables in an argument. --- src/VariableArray.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/VariableArray.cpp b/src/VariableArray.cpp index 65d387996f..4d6907399a 100644 --- a/src/VariableArray.cpp +++ b/src/VariableArray.cpp @@ -35,7 +35,7 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& ArgList modCmd = argIn; for (int n = 0; n < modCmd.Nargs(); n++) { size_t pos = modCmd[n].find("$"); - if (pos != std::string::npos) { + while (pos != std::string::npos) { // Argument is/contains a variable. Find first non-alphanumeric char size_t len = 1; for (size_t pos1 = pos+1; pos1 < modCmd[n].size(); pos1++, len++) @@ -47,6 +47,8 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& if (vp->first == var_in_arg) break; // If found replace with value from CurrentVars_ if (vp != CurrentVars_.end()) { + mprintf("\tReplaced variable '%s' with value '%s'\n", + var_in_arg.c_str(), vp->second.c_str()); std::string arg = modCmd[n]; arg.replace(pos, vp->first.size(), vp->second); modCmd.ChangeArg(n, arg); @@ -89,7 +91,8 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& modCmd.ChangeArg(n, arg); } } - } + pos = modCmd[n].find("$"); + } // END loop over this argument } return modCmd; } From ced0ad0fac0ebb88f7a1ff85f811f71fdba062cb Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 12 Oct 2017 10:02:32 -0400 Subject: [PATCH 71/75] DRR - Cpptraj: Add test of dataset as script var --- test/Test_Control/RunTest.sh | 9 +++++++++ test/Test_Control/last10.dat.save | 12 ++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 test/Test_Control/last10.dat.save diff --git a/test/Test_Control/RunTest.sh b/test/Test_Control/RunTest.sh index c71919fc82..1625e653ef 100755 --- a/test/Test_Control/RunTest.sh +++ b/test/Test_Control/RunTest.sh @@ -31,6 +31,14 @@ for residues R1 inmask :1-12 r=1;r++ rms R\$r \$R1&!@H= nofit out rms.nofit.dat done show + +# Print info for the last 10 atoms. This tests using data set values +# as script variables and replacement of multiple script variables +# in a single argument. +set Natom = atoms inmask * +last10 = \$Natom - 10 +show +atoms "@\$last10 - \$Natom" out last10.dat EOF RunCpptraj "$TESTNAME" DoTest TRP.vec.dat.save TRP.vec.dat @@ -39,6 +47,7 @@ DoTest TRP.CA.dist.dat.save TRP.CA.dist.dat DoTest TRP.tocenter.dat.save TRP.tocenter.dat DoTest nh.dat.save nh.dat DoTest rms.nofit.dat.save rms.nofit.dat +DoTest last10.dat.save last10.dat EndTest exit 0 diff --git a/test/Test_Control/last10.dat.save b/test/Test_Control/last10.dat.save new file mode 100644 index 0000000000..5d16e7cf7a --- /dev/null +++ b/test/Test_Control/last10.dat.save @@ -0,0 +1,12 @@ +#Atom Name #Res Name #Mol Type Charge Mass GBradius El rVDW eVDW + 213 HZ1 12 LYS 1 H 0.3400 1.0080 1.2000 H 0.6000 0.0157 + 214 HZ2 12 LYS 1 H 0.3400 1.0080 1.2000 H 0.6000 0.0157 + 215 HZ3 12 LYS 1 H 0.3400 1.0080 1.2000 H 0.6000 0.0157 + 216 C 12 LYS 1 C 0.7341 12.0100 1.7000 C 1.9080 0.0860 + 217 O 12 LYS 1 O -0.5894 16.0000 1.5000 O 1.6612 0.2100 + 218 N 13 NME 1 N -0.4157 14.0100 1.5500 N 1.8240 0.1700 + 219 H 13 NME 1 H 0.2719 1.0080 1.2000 H 0.6000 0.0157 + 220 CH3 13 NME 1 CT -0.1490 12.0100 1.7000 C 1.9080 0.1094 + 221 HH31 13 NME 1 H1 0.0976 1.0080 1.2000 H 1.3870 0.0157 + 222 HH32 13 NME 1 H1 0.0976 1.0080 1.2000 H 1.3870 0.0157 + 223 HH33 13 NME 1 H1 0.0976 1.0080 1.2000 H 1.3870 0.0157 From 18d04645e92f8507f070a3bfbb289245752ff0a0 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Thu, 12 Oct 2017 10:10:47 -0400 Subject: [PATCH 72/75] DRR - Cpptraj: Hide some debug info. --- src/Command.cpp | 2 +- src/VariableArray.cpp | 14 +++++++++----- src/VariableArray.h | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Command.cpp b/src/Command.cpp index 8cbbefa763..20174d2bad 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -617,7 +617,7 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& */ CpptrajState::RetType Command::ExecuteCommand( CpptrajState& State, ArgList const& cmdArgIn ) { // Replace variable names in command with entries from CurrentVars - ArgList cmdArg = CurrentVars_.ReplaceVariables( cmdArgIn, State.DSL() ); + ArgList cmdArg = CurrentVars_.ReplaceVariables( cmdArgIn, State.DSL(), State.Debug() ); if (cmdArg.empty()) return CpptrajState::ERR; // Print modified command mprintf(" [%s]\n", cmdArg.ArgLine()); diff --git a/src/VariableArray.cpp b/src/VariableArray.cpp index 4d6907399a..799bad4339 100644 --- a/src/VariableArray.cpp +++ b/src/VariableArray.cpp @@ -31,7 +31,9 @@ void VariableArray::AppendVariable(std::string const& varname, std::string const } /** Replace all variables in given ArgList with their values. */ -ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& DSL) { +ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& DSL, int debug) +{ + if (debug > 0) mprintf("DEBUG: Before variable replacement: [%s]\n", argIn.ArgLine()); ArgList modCmd = argIn; for (int n = 0; n < modCmd.Nargs(); n++) { size_t pos = modCmd[n].find("$"); @@ -47,8 +49,9 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& if (vp->first == var_in_arg) break; // If found replace with value from CurrentVars_ if (vp != CurrentVars_.end()) { - mprintf("\tReplaced variable '%s' with value '%s'\n", - var_in_arg.c_str(), vp->second.c_str()); + if (debug > 0) + mprintf("DEBUG: Replaced variable '%s' with value '%s'\n", + var_in_arg.c_str(), vp->second.c_str()); std::string arg = modCmd[n]; arg.replace(pos, vp->first.size(), vp->second); modCmd.ChangeArg(n, arg); @@ -84,8 +87,9 @@ ArgList VariableArray::ReplaceVariables(ArgList const& argIn, DataSetList const& value = (*((DataSet_string*)ds))[0]; else value = doubleToString(((DataSet_1D*)ds)->Dval(0)); - mprintf("\tReplaced variable '$%s' with value '%s' from DataSet '%s'\n", - var_in_arg.c_str(), value.c_str(), ds->legend()); + if (debug > 0) + mprintf("DEBUG: Replaced variable '$%s' with value '%s' from DataSet '%s'\n", + var_in_arg.c_str(), value.c_str(), ds->legend()); std::string arg = modCmd[n]; arg.replace(pos, var_in_arg.size()+1, value); modCmd.ChangeArg(n, arg); diff --git a/src/VariableArray.h b/src/VariableArray.h index 93cfa07e0e..51e171f4f5 100644 --- a/src/VariableArray.h +++ b/src/VariableArray.h @@ -15,7 +15,7 @@ class VariableArray { /// Add/append variable with given value. void AppendVariable(std::string const&, std::string const&); /// Replace all variables in given ArgList with their values. - ArgList ReplaceVariables(ArgList const&, DataSetList const&); + ArgList ReplaceVariables(ArgList const&, DataSetList const&, int); /// Print all variable/value pairs to stdout void PrintVariables() const; From 91f4d6e510eddeea33aa6ffdcb8231ad742833fc Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 13 Oct 2017 13:08:57 -0400 Subject: [PATCH 73/75] DRR - Cpptraj: Fix issue when reading old amber topology files with large integers in pointers section. --- src/Parm_Amber.cpp | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/Parm_Amber.cpp b/src/Parm_Amber.cpp index 7f4fea2437..a6ed5c96c8 100644 --- a/src/Parm_Amber.cpp +++ b/src/Parm_Amber.cpp @@ -153,6 +153,30 @@ Parm_Amber::Parm_Amber() : UB_count_[1] = 0; } +/** It seems that %Xi in sscanf() can get confused when integers take up + * the entire X characters. Not sure if this is a system bug or not, but + * this function will first ensure only 6 characters are read before + * converting to integer. + * \param ptr Input string to parse. Must not be NULL. + * \param IVALS Output integer array + * \return Number of values actually read. + */ +static inline int Get12I6(const char* ptr, int* IVALS) { + char SVALS[12][7]; + int nvals = sscanf(ptr, "%6c%6c%6c%6c%6c%6c%6c%6c%6c%6c%6c%6c", + SVALS[0], SVALS[1], SVALS[2], SVALS[3], SVALS[ 4], SVALS[ 5], + SVALS[6], SVALS[7], SVALS[8], SVALS[9], SVALS[10], SVALS[11]); + // If less than 12 values read the line was short, so the final value will be + // a newline. Ignore that. + if (nvals > 0 && nvals < 12) nvals--; + for (int i = 0; i < nvals; i++) { + SVALS[i][6] = '\0'; + //mprintf("DEBUG: %2i = %6s\n", i, SVALS[i]); + IVALS[i] = atoi( SVALS[i] ); + } + return nvals; +} + // Parm_Amber::ID_ParmFormat() bool Parm_Amber::ID_ParmFormat(CpptrajFile& fileIn) { int iamber[12]; @@ -177,10 +201,7 @@ bool Parm_Amber::ID_ParmFormat(CpptrajFile& fileIn) { int line1size = (int)strlen(lineBuf); if (line1size == (81 + fileIn.IsDos())) { fileIn.Gets(lineBuf, BUF_SIZE); - if ( sscanf(lineBuf,"%6i%6i%6i%6i%6i%6i%6i%6i%6i%6i%6i%6i", - iamber, iamber+1, iamber+2, iamber+3, - iamber+4, iamber+5, iamber+6, iamber+7, - iamber+8, iamber+9, iamber+10, iamber+11) == 12 ) + if ( Get12I6(lineBuf, iamber) == 12) { if (debug_>0) mprintf(" AMBER TOPOLOGY, OLD FORMAT\n"); ptype_ = OLDPARM; @@ -528,9 +549,7 @@ int Parm_Amber::ReadPointers(int Npointers, Topology& TopIn, FortranData const& const char* ptr = file_.NextLine(); if (ptr == 0) return 1; // Old pointers format is 12I6 - int nvals = sscanf(ptr, "%6i%6i%6i%6i%6i%6i%6i%6i%6i%6i%6i%6i", - IVALS , IVALS+1, IVALS+2, IVALS+3, IVALS+4 , IVALS+5, - IVALS+6, IVALS+7, IVALS+8, IVALS+9, IVALS+10, IVALS+11); + int nvals = Get12I6(ptr, IVALS); nPointers += nvals; // First two lines should always have 12 values. if (line < 2 && nvals < 12) { From 97335c1a9be0495bf69c2a03702d98f9a35163bb Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 13 Oct 2017 15:26:45 -0400 Subject: [PATCH 74/75] DRR - Cpptraj: Add 'quietblocks' command to suppress output within control blocks. --- src/Command.cpp | 3 +++ src/CpptrajState.cpp | 1 + src/CpptrajState.h | 3 +++ src/Exec_Commands.cpp | 11 +++++++++++ src/Exec_Commands.h | 10 ++++++++++ 5 files changed, 28 insertions(+) diff --git a/src/Command.cpp b/src/Command.cpp index 20174d2bad..a62df81b62 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -201,6 +201,7 @@ void Command::Init() { Command::AddCmd( new Exec_NoProgress(), Cmd::EXE, 1, "noprogress" ); Command::AddCmd( new Exec_Precision(), Cmd::EXE, 1, "precision" ); Command::AddCmd( new Exec_PrintData(), Cmd::EXE, 1, "printdata" ); + Command::AddCmd( new Exec_QuietBlocks(), Cmd::EXE, 1, "quietblocks" ); Command::AddCmd( new Exec_Quit(), Cmd::EXE, 2, "exit", "quit" ); Command::AddCmd( new Exec_ReadData(), Cmd::EXE, 1, "readdata" ); Command::AddCmd( new Exec_ReadInput(), Cmd::EXE, 1, "readinput" ); @@ -578,8 +579,10 @@ CpptrajState::RetType Command::Dispatch(CpptrajState& State, std::string const& if (ctlidx_ < 0) { // Outermost control structure is ended. Execute control block(s). mprintf("CONTROL: Executing %u control block(s).\n", control_.size()); + if (State.QuietBlocks()) SetWorldSilent(true); int cbret = ExecuteControlBlock(0, State); ClearControlBlocks(); + if (State.QuietBlocks()) SetWorldSilent(false); if (cbret != 0) return CpptrajState::ERR; mprintf("CONTROL: Control block finished.\n\n"); } diff --git a/src/CpptrajState.cpp b/src/CpptrajState.cpp index 2ded0222d8..6293f95e45 100644 --- a/src/CpptrajState.cpp +++ b/src/CpptrajState.cpp @@ -19,6 +19,7 @@ CpptrajState::CpptrajState() : refDebug_(0), topDebug_(0), showProgress_(true), + quietBlocks_(false), exitOnError_(true), recordAllInput_(true), noEmptyRun_(false), diff --git a/src/CpptrajState.h b/src/CpptrajState.h index 05a44e6292..a738286afe 100644 --- a/src/CpptrajState.h +++ b/src/CpptrajState.h @@ -19,6 +19,7 @@ class CpptrajState { CpptrajState(); void SetNoExitOnError() { exitOnError_ = false; } void SetNoProgress() { showProgress_ = false; } + void SetQuietBlocks(bool b) { quietBlocks_ = b; } void SetActionSilence(bool b) { actionList_.SetSilent(b); } # ifdef MPI void SetForceParaEnsemble(bool b) { forceParallelEnsemble_ = b; } @@ -30,6 +31,7 @@ class CpptrajState { TrajModeType Mode() const { return mode_; } int Debug() const { return debug_; } bool ShowProgress() const { return showProgress_;} + bool QuietBlocks() const { return quietBlocks_; } bool ExitOnError() const { return exitOnError_; } bool RecordAllInput() const { return recordAllInput_; } bool EmptyState() const { return (actionList_.Empty() && @@ -102,6 +104,7 @@ class CpptrajState { int refDebug_; ///< Reference debug level. int topDebug_; ///< Topology debug level. bool showProgress_; ///< If true, display progress during Run. + bool quietBlocks_; ///< If true suppress output when executing control blocks. bool exitOnError_; ///< If true exit when errors encountered instead of continuing. bool recordAllInput_; ///< When true save all input to log, even errors. /// If true do not process input trajectories when no actions/output trajectories. diff --git a/src/Exec_Commands.cpp b/src/Exec_Commands.cpp index 5bc17e98be..a1eaf28c6c 100644 --- a/src/Exec_Commands.cpp +++ b/src/Exec_Commands.cpp @@ -44,6 +44,17 @@ Exec::RetType Exec_NoProgress::Execute(CpptrajState& State, ArgList&) return CpptrajState::OK; } // ----------------------------------------------------------------------------- +void Exec_QuietBlocks::Help() const { + mprintf(" Suppress output when executing control blocks.\n"); +} + +Exec::RetType Exec_QuietBlocks::Execute(CpptrajState& State, ArgList&) +{ + State.SetQuietBlocks(true); + mprintf("\tSupressing output when executing control blocks.\n"); + return CpptrajState::OK; +} +// ----------------------------------------------------------------------------- void Exec_Quit::Help() const { mprintf(" Exit CPPTRAJ\n"); } // ----------------------------------------------------------------------------- void Exec_ActiveRef::Help() const { diff --git a/src/Exec_Commands.h b/src/Exec_Commands.h index fb127a4a5a..dc2cfc6c04 100644 --- a/src/Exec_Commands.h +++ b/src/Exec_Commands.h @@ -30,6 +30,16 @@ class Exec_NoProgress : public Exec { DispatchObject* Alloc() const { return (DispatchObject*)new Exec_NoProgress(); } RetType Execute(CpptrajState&, ArgList&); }; + +/// Tell CpptrajState to suppress output in control blocks +class Exec_QuietBlocks : public Exec { + public: + Exec_QuietBlocks() : Exec(GENERAL) {} + void Help() const; + DispatchObject* Alloc() const { return (DispatchObject*)new Exec_QuietBlocks(); } + RetType Execute(CpptrajState&, ArgList&); +}; + #ifdef MPI /// Tell CpptrajState to run parallel ensemble even with 1 thread/member class Exec_ForceParaEnsemble : public Exec { From 1afc8dd8b4331bc3c9f1b554e2592610f84dacf3 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 16 Oct 2017 11:47:27 -0400 Subject: [PATCH 75/75] DRR - Cpptraj: Add check for valid integer in Get12I6() --- src/Parm_Amber.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Parm_Amber.cpp b/src/Parm_Amber.cpp index a6ed5c96c8..41bedeb3fc 100644 --- a/src/Parm_Amber.cpp +++ b/src/Parm_Amber.cpp @@ -170,6 +170,8 @@ static inline int Get12I6(const char* ptr, int* IVALS) { // a newline. Ignore that. if (nvals > 0 && nvals < 12) nvals--; for (int i = 0; i < nvals; i++) { + // Only allow integers. Right-aligned, so check final character. + if (!isdigit(SVALS[i][5])) return 0; SVALS[i][6] = '\0'; //mprintf("DEBUG: %2i = %6s\n", i, SVALS[i]); IVALS[i] = atoi( SVALS[i] );