From dcae4c2ac5104c013f556e2dd46952f9f9f6639b Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 13 Apr 2018 15:11:58 -0400 Subject: [PATCH 01/28] DRR - Cpptraj: Initial incarnation of parallel analysis action. --- src/AnalysisList.h | 1 + src/Command.cpp | 2 ++ src/CpptrajState.h | 2 ++ src/Exec_ParallelAnalysis.cpp | 48 +++++++++++++++++++++++++++++++++++ src/Exec_ParallelAnalysis.h | 12 +++++++++ src/cpptrajdepend | 3 ++- src/cpptrajfiles | 1 + 7 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/Exec_ParallelAnalysis.cpp create mode 100644 src/Exec_ParallelAnalysis.h diff --git a/src/AnalysisList.h b/src/AnalysisList.h index fd9470058c..cdeb65e7de 100644 --- a/src/AnalysisList.h +++ b/src/AnalysisList.h @@ -13,6 +13,7 @@ class AnalysisList { int DoAnalyses(); void List() const; bool Empty() const { return analysisList_.empty(); } + unsigned int size() const { return analysisList_.size(); } private: /// Analysis setup status enum AnalysisStatusType { NO_SETUP = 0, SETUP, INACTIVE }; diff --git a/src/Command.cpp b/src/Command.cpp index e679ad478d..12fbf9ddbc 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -19,6 +19,7 @@ #include "Exec_DataSetCmd.h" #include "Exec_GenerateAmberRst.h" #include "Exec_Help.h" +#include "Exec_ParallelAnalysis.h" #include "Exec_Precision.h" #include "Exec_PrintData.h" #include "Exec_ReadData.h" @@ -205,6 +206,7 @@ void Command::Init() { Command::AddCmd( new Exec_ListAll(), Cmd::EXE, 1, "list" ); Command::AddCmd( new Exec_NoExitOnError(), Cmd::EXE, 1, "noexitonerror" ); Command::AddCmd( new Exec_NoProgress(), Cmd::EXE, 1, "noprogress" ); + Command::AddCmd( new Exec_ParallelAnalysis(),Cmd::EXE, 1, "parallelanalysis" ); 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" ); diff --git a/src/CpptrajState.h b/src/CpptrajState.h index a738286afe..25e5fc61d1 100644 --- a/src/CpptrajState.h +++ b/src/CpptrajState.h @@ -28,6 +28,8 @@ class CpptrajState { DataSetList& DSL() { return DSL_; } DataFileList const& DFL() const { return DFL_; } DataFileList& DFL() { return DFL_; } + AnalysisList const& Analyses() const { return analysisList_; } + AnalysisList& Analyses() { return analysisList_; } TrajModeType Mode() const { return mode_; } int Debug() const { return debug_; } bool ShowProgress() const { return showProgress_;} diff --git a/src/Exec_ParallelAnalysis.cpp b/src/Exec_ParallelAnalysis.cpp new file mode 100644 index 0000000000..92866dc66c --- /dev/null +++ b/src/Exec_ParallelAnalysis.cpp @@ -0,0 +1,48 @@ +#include "Exec_ParallelAnalysis.h" +#include "CpptrajStdio.h" +#ifdef MPI +#include // DEBUG +// Exec_ParallelAnalysis::Help() +void Exec_ParallelAnalysis::Help() const +{ + +} + +// Exec_ParallelAnalysis::Execute() +Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn) +{ + // DEBUG - Have each thread report what analyses it knows about and what + // data sets it has. + for (int rank = 0; rank < Parallel::World().Size(); rank++) { + if (rank == Parallel::World().Rank()) { + printf("Rank %i, %u analyses, %zu data sets:\n", rank, State.Analyses().size(), + State.DSL().size()); + for (DataSetList::const_iterator it = State.DSL().begin(); it != State.DSL().end(); ++it) + printf("\t'%s' (%zu)\n", (*it)->Meta().PrintName().c_str(), (*it)->Size()); + } + Parallel::World().Barrier(); + } + Parallel::World().Barrier(); + + // Naively divide up all analyses among threads. + int my_start, my_stop; + int nelts = Parallel::World().DivideAmongThreads( my_start, my_stop, State.Analyses().size() ); + rprintf("Dividing %zu analyses among %i threads: %i to %i (%i)\n", + State.Analyses().size(), Parallel::World().Size(), my_start, my_stop, nelts_); + + return CpptrajState::OK; +} +#else +// Exec_ParallelAnalysis::Help() +void Exec_ParallelAnalysis::Help() const +{ + mprintf(" This command is only available in MPI-enabled builds.\n"); +} + +// Exec_ParallelAnalysis::Execute() +Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn) +{ + mprinterr("Error: This command is only available in MPI-enabled builds.\n"); + return CpptrajState::ERR; +} +#endif diff --git a/src/Exec_ParallelAnalysis.h b/src/Exec_ParallelAnalysis.h new file mode 100644 index 0000000000..94f05af319 --- /dev/null +++ b/src/Exec_ParallelAnalysis.h @@ -0,0 +1,12 @@ +#ifndef INC_EXEC_PARALLELANALYSIS_H +#define INC_EXEC_PARALLELANALYSIS_H +#include "Exec.h" +/// +class Exec_ParallelAnalysis : public Exec { + public: + Exec_ParallelAnalysis() : Exec(GENERAL) {} + void Help() const; + DispatchObject* Alloc() const { return (DispatchObject*)new Exec_ParallelAnalysis(); } + RetType Execute(CpptrajState&, ArgList&); +}; +#endif diff --git a/src/cpptrajdepend b/src/cpptrajdepend index 718ff8eb34..ea8859f2f7 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -245,6 +245,7 @@ Exec_GenerateAmberRst.o : Exec_GenerateAmberRst.cpp Action.h ActionFrameCounter. 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_ParallelAnalysis.o : Exec_ParallelAnalysis.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_ParallelAnalysis.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_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 Exec_ParmSolvent.o : Exec_ParmSolvent.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_ParmSolvent.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_ParmStrip.o : Exec_ParmStrip.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_ParmStrip.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 @@ -357,7 +358,7 @@ VariableArray.o : VariableArray.cpp ArgList.h AssociatedData.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_InfraredSpectrum.h Action_Jcoupling.h Action_LESsplit.h Action_LIE.h Action_LipidOrder.h Action_MakeStructure.h Action_Mask.h Action_Matrix.h Action_MinImage.h Action_Molsurf.h Action_MultiDihedral.h Action_MultiVector.h Action_NAstruct.h Action_NMRrst.h Action_NativeContacts.h Action_OrderParameter.h Action_Outtraj.h Action_PairDist.h Action_Pairwise.h Action_Principal.h Action_Projection.h Action_Pucker.h Action_Radgyr.h Action_Radial.h Action_RandomizeIons.h Action_Remap.h Action_ReplicateCell.h Action_Rmsd.h Action_Rotate.h Action_RunningAvg.h Action_STFC_Diffusion.h Action_Scale.h Action_SetVelocity.h Action_Spam.h Action_Strip.h Action_Surf.h Action_SymmetricRmsd.h Action_Temperature.h Action_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_ConstantPHStats.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 Cph.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_pH.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_ReadEnsembleData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_SortEnsembleData.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_UpdateParameters.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 RemdReservoirNC.h ReplicaDimArray.h ReplicaInfo.h Residue.h Spline.h StructureCheck.h SymmetricRmsdCalc.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 molsurf.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_InfraredSpectrum.h Action_Jcoupling.h Action_LESsplit.h Action_LIE.h Action_LipidOrder.h Action_MakeStructure.h Action_Mask.h Action_Matrix.h Action_MinImage.h Action_Molsurf.h Action_MultiDihedral.h Action_MultiVector.h Action_NAstruct.h Action_NMRrst.h Action_NativeContacts.h Action_OrderParameter.h Action_Outtraj.h Action_PairDist.h Action_Pairwise.h Action_Principal.h Action_Projection.h Action_Pucker.h Action_Radgyr.h Action_Radial.h Action_RandomizeIons.h Action_Remap.h Action_ReplicateCell.h Action_Rmsd.h Action_Rotate.h Action_RunningAvg.h Action_STFC_Diffusion.h Action_Scale.h Action_SetVelocity.h Action_Spam.h Action_Strip.h Action_Surf.h Action_SymmetricRmsd.h Action_Temperature.h Action_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_ConstantPHStats.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 Cph.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_pH.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_ParallelAnalysis.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_ReadEnsembleData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_SortEnsembleData.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_UpdateParameters.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 RemdReservoirNC.h ReplicaDimArray.h ReplicaInfo.h Residue.h Spline.h StructureCheck.h SymmetricRmsdCalc.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 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 VariableArray.h Vec3.h diff --git a/src/cpptrajfiles b/src/cpptrajfiles index e7068479e3..9d754ebad4 100644 --- a/src/cpptrajfiles +++ b/src/cpptrajfiles @@ -247,6 +247,7 @@ COMMON_SOURCES=ActionFrameCounter.cpp \ Exec_Help.cpp \ Exec_LoadCrd.cpp \ Exec_LoadTraj.cpp \ + Exec_ParallelAnalysis.cpp \ Exec_ParmBox.cpp \ Exec_ParmSolvent.cpp \ Exec_ParmStrip.cpp \ From 6f8e7b19765a1c7ba2979ff12e4ac8eff74bfeb9 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 13 Apr 2018 15:31:16 -0400 Subject: [PATCH 02/28] DRR - Cpptraj: Finish initial incarnation of parallel analysis. --- src/AnalysisList.h | 10 ++++++++-- src/Exec_ParallelAnalysis.cpp | 17 +++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/AnalysisList.h b/src/AnalysisList.h index cdeb65e7de..2decf17c52 100644 --- a/src/AnalysisList.h +++ b/src/AnalysisList.h @@ -4,6 +4,9 @@ /// Hold all Analyses to be performed. class AnalysisList { public: + /// Analysis setup status + enum AnalysisStatusType { NO_SETUP = 0, SETUP, INACTIVE }; + AnalysisList(); ~AnalysisList(); void Clear(); @@ -14,9 +17,12 @@ class AnalysisList { void List() const; bool Empty() const { return analysisList_.empty(); } unsigned int size() const { return analysisList_.size(); } +# ifdef MPI + Analysis& Ana(int i) { return *(analysisList_[i].ptr_); } + AnalysisStatusType Status(int i) const { return analysisList_[i].status_; } + ArgList const& Args(int i) const { return analysisList_[i].args_; } +# endif private: - /// Analysis setup status - enum AnalysisStatusType { NO_SETUP = 0, SETUP, INACTIVE }; struct AnaHolder { Analysis* ptr_; ///< Pointer to Analysis ArgList args_; ///< Arguments associated with Analysis diff --git a/src/Exec_ParallelAnalysis.cpp b/src/Exec_ParallelAnalysis.cpp index 92866dc66c..be180fd6b0 100644 --- a/src/Exec_ParallelAnalysis.cpp +++ b/src/Exec_ParallelAnalysis.cpp @@ -13,6 +13,7 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn { // DEBUG - Have each thread report what analyses it knows about and what // data sets it has. +/* for (int rank = 0; rank < Parallel::World().Size(); rank++) { if (rank == Parallel::World().Rank()) { printf("Rank %i, %u analyses, %zu data sets:\n", rank, State.Analyses().size(), @@ -23,13 +24,25 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn Parallel::World().Barrier(); } Parallel::World().Barrier(); - +*/ // Naively divide up all analyses among threads. int my_start, my_stop; int nelts = Parallel::World().DivideAmongThreads( my_start, my_stop, State.Analyses().size() ); rprintf("Dividing %zu analyses among %i threads: %i to %i (%i)\n", - State.Analyses().size(), Parallel::World().Size(), my_start, my_stop, nelts_); + State.Analyses().size(), Parallel::World().Size(), my_start, my_stop, nelts); + // Each thread runs the analyses they are responsible for. + int nerr = 0; + for (int na = my_start; na != my_stop; na++) { + // TODO check setup status + if (State.Analyses().Ana(na).Analyze() != Analysis::OK) { + rprinterr("Error: Analysis failed: '%s'\n", State.Analyses().Args(na).ArgLine()); + nerr++; + } + } + // This error check serves as a barrier + if (Parallel::World().CheckError( nerr )) return CpptrajState::ERR; + State.Analyses().Clear(); return CpptrajState::OK; } #else From 7ab839373217b2df9189bf7b46fa133e651b9a49 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 16 Apr 2018 08:09:01 -0400 Subject: [PATCH 03/28] DRR - Cpptraj: Add a parallel version of master data file write --- src/DataFileList.cpp | 28 ++++++++++++++++++++++++++++ src/DataFileList.h | 1 + src/Exec_ParallelAnalysis.cpp | 1 + 3 files changed, 30 insertions(+) diff --git a/src/DataFileList.cpp b/src/DataFileList.cpp index 44c62e9764..325235bcf5 100644 --- a/src/DataFileList.cpp +++ b/src/DataFileList.cpp @@ -339,6 +339,34 @@ void DataFileList::WriteAllDF() { # endif } +#ifdef MPI +// DataFileList::WriteAllDF() +/** Call write for all DataFiles in list for which writeFile is true. Once + * a file has been written set writeFile to false; it can be reset to + * true if new DataSets are added to it. All threads are allowed to try + * writing files. FIXME this is a hack until a better way of determining + * write threads is found. + */ +void DataFileList::AllThreads_WriteAllDF() { + if (fileList_.empty()) return; +# ifdef TIMER + Timer datafile_time; + datafile_time.Start(); +# endif + for (DFarray::iterator df = fileList_.begin(); df != fileList_.end(); ++df) { + if ( (*df)->DFLwrite() ) { + (*df)->SetThreadCanWrite( true ); + (*df)->WriteDataOut(); + (*df)->SetDFLwrite( false ); + } + } +# ifdef TIMER + datafile_time.Stop(); + mprintf("TIME: Write of all data files took %.4f seconds.\n", datafile_time.Total()); +# endif +} +#endif + // DataFileList::UnwrittenData() bool DataFileList::UnwrittenData() const { for (DFarray::const_iterator df = fileList_.begin(); df != fileList_.end(); ++df) diff --git a/src/DataFileList.h b/src/DataFileList.h index c49ff60127..84c2ce1e01 100644 --- a/src/DataFileList.h +++ b/src/DataFileList.h @@ -44,6 +44,7 @@ class DataFileList { CpptrajFile* AddCpptrajFile(FileName const&,std::string const&,CFtype,bool); # ifdef MPI CpptrajFile* AddCpptrajFile(FileName const&,std::string const&,CFtype,bool,Parallel::Comm const&); + void AllThreads_WriteAllDF(); # endif /// List DataFiles and CpptrajFiles. void List() const; diff --git a/src/Exec_ParallelAnalysis.cpp b/src/Exec_ParallelAnalysis.cpp index be180fd6b0..c5ccf98db2 100644 --- a/src/Exec_ParallelAnalysis.cpp +++ b/src/Exec_ParallelAnalysis.cpp @@ -42,6 +42,7 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn } // This error check serves as a barrier if (Parallel::World().CheckError( nerr )) return CpptrajState::ERR; + State.DFL().AllThreads_WriteAllDF(); State.Analyses().Clear(); return CpptrajState::OK; } From d51362a0badca3e84222981c041de55866de14dc Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 23 Apr 2018 13:28:09 -0400 Subject: [PATCH 04/28] DRR - Cpptraj: Initial incarnation of the Hausdorff distance calculation. --- src/Analysis_HausdorffDistance.cpp | 66 ++++++++++++++++++++++++++++++ src/Analysis_HausdorffDistance.h | 22 ++++++++++ src/Command.cpp | 2 + src/cpptrajdepend | 3 +- src/cpptrajfiles | 1 + 5 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 src/Analysis_HausdorffDistance.cpp create mode 100644 src/Analysis_HausdorffDistance.h diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp new file mode 100644 index 0000000000..f7abd376df --- /dev/null +++ b/src/Analysis_HausdorffDistance.cpp @@ -0,0 +1,66 @@ +#include "Analysis_HausdorffDistance.h" +#include "CpptrajStdio.h" + +// Analysis_HausdorffDistance::Help() +void Analysis_HausdorffDistance::Help() const { + +} + +/** Assume input matrix contains all distances beween sets A and B. + * The Hausdorff distance will be the maximum of all minimums in each row. + */ +double Analysis_HausdorffDistance::h_Matrix(DataSet_2D* m1) { + if (m1 == 0) { + mprinterr("Internal Error: Analysis_HausdorffDistance::h_Matrix(): Matrix set is null.\n"); + return -1.0; + } + if (m1->Size() < 1) { + mprinterr("Error: '%s' is empty.\n", m1->legend()); + return -1.0; + } + double hd = 0.0; + // Row 1 - initial value. + for (unsigned int row = 0; row != m1->Nrows(); row++) + { + double minRow = m1->GetElement(0, row); + for (unsigned int col = 1; col != m1->Ncols(); col++) + minRow = std::min( minRow, m1->GetElement(col, row) ); + hd = std::max( hd, minRow ); + } + return hd; +} + +// Analysis_HausdorffDistance::Setup() +Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, AnalysisSetup& setup, int debugIn) +{ + std::string dsarg = analyzeArgs.GetStringNext(); + while (!dsarg.empty()) { + inputSets_ += setup.DSL().GetMultipleSets( dsarg ); + dsarg = analyzeArgs.GetStringNext(); + } + if (inputSets_.empty()) { + mprinterr("Error: No data sets specified.\n"); + return Analysis::ERR; + } + mprintf(" HAUSDORFF:\n"); + for (DataSetList::const_iterator it = inputSets_.begin(); it != inputSets_.end(); ++it) + mprintf("\t%s\n", (*it)->legend()); + + return Analysis::OK; +} + +// Analysis_HausdorffDistance::Analyze() +Analysis::RetType Analysis_HausdorffDistance::Analyze() { + // Get the Hausdorff distance for each set. + double hd = 0.0; + for (DataSetList::const_iterator it = inputSets_.begin(); it != inputSets_.end(); ++it) + { + hd = -1.0; + if ( (*it)->Group() == DataSet::MATRIX_2D ) + hd = h_Matrix( static_cast( *it ) ); + else + mprintf("Warning: '%s' type not yet supported for Hausdorff\n", (*it)->legend()); + mprintf("%12.4f %s\n", hd, (*it)->legend()); + } + return Analysis::OK; +} diff --git a/src/Analysis_HausdorffDistance.h b/src/Analysis_HausdorffDistance.h new file mode 100644 index 0000000000..b66cdb8d56 --- /dev/null +++ b/src/Analysis_HausdorffDistance.h @@ -0,0 +1,22 @@ +#ifndef INC_ANALYSIS_HAUSDORFFDISTANCE_H +#define INC_ANALYSIS_HAUSDORFFDISTANCE_H +#include "Analysis.h" +#include "DataSet_2D.h" +/// Compute the Hausdorff distance between 2 or more data sets. +/** The Hausdorff distance between two sets of points A and B is defined as: + * h(A,B) = max[a in A]{ min[b in B]( d(a,b) } } + */ +class Analysis_HausdorffDistance : public Analysis { + public: + Analysis_HausdorffDistance() {} + DispatchObject* Alloc() const { return (DispatchObject*)new Analysis_HausdorffDistance(); } + void Help() const; + + Analysis::RetType Setup(ArgList&, AnalysisSetup&, int); + Analysis::RetType Analyze(); + private: + static double h_Matrix(DataSet_2D*); + + DataSetList inputSets_; +}; +#endif diff --git a/src/Command.cpp b/src/Command.cpp index 12fbf9ddbc..8ee66e744a 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -174,6 +174,7 @@ #include "Analysis_Multicurve.h" #include "Analysis_TI.h" #include "Analysis_ConstantPHStats.h" +#include "Analysis_HausdorffDistance.h" CmdList Command::commands_ = CmdList(); @@ -364,6 +365,7 @@ void Command::Init() { Command::AddCmd( new Analysis_Matrix(), Cmd::ANA, 2, "diagmatrix", "matrix" ); Command::AddCmd( new Analysis_Divergence(), Cmd::ANA, 1, "divergence" ); Command::AddCmd( new Analysis_FFT(), Cmd::ANA, 1, "fft" ); + Command::AddCmd( new Analysis_HausdorffDistance,Cmd::ANA,1,"hausdorff" ); Command::AddCmd( new Analysis_Hist(), Cmd::ANA, 2, "hist", "histogram" ); Command::AddCmd( new Analysis_Integrate(), Cmd::ANA, 1, "integrate" ); Command::AddCmd( new Analysis_IRED(), Cmd::ANA, 1, "ired" ); diff --git a/src/cpptrajdepend b/src/cpptrajdepend index ea8859f2f7..bdcc556231 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -95,6 +95,7 @@ Analysis_CrossCorr.o : Analysis_CrossCorr.cpp ActionState.h Analysis.h AnalysisS Analysis_CurveFit.o : Analysis_CurveFit.cpp ActionState.h Analysis.h AnalysisState.h Analysis_CurveFit.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h CurveFit.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Mesh.h Dimension.h DispatchObject.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h RPNcalc.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Spline.h StringRoutines.h TextFormat.h Timer.h Topology.h Vec3.h Analysis_Divergence.o : Analysis_Divergence.cpp ActionState.h Analysis.h AnalysisState.h Analysis_Divergence.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_1D.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.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 Analysis_FFT.o : Analysis_FFT.cpp ActionState.h Analysis.h AnalysisState.h Analysis_FFT.h ArgList.h Array1D.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h ComplexArray.h CoordinateInfo.h CpptrajFile.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 FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h PubFFT.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h TextFormat.h Timer.h Topology.h Vec3.h +Analysis_HausdorffDistance.o : Analysis_HausdorffDistance.cpp ActionState.h Analysis.h AnalysisState.h Analysis_HausdorffDistance.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_2D.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.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 Analysis_Hist.o : Analysis_Hist.cpp ActionFrameCounter.h ActionState.h Analysis.h AnalysisState.h Analysis_Hist.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_3D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_GridFlt.h DataSet_MatrixDbl.h DataSet_double.h Dimension.h DispatchObject.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h Grid.h GridBin.h HistBin.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajectoryFile.h TrajectoryIO.h Trajout_Single.h Vec3.h Analysis_Integrate.o : Analysis_Integrate.cpp ActionState.h Analysis.h AnalysisState.h Analysis_Integrate.h ArgList.h Array1D.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_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Mesh.h Dimension.h DispatchObject.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 Spline.h TextFormat.h Timer.h Topology.h Vec3.h Analysis_IRED.o : Analysis_IRED.cpp ActionState.h Analysis.h AnalysisState.h Analysis_IRED.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h ComplexArray.h Constants.h CoordinateInfo.h Corr.h CpptrajFile.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_Modes.h DataSet_Vector.h DataSet_double.h Dimension.h DispatchObject.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h PubFFT.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h TextFormat.h Timer.h Topology.h Vec3.h @@ -358,7 +359,7 @@ VariableArray.o : VariableArray.cpp ArgList.h AssociatedData.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_InfraredSpectrum.h Action_Jcoupling.h Action_LESsplit.h Action_LIE.h Action_LipidOrder.h Action_MakeStructure.h Action_Mask.h Action_Matrix.h Action_MinImage.h Action_Molsurf.h Action_MultiDihedral.h Action_MultiVector.h Action_NAstruct.h Action_NMRrst.h Action_NativeContacts.h Action_OrderParameter.h Action_Outtraj.h Action_PairDist.h Action_Pairwise.h Action_Principal.h Action_Projection.h Action_Pucker.h Action_Radgyr.h Action_Radial.h Action_RandomizeIons.h Action_Remap.h Action_ReplicateCell.h Action_Rmsd.h Action_Rotate.h Action_RunningAvg.h Action_STFC_Diffusion.h Action_Scale.h Action_SetVelocity.h Action_Spam.h Action_Strip.h Action_Surf.h Action_SymmetricRmsd.h Action_Temperature.h Action_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_ConstantPHStats.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 Cph.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_pH.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_ParallelAnalysis.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_ReadEnsembleData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_SortEnsembleData.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_UpdateParameters.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 RemdReservoirNC.h ReplicaDimArray.h ReplicaInfo.h Residue.h Spline.h StructureCheck.h SymmetricRmsdCalc.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 molsurf.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_InfraredSpectrum.h Action_Jcoupling.h Action_LESsplit.h Action_LIE.h Action_LipidOrder.h Action_MakeStructure.h Action_Mask.h Action_Matrix.h Action_MinImage.h Action_Molsurf.h Action_MultiDihedral.h Action_MultiVector.h Action_NAstruct.h Action_NMRrst.h Action_NativeContacts.h Action_OrderParameter.h Action_Outtraj.h Action_PairDist.h Action_Pairwise.h Action_Principal.h Action_Projection.h Action_Pucker.h Action_Radgyr.h Action_Radial.h Action_RandomizeIons.h Action_Remap.h Action_ReplicateCell.h Action_Rmsd.h Action_Rotate.h Action_RunningAvg.h Action_STFC_Diffusion.h Action_Scale.h Action_SetVelocity.h Action_Spam.h Action_Strip.h Action_Surf.h Action_SymmetricRmsd.h Action_Temperature.h Action_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_ConstantPHStats.h Analysis_Corr.h Analysis_CrankShaft.h Analysis_CrdFluct.h Analysis_CrossCorr.h Analysis_CurveFit.h Analysis_Divergence.h Analysis_FFT.h Analysis_HausdorffDistance.h Analysis_Hist.h Analysis_IRED.h Analysis_Integrate.h Analysis_KDE.h Analysis_Lifetime.h Analysis_LowestCurve.h Analysis_Matrix.h Analysis_MeltCurve.h Analysis_Modes.h Analysis_MultiHist.h Analysis_Multicurve.h Analysis_Overlap.h Analysis_PhiPsi.h Analysis_Regression.h Analysis_RemLog.h Analysis_Rms2d.h Analysis_RmsAvgCorr.h Analysis_Rotdif.h Analysis_RunningAvg.h Analysis_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 Cph.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_pH.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_ParallelAnalysis.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_ReadEnsembleData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_SortEnsembleData.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_UpdateParameters.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 RemdReservoirNC.h ReplicaDimArray.h ReplicaInfo.h Residue.h Spline.h StructureCheck.h SymmetricRmsdCalc.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 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 VariableArray.h Vec3.h diff --git a/src/cpptrajfiles b/src/cpptrajfiles index 9d754ebad4..dceeaae920 100644 --- a/src/cpptrajfiles +++ b/src/cpptrajfiles @@ -97,6 +97,7 @@ COMMON_SOURCES=ActionFrameCounter.cpp \ Analysis_CurveFit.cpp \ Analysis_Divergence.cpp \ Analysis_FFT.cpp \ + Analysis_HausdorffDistance.cpp \ Analysis_Hist.cpp \ Analysis_Integrate.cpp \ Analysis_IRED.cpp \ From 5223fa10b7d20799f61bd155d48c41b0e5d717c4 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 23 Apr 2018 13:29:33 -0400 Subject: [PATCH 05/28] DRR - Cpptraj: Add some output options --- src/Analysis_HausdorffDistance.cpp | 59 ++++++++++++++++++++++++++++-- src/Analysis_HausdorffDistance.h | 6 ++- src/cpptrajdepend | 2 +- 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp index f7abd376df..0552cd5057 100644 --- a/src/Analysis_HausdorffDistance.cpp +++ b/src/Analysis_HausdorffDistance.cpp @@ -1,10 +1,11 @@ #include "Analysis_HausdorffDistance.h" #include "CpptrajStdio.h" +#include "DataSet_MatrixFlt.h" -// Analysis_HausdorffDistance::Help() -void Analysis_HausdorffDistance::Help() const { - -} +Analysis_HausdorffDistance::Analysis_HausdorffDistance() : + outType_(BASIC), + out_(0) +{} /** Assume input matrix contains all distances beween sets A and B. * The Hausdorff distance will be the maximum of all minimums in each row. @@ -25,14 +26,44 @@ double Analysis_HausdorffDistance::h_Matrix(DataSet_2D* m1) { double minRow = m1->GetElement(0, row); for (unsigned int col = 1; col != m1->Ncols(); col++) minRow = std::min( minRow, m1->GetElement(col, row) ); + //mprintf("DEBUG: Min row %6u is %12.4f\n", row, minRow); hd = std::max( hd, minRow ); } return hd; } +// Analysis_HausdorffDistance::Help() +void Analysis_HausdorffDistance::Help() const { + mprintf("\t [ ...] [outtype {basic|trimatrix nrows <#>}]\n" + "\t[name ] [out ]\n"); +} + + // Analysis_HausdorffDistance::Setup() Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, AnalysisSetup& setup, int debugIn) { + // Keywords + int nrows = -1; + std::string outtypearg = analyzeArgs.GetStringKey("outtype"); + if (!outtypearg.empty()) { + if (outtypearg == "basic") + outType_ = BASIC; + else if (outtypearg == "trimatrix") { + outType_ = UPPER_TRI_MATRIX; + nrows = analyzeArgs.getKeyInt("nrows", -1); + if (nrows < 1) { + mprinterr("Error: 'nrows' must be specified and > 0 for 'trimatrix'\n"); + return Analysis::ERR; + } + } else { + mprinterr("Error: Unrecognized keyword for 'outtype': %s\n", outtypearg.c_str()); + return Analysis::ERR; + } + } else + outType_ = BASIC; + std::string dsname = analyzeArgs.GetStringKey("name"); + DataFile* df = setup.DFL().AddDataFile( analyzeArgs.GetStringKey("out"), analyzeArgs ); + // Get input data sets std::string dsarg = analyzeArgs.GetStringNext(); while (!dsarg.empty()) { inputSets_ += setup.DSL().GetMultipleSets( dsarg ); @@ -42,6 +73,20 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys mprinterr("Error: No data sets specified.\n"); return Analysis::ERR; } + // Output data set + out_ = 0; + if (outType_ == BASIC) { + out_ = setup.DSL().AddSet(DataSet::FLOAT, dsname, "HAUSDORFF"); + if (out_ == 0) return Analysis::ERR; + } else if (outType_ == UPPER_TRI_MATRIX) { + out_ = setup.DSL().AddSet(DataSet::MATRIX_FLT, dsname, "HAUSDORFF"); + if (out_ == 0 || ((DataSet_2D*)out_)->AllocateTriangle( nrows )) return Analysis::ERR; + if (out_->Size() != inputSets_.size()) + mprintf("Warning: Number of input data sets (%zu) != number of expected sets in matrix (%zu)\n", + inputSets_.size(), out_->Size()); + } + if (df != 0) df->AddDataSet( out_ ); + mprintf(" HAUSDORFF:\n"); for (DataSetList::const_iterator it = inputSets_.begin(); it != inputSets_.end(); ++it) mprintf("\t%s\n", (*it)->legend()); @@ -53,6 +98,7 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys Analysis::RetType Analysis_HausdorffDistance::Analyze() { // Get the Hausdorff distance for each set. double hd = 0.0; + int idx = 0; for (DataSetList::const_iterator it = inputSets_.begin(); it != inputSets_.end(); ++it) { hd = -1.0; @@ -61,6 +107,11 @@ Analysis::RetType Analysis_HausdorffDistance::Analyze() { else mprintf("Warning: '%s' type not yet supported for Hausdorff\n", (*it)->legend()); mprintf("%12.4f %s\n", hd, (*it)->legend()); + float fhd = (float)hd; + switch (outType_) { + case BASIC : out_->Add(idx++, &fhd); break; + case UPPER_TRI_MATRIX : ((DataSet_MatrixFlt*)out_)->AddElement( fhd ); break; + } } return Analysis::OK; } diff --git a/src/Analysis_HausdorffDistance.h b/src/Analysis_HausdorffDistance.h index b66cdb8d56..ecac1fa52b 100644 --- a/src/Analysis_HausdorffDistance.h +++ b/src/Analysis_HausdorffDistance.h @@ -8,7 +8,7 @@ */ class Analysis_HausdorffDistance : public Analysis { public: - Analysis_HausdorffDistance() {} + Analysis_HausdorffDistance(); DispatchObject* Alloc() const { return (DispatchObject*)new Analysis_HausdorffDistance(); } void Help() const; @@ -17,6 +17,10 @@ class Analysis_HausdorffDistance : public Analysis { private: static double h_Matrix(DataSet_2D*); + enum OutType { BASIC = 0, UPPER_TRI_MATRIX }; + DataSetList inputSets_; + OutType outType_; + DataSet* out_; }; #endif diff --git a/src/cpptrajdepend b/src/cpptrajdepend index bdcc556231..8bbc89038d 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -95,7 +95,7 @@ Analysis_CrossCorr.o : Analysis_CrossCorr.cpp ActionState.h Analysis.h AnalysisS Analysis_CurveFit.o : Analysis_CurveFit.cpp ActionState.h Analysis.h AnalysisState.h Analysis_CurveFit.h ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h CurveFit.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Mesh.h Dimension.h DispatchObject.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h RPNcalc.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Spline.h StringRoutines.h TextFormat.h Timer.h Topology.h Vec3.h Analysis_Divergence.o : Analysis_Divergence.cpp ActionState.h Analysis.h AnalysisState.h Analysis_Divergence.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_1D.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.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 Analysis_FFT.o : Analysis_FFT.cpp ActionState.h Analysis.h AnalysisState.h Analysis_FFT.h ArgList.h Array1D.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h ComplexArray.h CoordinateInfo.h CpptrajFile.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 FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h PubFFT.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h TextFormat.h Timer.h Topology.h Vec3.h -Analysis_HausdorffDistance.o : Analysis_HausdorffDistance.cpp ActionState.h Analysis.h AnalysisState.h Analysis_HausdorffDistance.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_2D.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.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 +Analysis_HausdorffDistance.o : Analysis_HausdorffDistance.cpp ActionState.h Analysis.h AnalysisState.h Analysis_HausdorffDistance.h ArgList.h ArrayIterator.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_2D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_MatrixFlt.h Dimension.h DispatchObject.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix.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 Analysis_Hist.o : Analysis_Hist.cpp ActionFrameCounter.h ActionState.h Analysis.h AnalysisState.h Analysis_Hist.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataIO.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_3D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_GridFlt.h DataSet_MatrixDbl.h DataSet_double.h Dimension.h DispatchObject.h FileIO.h FileName.h FileTypes.h Frame.h FrameArray.h FramePtrArray.h Grid.h GridBin.h HistBin.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TrajectoryFile.h TrajectoryIO.h Trajout_Single.h Vec3.h Analysis_Integrate.o : Analysis_Integrate.cpp ActionState.h Analysis.h AnalysisState.h Analysis_Integrate.h ArgList.h Array1D.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_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Mesh.h Dimension.h DispatchObject.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 Spline.h TextFormat.h Timer.h Topology.h Vec3.h Analysis_IRED.o : Analysis_IRED.cpp ActionState.h Analysis.h AnalysisState.h Analysis_IRED.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h ComplexArray.h Constants.h CoordinateInfo.h Corr.h CpptrajFile.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_Modes.h DataSet_Vector.h DataSet_double.h Dimension.h DispatchObject.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h PubFFT.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h TextFormat.h Timer.h Topology.h Vec3.h From f9b2df74526c5e338a7d6d5c7fb927983cf61f35 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 23 Apr 2018 14:43:01 -0400 Subject: [PATCH 06/28] DRR - Cpptraj: Start implementing a sync option for parallel analysis --- src/Exec_ParallelAnalysis.cpp | 40 ++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Exec_ParallelAnalysis.cpp b/src/Exec_ParallelAnalysis.cpp index c5ccf98db2..2a46a224cb 100644 --- a/src/Exec_ParallelAnalysis.cpp +++ b/src/Exec_ParallelAnalysis.cpp @@ -5,12 +5,19 @@ // Exec_ParallelAnalysis::Help() void Exec_ParallelAnalysis::Help() const { - + mprintf("\t[sync]\n"); } // Exec_ParallelAnalysis::Execute() Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn) { + bool syncToMaster = argIn.hasKey("sync"); + std::vector setSizesBefore; + if (syncToMaster) { + setSizesBefore.reserve( State.DSL().size() ); + for (DataSetList::const_iterator it = State.DSL().begin(); it != State.DSL().end(); ++it) + setSizesBefore.push_back( (*it)->Size() ); + } // DEBUG - Have each thread report what analyses it knows about and what // data sets it has. /* @@ -44,6 +51,37 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn if (Parallel::World().CheckError( nerr )) return CpptrajState::ERR; State.DFL().AllThreads_WriteAllDF(); State.Analyses().Clear(); + if (syncToMaster) { + // Check which sizes have changed. + if (setSizesBefore.size() != State.DSL().size()) { + mprintf("Warning: Number of sets have changed. Not attempting to sync sets to master.\n"); + } else { + for (unsigned int idx = 0; idx != State.DSL().size(); idx++) { + int setHasChanged = 0; + if (!Parallel::World().Master()) { + if (setSizesBefore[idx] != State.DSL()[idx]->Size()) { + rprintf("Set '%s' size has changed from %u to %zu\n", + State.DSL()[idx]->legend(), setSizesBefore[idx], State.DSL()[idx]->Size()); + setHasChanged = 1; + } + } + int totalChanged; + Parallel::World().AllReduce(&totalChanged, &setHasChanged, 1, MPI_INT, MPI_SUM); + if (totalChanged > 0) { + if (totalChanged == 1) { + int sourceRank = 0; + if (setHasChanged == 1) + setHasChanged = Parallel::World().Rank(); + Parallel::World().ReduceMaster(&sourceRank, &setHasChanged, 1, MPI_INT, MPI_SUM); + mprintf("DEBUG: Need to sync '%s' from %i\n", State.DSL()[idx]->legend(), sourceRank); + //if (Parallel::World().Master()) + } else + mprintf("DEBUG: '%s' exists on multiple threads. Not syncing.\n", + State.DSL()[idx]->legend()); + } + } + } + } return CpptrajState::OK; } #else From cfe2e1a3d86e79062d4123ebe96a22da51e7efec Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 23 Apr 2018 15:03:06 -0400 Subject: [PATCH 07/28] DRR - Cpptraj: Simple data set sync after analysis to master. Only works for float matrices so far. --- src/DataSet.h | 3 +++ src/DataSet_MatrixFlt.cpp | 28 ++++++++++++++++++++++++++++ src/DataSet_MatrixFlt.h | 2 ++ src/Exec_ParallelAnalysis.cpp | 5 ++++- src/Matrix.h | 2 +- src/Parallel.h | 3 +++ 6 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/DataSet.h b/src/DataSet.h index 3cecd17038..01df933beb 100644 --- a/src/DataSet.h +++ b/src/DataSet.h @@ -67,6 +67,9 @@ class DataSet { # ifdef MPI /// Piece this DataSet together from multiple threads. virtual int Sync(size_t, std::vector const&, Parallel::Comm const&) = 0; + // TODO pure virtual + virtual int SendSet(int, Parallel::Comm const&) { return 1; } + virtual int RecvSet(int, Parallel::Comm const&) { return 1; } # endif // ----------------------------------------------------- /// Associate additional data with this set. diff --git a/src/DataSet_MatrixFlt.cpp b/src/DataSet_MatrixFlt.cpp index 5a6dcfd8a2..9eabeeac10 100644 --- a/src/DataSet_MatrixFlt.cpp +++ b/src/DataSet_MatrixFlt.cpp @@ -26,4 +26,32 @@ int DataSet_MatrixFlt::Sync(size_t total, std::vector const& rank_frames, commIn.ReduceMaster( 0, &(mat_[0]), mat_.size(), MPI_FLOAT, MPI_SUM ); return 0; } + +int DataSet_MatrixFlt::SendSet(int dest, Parallel::Comm const& commIn) { + // First send the size + type + int size[3]; + size[0] = mat_.Ncols(); + size[1] = mat_.Nrows(); + size[2] = (int)mat_.Type(); + commIn.Send( &size, 3, MPI_INT, dest, 1700 ); + // Then send the matrix + commIn.Send( &(mat_[0]), mat_.size(), MPI_FLOAT, dest, 1701 ); + return 0; +} + +int DataSet_MatrixFlt::RecvSet(int src, Parallel::Comm const& commIn) { + // First receive the size + type + int size[3]; + commIn.Recv( &size, 3, MPI_INT, src, 1700 ); + if (size[2] == 0) // FULL + mat_.resize(size[0], size[1]); + else if (size[2] == 1) // HALF + mat_.resize(size[0], 0); + else // TRI + mat_.resize(0, size[1]); + // Then receive the matrix + commIn.Recv( &(mat_[0]), mat_.size(), MPI_FLOAT, src, 1701); + return 0; +} + #endif diff --git a/src/DataSet_MatrixFlt.h b/src/DataSet_MatrixFlt.h index 9a9362eec0..90ab289fce 100644 --- a/src/DataSet_MatrixFlt.h +++ b/src/DataSet_MatrixFlt.h @@ -13,6 +13,8 @@ class DataSet_MatrixFlt : public DataSet_2D { # ifdef MPI // FIXME: Currently just sums up. Should this be a separate Sync function? int Sync(size_t, std::vector const&, Parallel::Comm const&); + int SendSet(int, Parallel::Comm const&); + int RecvSet(int, Parallel::Comm const&); # endif void Info() const { return; } void WriteBuffer(CpptrajFile&, SizeArray const&) const; diff --git a/src/Exec_ParallelAnalysis.cpp b/src/Exec_ParallelAnalysis.cpp index 2a46a224cb..816a4eb7b1 100644 --- a/src/Exec_ParallelAnalysis.cpp +++ b/src/Exec_ParallelAnalysis.cpp @@ -74,7 +74,10 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn setHasChanged = Parallel::World().Rank(); Parallel::World().ReduceMaster(&sourceRank, &setHasChanged, 1, MPI_INT, MPI_SUM); mprintf("DEBUG: Need to sync '%s' from %i\n", State.DSL()[idx]->legend(), sourceRank); - //if (Parallel::World().Master()) + if (Parallel::World().Master()) + State.DSL()[idx]->RecvSet( sourceRank, Parallel::World() ); + else if (setHasChanged == Parallel::World().Rank()) + State.DSL()[idx]->SendSet( 0, Parallel::World() ); } else mprintf("DEBUG: '%s' exists on multiple threads. Not syncing.\n", State.DSL()[idx]->legend()); diff --git a/src/Matrix.h b/src/Matrix.h index 2443e88402..3245381253 100644 --- a/src/Matrix.h +++ b/src/Matrix.h @@ -24,7 +24,7 @@ template class Matrix { /// \return total number of elements in the matrix. size_t size() const { return nelements_; } /// \return current matrix type. - //MType Type() const { return type_; } + MType Type() const { return type_; } /// \return estimated size in bytes. static size_t sizeInBytes(size_t,size_t); /// Set up matrix for given number of cols and rows. diff --git a/src/Parallel.h b/src/Parallel.h index a1f02147a4..d6e1e2ea01 100644 --- a/src/Parallel.h +++ b/src/Parallel.h @@ -34,6 +34,9 @@ * 1400+X: Action_AtomicCorr: Atomic movement vectors * 1500 : Action_NAstruct: Array containing BP step info on rank. * 1501+X: Array of step series data from rank. + * 1600+X: Ensemble sort + * 1700 : DataSet_MatrixFlt size + * 1701 : DataSet_MatrixFlt buffer */ class Parallel { public: From d7c92ab11b521507e211e182baf4b675f0d2ad9c Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 23 Apr 2018 15:39:14 -0400 Subject: [PATCH 08/28] DRR - Cpptraj: Add some timing data. --- src/Exec_ParallelAnalysis.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Exec_ParallelAnalysis.cpp b/src/Exec_ParallelAnalysis.cpp index 816a4eb7b1..808661bba0 100644 --- a/src/Exec_ParallelAnalysis.cpp +++ b/src/Exec_ParallelAnalysis.cpp @@ -1,6 +1,7 @@ #include "Exec_ParallelAnalysis.h" #include "CpptrajStdio.h" #ifdef MPI +#include "Timer.h" #include // DEBUG // Exec_ParallelAnalysis::Help() void Exec_ParallelAnalysis::Help() const @@ -11,12 +12,17 @@ void Exec_ParallelAnalysis::Help() const // Exec_ParallelAnalysis::Execute() Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn) { + Timer t_total; + t_total.Start(); + Timer t_sync; bool syncToMaster = argIn.hasKey("sync"); std::vector setSizesBefore; if (syncToMaster) { + t_sync.Start(); setSizesBefore.reserve( State.DSL().size() ); for (DataSetList::const_iterator it = State.DSL().begin(); it != State.DSL().end(); ++it) setSizesBefore.push_back( (*it)->Size() ); + t_sync.Stop(); } // DEBUG - Have each thread report what analyses it knows about and what // data sets it has. @@ -52,6 +58,7 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn State.DFL().AllThreads_WriteAllDF(); State.Analyses().Clear(); if (syncToMaster) { + t_sync.Start(); // Check which sizes have changed. if (setSizesBefore.size() != State.DSL().size()) { mprintf("Warning: Number of sets have changed. Not attempting to sync sets to master.\n"); @@ -84,7 +91,12 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn } } } + t_sync.Stop(); } + t_total.Stop(); + t_total.WriteTiming(1, "Total:"); + if (syncToMaster) + t_sync.WriteTiming(2, "Sync:", t_total.Total()); return CpptrajState::OK; } #else From d1fe5d29c636d9fa48168f4a10179e80fdb4a61e Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 2 Jan 2019 14:31:10 -0500 Subject: [PATCH 09/28] DRR - Cpptraj: Fix parallel compile. --- src/Exec_ParallelAnalysis.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Exec_ParallelAnalysis.cpp b/src/Exec_ParallelAnalysis.cpp index 808661bba0..faaeb95cfd 100644 --- a/src/Exec_ParallelAnalysis.cpp +++ b/src/Exec_ParallelAnalysis.cpp @@ -40,7 +40,7 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn */ // Naively divide up all analyses among threads. int my_start, my_stop; - int nelts = Parallel::World().DivideAmongThreads( my_start, my_stop, State.Analyses().size() ); + int nelts = Parallel::World().DivideAmongProcesses( my_start, my_stop, State.Analyses().size() ); rprintf("Dividing %zu analyses among %i threads: %i to %i (%i)\n", State.Analyses().size(), Parallel::World().Size(), my_start, my_stop, nelts); From c34273a661351686345010a6e1ae19d421849791 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 09:41:05 -0500 Subject: [PATCH 10/28] DRR - Cpptraj: Fix up Hausdorff distance calc. Was previously only doing a single directed Hausdorff distance. Now doing both and the symmetric distance as well. --- src/Analysis_HausdorffDistance.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp index 0552cd5057..ec898b27f7 100644 --- a/src/Analysis_HausdorffDistance.cpp +++ b/src/Analysis_HausdorffDistance.cpp @@ -8,7 +8,12 @@ Analysis_HausdorffDistance::Analysis_HausdorffDistance() : {} /** Assume input matrix contains all distances beween sets A and B. - * The Hausdorff distance will be the maximum of all minimums in each row. + * The directed Hausdorff distance from A to B will be the maximum of all + * minimums in each row. + * The directed Hausdorff distance from B to A will be the maximum of all + * minimums in each column. + * The symmetric Hausdorff distance is the max of the two directed distances. + * \return the symmetric Hausdorff distance. */ double Analysis_HausdorffDistance::h_Matrix(DataSet_2D* m1) { if (m1 == 0) { @@ -19,16 +24,31 @@ double Analysis_HausdorffDistance::h_Matrix(DataSet_2D* m1) { mprinterr("Error: '%s' is empty.\n", m1->legend()); return -1.0; } - double hd = 0.0; - // Row 1 - initial value. + // Hausdorff distance from A to B. + double hd_ab = 0.0; for (unsigned int row = 0; row != m1->Nrows(); row++) { double minRow = m1->GetElement(0, row); for (unsigned int col = 1; col != m1->Ncols(); col++) minRow = std::min( minRow, m1->GetElement(col, row) ); - //mprintf("DEBUG: Min row %6u is %12.4f\n", row, minRow); - hd = std::max( hd, minRow ); + mprintf("DEBUG: Min row %6u is %12.4f\n", row, minRow); + hd_ab = std::max( hd_ab, minRow ); + } + mprintf("DEBUG: Hausdorff A to B= %12.4f\n", hd_ab); + // Hausdorff distance from B to A. + double hd_ba = 0.0; + for (unsigned int col = 0; col != m1->Ncols(); col++) + { + double minCol = m1->GetElement(col, 0); + for (unsigned int row = 1; row != m1->Nrows(); row++) + minCol = std::min( minCol, m1->GetElement(col, row) ); + mprintf("DEBUG: Min col %6u is %12.4f\n", col, minCol); + hd_ba = std::max( hd_ba, minCol); } + mprintf("DEBUG: Hausdorff B to A= %12.4f\n", hd_ba); + // Symmetric Hausdorff distance + double hd = std::max( hd_ab, hd_ba ); + return hd; } From 6212cbd2ee49e0dd265065513d67936623d64844 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 09:54:50 -0500 Subject: [PATCH 11/28] DRR - Cpptraj: Pass distance matrix in as const ref. Add help text and clean up info. --- src/Analysis_HausdorffDistance.cpp | 47 ++++++++++++++++++------------ src/Analysis_HausdorffDistance.h | 2 +- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp index ec898b27f7..99f918136f 100644 --- a/src/Analysis_HausdorffDistance.cpp +++ b/src/Analysis_HausdorffDistance.cpp @@ -15,33 +15,33 @@ Analysis_HausdorffDistance::Analysis_HausdorffDistance() : * The symmetric Hausdorff distance is the max of the two directed distances. * \return the symmetric Hausdorff distance. */ -double Analysis_HausdorffDistance::h_Matrix(DataSet_2D* m1) { - if (m1 == 0) { - mprinterr("Internal Error: Analysis_HausdorffDistance::h_Matrix(): Matrix set is null.\n"); - return -1.0; - } - if (m1->Size() < 1) { - mprinterr("Error: '%s' is empty.\n", m1->legend()); +double Analysis_HausdorffDistance::CalcHausdorffFromMatrix(DataSet_2D const& m1) { +// if (m1 == 0) { +// mprinterr("Internal Error: Analysis_HausdorffDistance::(): Matrix set is null.\n"); +// return -1.0; +// } + if (m1.Size() < 1) { + mprinterr("Error: '%s' is empty.\n", m1.legend()); return -1.0; } // Hausdorff distance from A to B. double hd_ab = 0.0; - for (unsigned int row = 0; row != m1->Nrows(); row++) + for (unsigned int row = 0; row != m1.Nrows(); row++) { - double minRow = m1->GetElement(0, row); - for (unsigned int col = 1; col != m1->Ncols(); col++) - minRow = std::min( minRow, m1->GetElement(col, row) ); + double minRow = m1.GetElement(0, row); + for (unsigned int col = 1; col != m1.Ncols(); col++) + minRow = std::min( minRow, m1.GetElement(col, row) ); mprintf("DEBUG: Min row %6u is %12.4f\n", row, minRow); hd_ab = std::max( hd_ab, minRow ); } mprintf("DEBUG: Hausdorff A to B= %12.4f\n", hd_ab); // Hausdorff distance from B to A. double hd_ba = 0.0; - for (unsigned int col = 0; col != m1->Ncols(); col++) + for (unsigned int col = 0; col != m1.Ncols(); col++) { - double minCol = m1->GetElement(col, 0); - for (unsigned int row = 1; row != m1->Nrows(); row++) - minCol = std::min( minCol, m1->GetElement(col, row) ); + double minCol = m1.GetElement(col, 0); + for (unsigned int row = 1; row != m1.Nrows(); row++) + minCol = std::min( minCol, m1.GetElement(col, row) ); mprintf("DEBUG: Min col %6u is %12.4f\n", col, minCol); hd_ba = std::max( hd_ba, minCol); } @@ -55,7 +55,11 @@ double Analysis_HausdorffDistance::h_Matrix(DataSet_2D* m1) { // Analysis_HausdorffDistance::Help() void Analysis_HausdorffDistance::Help() const { mprintf("\t [ ...] [outtype {basic|trimatrix nrows <#>}]\n" - "\t[name ] [out ]\n"); + "\t[name ] [out ]\n" + " Given 1 or more 2D matrices containing distances between two sets\n" + " A and B, calculate the symmetric Hausdorff distance for each matrix.\n" + " The results can be saved as an array or as an upper-triangular\n" + " matrix with the specified number of rows.\n"); } @@ -108,8 +112,15 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys if (df != 0) df->AddDataSet( out_ ); mprintf(" HAUSDORFF:\n"); + mprintf("\tCalculating Hausdorff distances from the following 2D distance matrices:\n"); for (DataSetList::const_iterator it = inputSets_.begin(); it != inputSets_.end(); ++it) - mprintf("\t%s\n", (*it)->legend()); + mprintf("\t %s\n", (*it)->legend()); + if (outType_ == BASIC) + mprintf("\tOutput will be stored in 1D array set '%s'\n", out_->legend()); + else if (outType_ == UPPER_TRI_MATRIX) + mprintf("\tOutput will be stored in upper-triangular matrix set '%s' with %i rows.\n", + out_->legend(), nrows); + if (df != 0) mprintf("\tOutput set written to '%s'\n", df->DataFilename().full()); return Analysis::OK; } @@ -123,7 +134,7 @@ Analysis::RetType Analysis_HausdorffDistance::Analyze() { { hd = -1.0; if ( (*it)->Group() == DataSet::MATRIX_2D ) - hd = h_Matrix( static_cast( *it ) ); + hd = CalcHausdorffFromMatrix( static_cast( *(*it) ) ); else mprintf("Warning: '%s' type not yet supported for Hausdorff\n", (*it)->legend()); mprintf("%12.4f %s\n", hd, (*it)->legend()); diff --git a/src/Analysis_HausdorffDistance.h b/src/Analysis_HausdorffDistance.h index ecac1fa52b..15054fd484 100644 --- a/src/Analysis_HausdorffDistance.h +++ b/src/Analysis_HausdorffDistance.h @@ -15,7 +15,7 @@ class Analysis_HausdorffDistance : public Analysis { Analysis::RetType Setup(ArgList&, AnalysisSetup&, int); Analysis::RetType Analyze(); private: - static double h_Matrix(DataSet_2D*); + static double CalcHausdorffFromMatrix(DataSet_2D const&); enum OutType { BASIC = 0, UPPER_TRI_MATRIX }; From 2d58b79ff03242233b713fcbfcf5312ab82eb9a1 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 10:04:58 -0500 Subject: [PATCH 12/28] DRR - Cpptraj: Add output data sets for directed Hausdorff --- src/Analysis_HausdorffDistance.cpp | 46 ++++++++++++++++++++++++------ src/Analysis_HausdorffDistance.h | 4 ++- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp index 99f918136f..d86bc56567 100644 --- a/src/Analysis_HausdorffDistance.cpp +++ b/src/Analysis_HausdorffDistance.cpp @@ -4,7 +4,9 @@ Analysis_HausdorffDistance::Analysis_HausdorffDistance() : outType_(BASIC), - out_(0) + out_(0), + ab_out_(0), + ba_out_(0) {} /** Assume input matrix contains all distances beween sets A and B. @@ -13,9 +15,14 @@ Analysis_HausdorffDistance::Analysis_HausdorffDistance() : * The directed Hausdorff distance from B to A will be the maximum of all * minimums in each column. * The symmetric Hausdorff distance is the max of the two directed distances. + * \param m1 The matrix containing distances from A to B. + * \param hd_ab The directed Hausdorff distance from A to B. + * \param hd_ba The directed Hausdorff distance from B to A. * \return the symmetric Hausdorff distance. */ -double Analysis_HausdorffDistance::CalcHausdorffFromMatrix(DataSet_2D const& m1) { +double Analysis_HausdorffDistance::CalcHausdorffFromMatrix(DataSet_2D const& m1, + double& hd_ab, double& hd_ba) +{ // if (m1 == 0) { // mprinterr("Internal Error: Analysis_HausdorffDistance::(): Matrix set is null.\n"); // return -1.0; @@ -25,7 +32,7 @@ double Analysis_HausdorffDistance::CalcHausdorffFromMatrix(DataSet_2D const& m1) return -1.0; } // Hausdorff distance from A to B. - double hd_ab = 0.0; + hd_ab = 0.0; for (unsigned int row = 0; row != m1.Nrows(); row++) { double minRow = m1.GetElement(0, row); @@ -36,7 +43,7 @@ double Analysis_HausdorffDistance::CalcHausdorffFromMatrix(DataSet_2D const& m1) } mprintf("DEBUG: Hausdorff A to B= %12.4f\n", hd_ab); // Hausdorff distance from B to A. - double hd_ba = 0.0; + hd_ba = 0.0; for (unsigned int col = 0; col != m1.Ncols(); col++) { double minCol = m1.GetElement(col, 0); @@ -102,6 +109,11 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys if (outType_ == BASIC) { out_ = setup.DSL().AddSet(DataSet::FLOAT, dsname, "HAUSDORFF"); if (out_ == 0) return Analysis::ERR; + // Directed sets + ab_out_ = setup.DSL().AddSet(DataSet::FLOAT, MetaData(out_->Meta().Name(),"AB")); + if (ab_out_ == 0) return Analysis::ERR; + ba_out_ = setup.DSL().AddSet(DataSet::FLOAT, MetaData(out_->Meta().Name(),"BA")); + if (ba_out_ == 0) return Analysis::ERR; } else if (outType_ == UPPER_TRI_MATRIX) { out_ = setup.DSL().AddSet(DataSet::MATRIX_FLT, dsname, "HAUSDORFF"); if (out_ == 0 || ((DataSet_2D*)out_)->AllocateTriangle( nrows )) return Analysis::ERR; @@ -109,7 +121,11 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys mprintf("Warning: Number of input data sets (%zu) != number of expected sets in matrix (%zu)\n", inputSets_.size(), out_->Size()); } - if (df != 0) df->AddDataSet( out_ ); + if (df != 0) { + df->AddDataSet( out_ ); + df->AddDataSet( ab_out_ ); + df->AddDataSet( ba_out_ ); + } mprintf(" HAUSDORFF:\n"); mprintf("\tCalculating Hausdorff distances from the following 2D distance matrices:\n"); @@ -120,6 +136,8 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys else if (outType_ == UPPER_TRI_MATRIX) mprintf("\tOutput will be stored in upper-triangular matrix set '%s' with %i rows.\n", out_->legend(), nrows); + mprintf("\tDirected A->B distance output set: %s\n", ab_out_->legend()); + mprintf("\tDirected B->A distance output set: %s\n", ba_out_->legend()); if (df != 0) mprintf("\tOutput set written to '%s'\n", df->DataFilename().full()); return Analysis::OK; @@ -129,19 +147,31 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys Analysis::RetType Analysis_HausdorffDistance::Analyze() { // Get the Hausdorff distance for each set. double hd = 0.0; + double hd_ab = 0.0; + double hd_ba = 0.0; int idx = 0; for (DataSetList::const_iterator it = inputSets_.begin(); it != inputSets_.end(); ++it) { hd = -1.0; + hd_ab = -1.0; + hd_ba = -1.0; if ( (*it)->Group() == DataSet::MATRIX_2D ) - hd = CalcHausdorffFromMatrix( static_cast( *(*it) ) ); + hd = CalcHausdorffFromMatrix( static_cast( *(*it) ), hd_ab, hd_ba ); else mprintf("Warning: '%s' type not yet supported for Hausdorff\n", (*it)->legend()); mprintf("%12.4f %s\n", hd, (*it)->legend()); float fhd = (float)hd; + float fab = (float)hd_ab; + float fba = (float)hd_ba; switch (outType_) { - case BASIC : out_->Add(idx++, &fhd); break; - case UPPER_TRI_MATRIX : ((DataSet_MatrixFlt*)out_)->AddElement( fhd ); break; + case BASIC : + out_->Add(idx, &fhd); + ab_out_->Add(idx, &fab); + ba_out_->Add(idx++, &fba); + break; + case UPPER_TRI_MATRIX : + ((DataSet_MatrixFlt*)out_)->AddElement( fhd ); + break; } } return Analysis::OK; diff --git a/src/Analysis_HausdorffDistance.h b/src/Analysis_HausdorffDistance.h index 15054fd484..fbc9dabea2 100644 --- a/src/Analysis_HausdorffDistance.h +++ b/src/Analysis_HausdorffDistance.h @@ -15,12 +15,14 @@ class Analysis_HausdorffDistance : public Analysis { Analysis::RetType Setup(ArgList&, AnalysisSetup&, int); Analysis::RetType Analyze(); private: - static double CalcHausdorffFromMatrix(DataSet_2D const&); + static double CalcHausdorffFromMatrix(DataSet_2D const&, double&, double&); enum OutType { BASIC = 0, UPPER_TRI_MATRIX }; DataSetList inputSets_; OutType outType_; DataSet* out_; + DataSet* ab_out_; + DataSet* ba_out_; }; #endif From bfa70017bd20f8e0f98b0d0a60acec4313a61afe Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 10:12:54 -0500 Subject: [PATCH 13/28] DRR - Cpptraj: Add keywords for redirecting directed Hausdorff output --- src/Analysis_HausdorffDistance.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp index d86bc56567..c5c83c2cde 100644 --- a/src/Analysis_HausdorffDistance.cpp +++ b/src/Analysis_HausdorffDistance.cpp @@ -62,7 +62,7 @@ double Analysis_HausdorffDistance::CalcHausdorffFromMatrix(DataSet_2D const& m1, // Analysis_HausdorffDistance::Help() void Analysis_HausdorffDistance::Help() const { mprintf("\t [ ...] [outtype {basic|trimatrix nrows <#>}]\n" - "\t[name ] [out ]\n" + "\t[name ] [out ] [outab ] [outba ]\n" " Given 1 or more 2D matrices containing distances between two sets\n" " A and B, calculate the symmetric Hausdorff distance for each matrix.\n" " The results can be saved as an array or as an upper-triangular\n" @@ -94,6 +94,8 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys outType_ = BASIC; std::string dsname = analyzeArgs.GetStringKey("name"); DataFile* df = setup.DFL().AddDataFile( analyzeArgs.GetStringKey("out"), analyzeArgs ); + DataFile* dfab = setup.DFL().AddDataFile( analyzeArgs.GetStringKey("outab"), analyzeArgs ); + DataFile* dfba = setup.DFL().AddDataFile( analyzeArgs.GetStringKey("outba"), analyzeArgs ); // Get input data sets std::string dsarg = analyzeArgs.GetStringNext(); while (!dsarg.empty()) { @@ -120,12 +122,18 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys if (out_->Size() != inputSets_.size()) mprintf("Warning: Number of input data sets (%zu) != number of expected sets in matrix (%zu)\n", inputSets_.size(), out_->Size()); + // Directed sets + ab_out_ = setup.DSL().AddSet(DataSet::MATRIX_FLT, MetaData(out_->Meta().Name(),"AB")); + if (ab_out_ == 0 || ((DataSet_2D*)ab_out_)->AllocateTriangle( nrows )) return Analysis::ERR; + ba_out_ = setup.DSL().AddSet(DataSet::MATRIX_FLT, MetaData(out_->Meta().Name(),"BA")); + if (ba_out_ == 0 || ((DataSet_2D*)ba_out_)->AllocateTriangle( nrows )) return Analysis::ERR; } - if (df != 0) { + if (df != 0) df->AddDataSet( out_ ); + if (dfab != 0) df->AddDataSet( ab_out_ ); + if (dfba != 0) df->AddDataSet( ba_out_ ); - } mprintf(" HAUSDORFF:\n"); mprintf("\tCalculating Hausdorff distances from the following 2D distance matrices:\n"); @@ -139,6 +147,8 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys mprintf("\tDirected A->B distance output set: %s\n", ab_out_->legend()); mprintf("\tDirected B->A distance output set: %s\n", ba_out_->legend()); if (df != 0) mprintf("\tOutput set written to '%s'\n", df->DataFilename().full()); + if (dfab != 0) mprintf("\tA->B output set written to '%s'\n", dfab->DataFilename().full()); + if (dfba != 0) mprintf("\tB->A output set written to '%s'\n", dfba->DataFilename().full()); return Analysis::OK; } From 71298d0fe8453f7d776f98721964fcf51cb1385d Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 10:14:06 -0500 Subject: [PATCH 14/28] DRR - Cpptraj: Simple Hausdorff distance test. --- test/Test_Hausdorff/RunTest.sh | 24 ++++++++++++++++++++++++ test/Test_Hausdorff/hd.dat.save | 2 ++ 2 files changed, 26 insertions(+) create mode 100755 test/Test_Hausdorff/RunTest.sh create mode 100644 test/Test_Hausdorff/hd.dat.save diff --git a/test/Test_Hausdorff/RunTest.sh b/test/Test_Hausdorff/RunTest.sh new file mode 100755 index 0000000000..30e3da98d0 --- /dev/null +++ b/test/Test_Hausdorff/RunTest.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +. ../MasterTest.sh + +CleanFiles matrix.dat hd.in hd.dat + +INPUT='-i hd.in' + +cat > matrix.dat < hd.in < Date: Fri, 1 Feb 2019 10:45:57 -0500 Subject: [PATCH 15/28] DRR - Cpptraj: More complex test with 2d rms --- test/Test_Hausdorff/RunTest.sh | 32 +++- test/Test_Hausdorff/hausdorff.matrix.gnu.save | 141 ++++++++++++++++++ 2 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 test/Test_Hausdorff/hausdorff.matrix.gnu.save diff --git a/test/Test_Hausdorff/RunTest.sh b/test/Test_Hausdorff/RunTest.sh index 30e3da98d0..b4643ae0a3 100755 --- a/test/Test_Hausdorff/RunTest.sh +++ b/test/Test_Hausdorff/RunTest.sh @@ -2,10 +2,12 @@ . ../MasterTest.sh -CleanFiles matrix.dat hd.in hd.dat +CleanFiles matrix.dat hd.in hd.dat rms2d.dat rms2d.gnu hausdorff.matrix.dat \ + hausdoff.matrix.gnu INPUT='-i hd.in' +# Simple Hausdorff distance from matrix. cat > matrix.dat < hd.in < hd.in < Date: Fri, 1 Feb 2019 10:51:18 -0500 Subject: [PATCH 16/28] DRR - Cpptraj: Check for 2D sets in setup --- src/Analysis_HausdorffDistance.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp index c5c83c2cde..e08da6a7dc 100644 --- a/src/Analysis_HausdorffDistance.cpp +++ b/src/Analysis_HausdorffDistance.cpp @@ -99,7 +99,16 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys // Get input data sets std::string dsarg = analyzeArgs.GetStringNext(); while (!dsarg.empty()) { - inputSets_ += setup.DSL().GetMultipleSets( dsarg ); + DataSetList selected = setup.DSL().GetMultipleSets( dsarg ); + for (DataSetList::const_iterator set = selected.begin(); set != selected.end(); ++set) + { + if ((*set)->Group() == DataSet::MATRIX_2D) + inputSets_.AddCopyOfSet( *set ); + else + mprintf("Warning: Currently only 2D matrices supported; skipping set '%s'\n", + (*set)->legend()); + } + //inputSets_ += setup.DSL().GetMultipleSets( dsarg ); dsarg = analyzeArgs.GetStringNext(); } if (inputSets_.empty()) { From 7208f708a39adc68c5ea5da46b596e0bc696bcfa Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 10:57:00 -0500 Subject: [PATCH 17/28] DRR - Cpptraj: Hide debug info --- src/Analysis_HausdorffDistance.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp index e08da6a7dc..060c473a99 100644 --- a/src/Analysis_HausdorffDistance.cpp +++ b/src/Analysis_HausdorffDistance.cpp @@ -38,10 +38,10 @@ double Analysis_HausdorffDistance::CalcHausdorffFromMatrix(DataSet_2D const& m1, double minRow = m1.GetElement(0, row); for (unsigned int col = 1; col != m1.Ncols(); col++) minRow = std::min( minRow, m1.GetElement(col, row) ); - mprintf("DEBUG: Min row %6u is %12.4f\n", row, minRow); + //mprintf("DEBUG: Min row %6u is %12.4f\n", row, minRow); hd_ab = std::max( hd_ab, minRow ); } - mprintf("DEBUG: Hausdorff A to B= %12.4f\n", hd_ab); + //mprintf("DEBUG: Hausdorff A to B= %12.4f\n", hd_ab); // Hausdorff distance from B to A. hd_ba = 0.0; for (unsigned int col = 0; col != m1.Ncols(); col++) @@ -49,10 +49,10 @@ double Analysis_HausdorffDistance::CalcHausdorffFromMatrix(DataSet_2D const& m1, double minCol = m1.GetElement(col, 0); for (unsigned int row = 1; row != m1.Nrows(); row++) minCol = std::min( minCol, m1.GetElement(col, row) ); - mprintf("DEBUG: Min col %6u is %12.4f\n", col, minCol); + //mprintf("DEBUG: Min col %6u is %12.4f\n", col, minCol); hd_ba = std::max( hd_ba, minCol); } - mprintf("DEBUG: Hausdorff B to A= %12.4f\n", hd_ba); + //mprintf("DEBUG: Hausdorff B to A= %12.4f\n", hd_ba); // Symmetric Hausdorff distance double hd = std::max( hd_ab, hd_ba ); From e9a6aa8b604a1336180a55fe6a23a34ac4ff799f Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 10:57:13 -0500 Subject: [PATCH 18/28] DRR - Cpptraj: Fix output for real triangular matrix --- test/Test_Hausdorff/RunTest.sh | 23 ++- test/Test_Hausdorff/hausdorff.matrix.gnu.save | 180 +++++++++--------- 2 files changed, 104 insertions(+), 99 deletions(-) diff --git a/test/Test_Hausdorff/RunTest.sh b/test/Test_Hausdorff/RunTest.sh index b4643ae0a3..dcbb2f37e0 100755 --- a/test/Test_Hausdorff/RunTest.sh +++ b/test/Test_Hausdorff/RunTest.sh @@ -23,12 +23,12 @@ RunCpptraj "Simple Hausdorff distance test." DoTest hd.dat.save hd.dat # 2D RMS -#cat > hd.in < hd.in < hd.in <> hd.in done done +cat >> hd.in < Date: Fri, 1 Feb 2019 11:16:09 -0500 Subject: [PATCH 19/28] DRR - Cpptraj: Add title keyword for gnuplot output --- src/DataIO_Gnuplot.cpp | 10 +++++++++- src/DataIO_Gnuplot.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/DataIO_Gnuplot.cpp b/src/DataIO_Gnuplot.cpp index f8054cb917..6826ed5182 100644 --- a/src/DataIO_Gnuplot.cpp +++ b/src/DataIO_Gnuplot.cpp @@ -220,6 +220,7 @@ void DataIO_Gnuplot::WriteHelp() { "\tpm3d: Normal pm3d map output.\n" "\tnopm3d: Turn off pm3d\n" "\tjpeg: Plot will write to a JPEG file when used with gnuplot.\n" + "\ttitle: Plot title. Default is file name.\n" // "\tbinary: Use binary output\n" "\tnoheader: Do not format plot; data output only.\n" "\tpalette : Change gnuplot pm3d palette to :\n" @@ -242,6 +243,7 @@ int DataIO_Gnuplot::processWriteArgs(ArgList &argIn) { if (argIn.hasKey("jpeg")) jpegout_ = true; if (argIn.hasKey("binary")) binary_ = true; if (argIn.hasKey("noheader")) writeHeader_ = false; + title_ = argIn.GetStringKey("title"); if (!writeHeader_ && jpegout_) { mprintf("Warning: jpeg output not supported with 'noheader' option.\n"); jpegout_ = false; @@ -309,7 +311,13 @@ void DataIO_Gnuplot::WriteRangeAndHeader(Dimension const& Xdim, size_t Xmax, file_.Printf("set yrange [%8.3f:%8.3f]\nset xrange [%8.3f:%8.3f]\n", Ydim.Coord(0) - Ydim.Step(), Ydim.Coord(Ymax + 1), Xdim.Coord(0) - Xdim.Step(), Xdim.Coord(Xmax + 1)); - file_.Printf("splot \"%s\"%s%s title \"%s\"\n", data_fname_.full(), binaryFlag, pm3dstr.c_str(), file_.Filename().base()); + const char* tout; + if (!title_.empty()) + tout = title_.c_str(); + else + tout = file_.Filename().base(); + file_.Printf("splot \"%s\"%s%s title \"%s\"\n", data_fname_.full(), binaryFlag, pm3dstr.c_str(), + tout); } // DataIO_Gnuplot::Finish() diff --git a/src/DataIO_Gnuplot.h b/src/DataIO_Gnuplot.h index 2b21df8745..dc966b7152 100644 --- a/src/DataIO_Gnuplot.h +++ b/src/DataIO_Gnuplot.h @@ -16,6 +16,7 @@ class DataIO_Gnuplot : public DataIO { private: CpptrajFile file_; FileName data_fname_; ///< Data file name + std::string title_; ///< Plot title (output) typedef std::vector LabelArray; LabelArray Xlabels_; LabelArray Ylabels_; From 065370d1e9fed435f3995e5788a919bd522939d8 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 11:17:56 -0500 Subject: [PATCH 20/28] DRR - Cpptraj: Add full matrix output, ensure A->B and B->A matrices are populated. --- src/Analysis_HausdorffDistance.cpp | 45 ++++++++++++++++++++++++------ src/Analysis_HausdorffDistance.h | 2 +- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp index 060c473a99..29a54d9ac4 100644 --- a/src/Analysis_HausdorffDistance.cpp +++ b/src/Analysis_HausdorffDistance.cpp @@ -61,7 +61,8 @@ double Analysis_HausdorffDistance::CalcHausdorffFromMatrix(DataSet_2D const& m1, // Analysis_HausdorffDistance::Help() void Analysis_HausdorffDistance::Help() const { - mprintf("\t [ ...] [outtype {basic|trimatrix nrows <#>}]\n" + mprintf("\t [ ...]\n" + "\t[outtype {basic|trimatrix nrows <#>|fullmatrix nrows <#> [ncols <#>]}]\n" "\t[name ] [out ] [outab ] [outba ]\n" " Given 1 or more 2D matrices containing distances between two sets\n" " A and B, calculate the symmetric Hausdorff distance for each matrix.\n" @@ -75,6 +76,7 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys { // Keywords int nrows = -1; + int ncols = -1; std::string outtypearg = analyzeArgs.GetStringKey("outtype"); if (!outtypearg.empty()) { if (outtypearg == "basic") @@ -86,6 +88,18 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys mprinterr("Error: 'nrows' must be specified and > 0 for 'trimatrix'\n"); return Analysis::ERR; } + } else if (outtypearg == "fullmatrix") { + outType_ = FULL_MATRIX; + nrows = analyzeArgs.getKeyInt("nrows", -1); + if (nrows < 1) { + mprinterr("Error: 'nrows' must be specified and > 0 for 'fullmatrix'\n"); + return Analysis::ERR; + } + ncols = analyzeArgs.getKeyInt("ncols", nrows); + if (ncols < 1) { + mprinterr("Error: 'ncols' must be > 0 for 'fullmatrix'\n"); + return Analysis::ERR; + } } else { mprinterr("Error: Unrecognized keyword for 'outtype': %s\n", outtypearg.c_str()); return Analysis::ERR; @@ -125,17 +139,27 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys if (ab_out_ == 0) return Analysis::ERR; ba_out_ = setup.DSL().AddSet(DataSet::FLOAT, MetaData(out_->Meta().Name(),"BA")); if (ba_out_ == 0) return Analysis::ERR; - } else if (outType_ == UPPER_TRI_MATRIX) { + } else if (outType_ == UPPER_TRI_MATRIX || outType_ == FULL_MATRIX) { out_ = setup.DSL().AddSet(DataSet::MATRIX_FLT, dsname, "HAUSDORFF"); - if (out_ == 0 || ((DataSet_2D*)out_)->AllocateTriangle( nrows )) return Analysis::ERR; - if (out_->Size() != inputSets_.size()) - mprintf("Warning: Number of input data sets (%zu) != number of expected sets in matrix (%zu)\n", - inputSets_.size(), out_->Size()); - // Directed sets ab_out_ = setup.DSL().AddSet(DataSet::MATRIX_FLT, MetaData(out_->Meta().Name(),"AB")); - if (ab_out_ == 0 || ((DataSet_2D*)ab_out_)->AllocateTriangle( nrows )) return Analysis::ERR; ba_out_ = setup.DSL().AddSet(DataSet::MATRIX_FLT, MetaData(out_->Meta().Name(),"BA")); - if (ba_out_ == 0 || ((DataSet_2D*)ba_out_)->AllocateTriangle( nrows )) return Analysis::ERR; + if (out_ == 0 || ab_out_ == 0 || ba_out_ == 0) return Analysis::ERR; + if (outType_ == UPPER_TRI_MATRIX) { + if (((DataSet_2D*)out_)->AllocateTriangle( nrows )) return Analysis::ERR; + if (((DataSet_2D*)ab_out_)->AllocateTriangle( nrows )) return Analysis::ERR; + if (((DataSet_2D*)ba_out_)->AllocateTriangle( nrows )) return Analysis::ERR; + } else if (outType_ == FULL_MATRIX) { + if (((DataSet_2D*)out_)->Allocate2D( nrows,ncols )) return Analysis::ERR; + if (((DataSet_2D*)ab_out_)->Allocate2D( nrows,ncols )) return Analysis::ERR; + if (((DataSet_2D*)ba_out_)->Allocate2D( nrows,ncols )) return Analysis::ERR; + } + if (out_->Size() != inputSets_.size()) { + mprinterr("Warning: Number of input data sets (%zu) != number of expected" + " sets in matrix (%zu)\n", inputSets_.size(), out_->Size()); + return Analysis::ERR; + } + // Directed sets + } if (df != 0) df->AddDataSet( out_ ); @@ -189,7 +213,10 @@ Analysis::RetType Analysis_HausdorffDistance::Analyze() { ba_out_->Add(idx++, &fba); break; case UPPER_TRI_MATRIX : + case FULL_MATRIX : ((DataSet_MatrixFlt*)out_)->AddElement( fhd ); + ((DataSet_MatrixFlt*)ab_out_)->AddElement( fhd ); + ((DataSet_MatrixFlt*)ba_out_)->AddElement( fhd ); break; } } diff --git a/src/Analysis_HausdorffDistance.h b/src/Analysis_HausdorffDistance.h index fbc9dabea2..15770643d6 100644 --- a/src/Analysis_HausdorffDistance.h +++ b/src/Analysis_HausdorffDistance.h @@ -17,7 +17,7 @@ class Analysis_HausdorffDistance : public Analysis { private: static double CalcHausdorffFromMatrix(DataSet_2D const&, double&, double&); - enum OutType { BASIC = 0, UPPER_TRI_MATRIX }; + enum OutType { BASIC = 0, UPPER_TRI_MATRIX, FULL_MATRIX }; DataSetList inputSets_; OutType outType_; From 965bfff11dffaa3ef3bd19e7608c99c211ab5251 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 11:22:24 -0500 Subject: [PATCH 21/28] DRR - Cpptraj: Fix up info output --- src/Analysis_HausdorffDistance.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp index 29a54d9ac4..d62533235e 100644 --- a/src/Analysis_HausdorffDistance.cpp +++ b/src/Analysis_HausdorffDistance.cpp @@ -169,14 +169,18 @@ Analysis::RetType Analysis_HausdorffDistance::Setup(ArgList& analyzeArgs, Analys df->AddDataSet( ba_out_ ); mprintf(" HAUSDORFF:\n"); - mprintf("\tCalculating Hausdorff distances from the following 2D distance matrices:\n"); + mprintf("\tCalculating Hausdorff distances from the following 2D distance matrices:\n\t "); for (DataSetList::const_iterator it = inputSets_.begin(); it != inputSets_.end(); ++it) - mprintf("\t %s\n", (*it)->legend()); + mprintf(" %s", (*it)->legend()); + mprintf("\n"); if (outType_ == BASIC) mprintf("\tOutput will be stored in 1D array set '%s'\n", out_->legend()); else if (outType_ == UPPER_TRI_MATRIX) mprintf("\tOutput will be stored in upper-triangular matrix set '%s' with %i rows.\n", out_->legend(), nrows); + else if (outType_ == FULL_MATRIX) + mprintf("\tOutput will be stored in matrix set '%s' with %i rows, %i columns.\n", + out_->legend(), nrows, ncols); mprintf("\tDirected A->B distance output set: %s\n", ab_out_->legend()); mprintf("\tDirected B->A distance output set: %s\n", ba_out_->legend()); if (df != 0) mprintf("\tOutput set written to '%s'\n", df->DataFilename().full()); From 2a3f47b54ca48818de7158248b24091a59305922 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 11:24:27 -0500 Subject: [PATCH 22/28] DRR - Cpptraj: Add full matrix output test. --- test/Test_Hausdorff/RunTest.sh | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/test/Test_Hausdorff/RunTest.sh b/test/Test_Hausdorff/RunTest.sh index dcbb2f37e0..64262c5ae5 100755 --- a/test/Test_Hausdorff/RunTest.sh +++ b/test/Test_Hausdorff/RunTest.sh @@ -3,7 +3,7 @@ . ../MasterTest.sh CleanFiles matrix.dat hd.in hd.dat rms2d.dat rms2d.gnu hausdorff.matrix.dat \ - hausdoff.matrix.gnu + hausdoff.matrix.gnu hausdorff.fullmatrix.gnu INPUT='-i hd.in' @@ -23,12 +23,12 @@ RunCpptraj "Simple Hausdorff distance test." DoTest hd.dat.save hd.dat # 2D RMS -cat > hd.in < hd.in < hd.in < hd.in < Date: Fri, 1 Feb 2019 11:25:42 -0500 Subject: [PATCH 23/28] DRR - Cpptraj: Fix clean rule. --- test/Test_Hausdorff/RunTest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Test_Hausdorff/RunTest.sh b/test/Test_Hausdorff/RunTest.sh index 64262c5ae5..5a4a29b38f 100755 --- a/test/Test_Hausdorff/RunTest.sh +++ b/test/Test_Hausdorff/RunTest.sh @@ -3,7 +3,7 @@ . ../MasterTest.sh CleanFiles matrix.dat hd.in hd.dat rms2d.dat rms2d.gnu hausdorff.matrix.dat \ - hausdoff.matrix.gnu hausdorff.fullmatrix.gnu + hausdorff.matrix.gnu hausdorff.fullmatrix.gnu INPUT='-i hd.in' From bdc97fea9fc306920addb71c218f71087b09bdd2 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 11:26:52 -0500 Subject: [PATCH 24/28] DRR - Cpptraj: Enable test. --- test/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/Makefile b/test/Makefile index 86043702da..f2e7ef3939 100644 --- a/test/Makefile +++ b/test/Makefile @@ -440,6 +440,9 @@ test.cmdline: test.xyzfmt: @-cd Test_XYZformat && ./RunTest.sh $(OPT) +test.hausdorff: + @-cd Test_Hausdorff && ./RunTest.sh $(OPT) + # Every test target should go here. COMPLETETESTS=test.general \ test.strip \ @@ -581,7 +584,8 @@ COMPLETETESTS=test.general \ test.infraredspec \ test.cphstats \ test.cmdline \ - test.xyzfmt + test.xyzfmt \ + test.hausdorff test.all: $(MAKE) test.complete summary From a05953059c5a91059fc84161949f86e2a41cf014 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 11:58:41 -0500 Subject: [PATCH 25/28] DRR - Cpptraj: Add parallel version of the test. --- test/Test_Hausdorff/RunTest.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/Test_Hausdorff/RunTest.sh b/test/Test_Hausdorff/RunTest.sh index 5a4a29b38f..072765b699 100755 --- a/test/Test_Hausdorff/RunTest.sh +++ b/test/Test_Hausdorff/RunTest.sh @@ -5,6 +5,9 @@ CleanFiles matrix.dat hd.in hd.dat rms2d.dat rms2d.gnu hausdorff.matrix.dat \ hausdorff.matrix.gnu hausdorff.fullmatrix.gnu +TESTNAME='Hausdorff distance tests.' +Requires netcdf + INPUT='-i hd.in' # Simple Hausdorff distance from matrix. @@ -67,11 +70,22 @@ for i=1;i<11;i++ 2drms crdset Chunk\$i reftraj Chunk\$j M\$i.\$j done done +EOF +if [ -z "$DO_PARALLEL" ] ; then + cat >> hd.in <> hd.in < Date: Fri, 1 Feb 2019 11:59:04 -0500 Subject: [PATCH 26/28] DRR - Cpptraj: Fix up help text and info output, hide some debug info. --- src/Exec_ParallelAnalysis.cpp | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/Exec_ParallelAnalysis.cpp b/src/Exec_ParallelAnalysis.cpp index faaeb95cfd..dfb1248c4d 100644 --- a/src/Exec_ParallelAnalysis.cpp +++ b/src/Exec_ParallelAnalysis.cpp @@ -2,11 +2,14 @@ #include "CpptrajStdio.h" #ifdef MPI #include "Timer.h" -#include // DEBUG + // Exec_ParallelAnalysis::Help() void Exec_ParallelAnalysis::Help() const { - mprintf("\t[sync]\n"); + mprintf("\t[sync]\n" + " Divide all currently set up Analyses among available MPI processes and run.\n" + " If 'sync' is specifed, sync all results back to master process; this may be\n" + " required if performing subsequent analyses.\n"); } // Exec_ParallelAnalysis::Execute() @@ -38,6 +41,10 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn } Parallel::World().Barrier(); */ + mprintf(" PARALLELANALYSIS: Will attempt to run current Analyses in parallel.\n\n" + "*** THIS COMMAND IS STILL EXPERIMENTAL! ***\n\n"); + if (syncToMaster) + mprintf("\tResulting data sets will be synced back to master.\n"); // Naively divide up all analyses among threads. int my_start, my_stop; int nelts = Parallel::World().DivideAmongProcesses( my_start, my_stop, State.Analyses().size() ); @@ -67,8 +74,9 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn int setHasChanged = 0; if (!Parallel::World().Master()) { if (setSizesBefore[idx] != State.DSL()[idx]->Size()) { - rprintf("Set '%s' size has changed from %u to %zu\n", - State.DSL()[idx]->legend(), setSizesBefore[idx], State.DSL()[idx]->Size()); + if (State.Debug() > 0) + rprintf("Set '%s' size has changed from %u to %zu\n", + State.DSL()[idx]->legend(), setSizesBefore[idx], State.DSL()[idx]->Size()); setHasChanged = 1; } } @@ -80,13 +88,14 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn if (setHasChanged == 1) setHasChanged = Parallel::World().Rank(); Parallel::World().ReduceMaster(&sourceRank, &setHasChanged, 1, MPI_INT, MPI_SUM); - mprintf("DEBUG: Need to sync '%s' from %i\n", State.DSL()[idx]->legend(), sourceRank); + if (State.Debug() > 0) + mprintf("DEBUG: Need to sync '%s' from %i\n", State.DSL()[idx]->legend(), sourceRank); if (Parallel::World().Master()) State.DSL()[idx]->RecvSet( sourceRank, Parallel::World() ); else if (setHasChanged == Parallel::World().Rank()) State.DSL()[idx]->SendSet( 0, Parallel::World() ); } else - mprintf("DEBUG: '%s' exists on multiple threads. Not syncing.\n", + mprintf("Warning: '%s' exists on multiple threads. Not syncing.\n", State.DSL()[idx]->legend()); } } @@ -94,12 +103,14 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn t_sync.Stop(); } t_total.Stop(); - t_total.WriteTiming(1, "Total:"); if (syncToMaster) t_sync.WriteTiming(2, "Sync:", t_total.Total()); + t_total.WriteTiming(1, "Total:"); return CpptrajState::OK; } -#else +#else /* MPI */ +// ============================================================================= +// NON-MPI CODE BELOW // Exec_ParallelAnalysis::Help() void Exec_ParallelAnalysis::Help() const { @@ -112,4 +123,4 @@ Exec::RetType Exec_ParallelAnalysis::Execute(CpptrajState& State, ArgList& argIn mprinterr("Error: This command is only available in MPI-enabled builds.\n"); return CpptrajState::ERR; } -#endif +#endif /* MPI */ From cad0948c023e54b3bfe5327593eead00a620ed80 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 12:01:10 -0500 Subject: [PATCH 27/28] DRR - Cpptraj: Revision bump for adding Hausdorff, parallel analysis, gnuplot 'title' --- src/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Version.h b/src/Version.h index 8e03c23d5f..c711599bcd 100644 --- a/src/Version.h +++ b/src/Version.h @@ -20,5 +20,5 @@ * Whenever a number that precedes is incremented, all subsequent * numbers should be reset to 0. */ -#define CPPTRAJ_INTERNAL_VERSION "V4.11.0" +#define CPPTRAJ_INTERNAL_VERSION "V4.11.1" #endif From 9dea333f677c6b348f37540c0371aa6a74618d66 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 1 Feb 2019 13:03:41 -0500 Subject: [PATCH 28/28] DRR - Cpptraj: Add some missing includes. --- src/Analysis_HausdorffDistance.cpp | 1 + src/Exec_ParallelAnalysis.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Analysis_HausdorffDistance.cpp b/src/Analysis_HausdorffDistance.cpp index d62533235e..905ea50511 100644 --- a/src/Analysis_HausdorffDistance.cpp +++ b/src/Analysis_HausdorffDistance.cpp @@ -1,3 +1,4 @@ +#include // std::min, max #include "Analysis_HausdorffDistance.h" #include "CpptrajStdio.h" #include "DataSet_MatrixFlt.h" diff --git a/src/Exec_ParallelAnalysis.cpp b/src/Exec_ParallelAnalysis.cpp index dfb1248c4d..436e068024 100644 --- a/src/Exec_ParallelAnalysis.cpp +++ b/src/Exec_ParallelAnalysis.cpp @@ -1,3 +1,4 @@ +#include #include "Exec_ParallelAnalysis.h" #include "CpptrajStdio.h" #ifdef MPI