From 39119a92366f09c3c2219f01c81992f8cdf9f88f Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 10:15:56 -0400 Subject: [PATCH 01/55] Start parsetiming command --- src/Command.cpp | 2 ++ src/Exec_ParseTiming.cpp | 57 ++++++++++++++++++++++++++++++++++++++++ src/Exec_ParseTiming.h | 14 ++++++++++ src/cpptrajdepend | 3 ++- src/cpptrajfiles | 1 + 5 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/Exec_ParseTiming.cpp create mode 100644 src/Exec_ParseTiming.h diff --git a/src/Command.cpp b/src/Command.cpp index a26e78f4e3..e39dd8596e 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -39,6 +39,7 @@ #include "Exec_Show.h" #include "Exec_Random.h" #include "Exec_CompareClusters.h" +#include "Exec_ParseTiming.h" // ----- SYSTEM ---------------------------------------------------------------- #include "Exec_System.h" // ----- COORDS ---------------------------------------------------------------- @@ -233,6 +234,7 @@ void Command::Init() { 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_ParseTiming(), Cmd::EXE, 1, "parsetiming" ); // hidden 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/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp new file mode 100644 index 0000000000..52a5fa26b4 --- /dev/null +++ b/src/Exec_ParseTiming.cpp @@ -0,0 +1,57 @@ +#include "Exec_ParseTiming.h" +#include "CpptrajStdio.h" +#include "FileName.h" +#include "BufferedLine.h" + +/** CONSTRUCTOR */ +Exec_ParseTiming::Exec_ParseTiming() : + Exec(GENERAL) +{ + SetHidden( true ); +} + +// Exec_ParseTiming::Help() +void Exec_ParseTiming::Help() const +{ + +} + +int Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { + BufferedLine infile; + + if (infile.OpenFileRead( fname )) { + mprinterr("Error: Could not open '%s'\n", fname.c_str()); + return 1; + } + + infile.CloseFile(); + return 0; +} + +// Exec_ParseTiming::Execute() +Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) +{ + File::NameArray FileNameList; + + std::string filearg = argIn.GetStringNext(); + while (!filearg.empty()) { + File::NameArray fnames = File::ExpandToFilenames( filearg ); + if (fnames.empty()) { + mprintf("Warning: No files matching '%s'\n", filearg.c_str()); + } else { + for (File::NameArray::const_iterator it = fnames.begin(); it != fnames.end(); ++it) + FileNameList.push_back( *it ); + } + filearg = argIn.GetStringNext(); + } + + for (File::NameArray::const_iterator it = FileNameList.begin(); it != FileNameList.end(); ++it) { + mprintf("\t%s\n", it->full()); + if (read_cpptraj_output( it->Full() )) { + mprinterr("Error: Could not read cpptraj output '%s'\n", it->full()); + return CpptrajState::ERR; + } + } + + return CpptrajState::OK; +} diff --git a/src/Exec_ParseTiming.h b/src/Exec_ParseTiming.h new file mode 100644 index 0000000000..a9fb156f20 --- /dev/null +++ b/src/Exec_ParseTiming.h @@ -0,0 +1,14 @@ +#ifndef INC_EXEC_PARSETIMING_H +#define INC_EXEC_PARSETIMING_H +#include "Exec.h" +/// For extracting and parsing timing data from cpptraj output +class Exec_ParseTiming : public Exec { + public: + Exec_ParseTiming(); + void Help() const; + DispatchObject* Alloc() const { return (DispatchObject*)new Exec_ParseTiming(); } + RetType Execute(CpptrajState&, ArgList&); + private: + int read_cpptraj_output(std::string const&); +}; +#endif diff --git a/src/cpptrajdepend b/src/cpptrajdepend index 295eed367d..fa0db5c6a7 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -183,7 +183,7 @@ ClusterMap.o : ClusterMap.cpp AssociatedData.h ClusterMap.h Constants.h CpptrajF Cmd.o : Cmd.cpp Cmd.h DispatchObject.h CmdInput.o : CmdInput.cpp CmdInput.h StringRoutines.h CmdList.o : CmdList.cpp Cmd.h CmdList.h DispatchObject.h -Command.o : Command.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h ActionTopWriter.h Action_Align.h Action_Angle.h Action_AreaPerMol.h Action_AtomMap.h Action_AtomicCorr.h Action_AtomicFluct.h Action_AutoImage.h Action_Average.h Action_AvgBox.h Action_Bounds.h Action_Box.h Action_Center.h Action_Channel.h Action_CheckChirality.h Action_CheckStructure.h Action_Closest.h Action_ClusterDihedral.h Action_Contacts.h Action_CreateCrd.h Action_CreateReservoir.h Action_DNAionTracker.h Action_DSSP.h Action_Density.h Action_Diffusion.h Action_Dihedral.h Action_DihedralRMS.h Action_Dipole.h Action_DistRmsd.h Action_Distance.h Action_Energy.h Action_Esander.h Action_FilterByData.h Action_FixAtomOrder.h Action_FixImagedBonds.h Action_GIST.h Action_Grid.h Action_GridFreeEnergy.h Action_HydrogenBond.h Action_Image.h Action_InfraredSpectrum.h Action_Jcoupling.h Action_Keep.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_MultiPucker.h Action_MultiVector.h Action_NAstruct.h Action_NMRrst.h Action_NativeContacts.h Action_OrderParameter.h Action_Outtraj.h Action_PairDist.h Action_Pairwise.h Action_Principal.h Action_Projection.h Action_Pucker.h Action_Radgyr.h Action_Radial.h Action_RandomizeIons.h Action_Remap.h Action_ReplicateCell.h Action_Rmsd.h Action_Rotate.h Action_RunningAvg.h Action_STFC_Diffusion.h Action_Scale.h Action_SetVelocity.h Action_Spam.h Action_Strip.h Action_Surf.h Action_SymmetricRmsd.h Action_Temperature.h Action_Time.h Action_Translate.h Action_Unstrip.h Action_Unwrap.h Action_Vector.h Action_VelocityAutoCorr.h Action_Volmap.h Action_Volume.h Action_Watershell.h Action_XtalSymm.h Analysis.h AnalysisList.h AnalysisState.h Analysis_AmdBias.h Analysis_AutoCorr.h Analysis_Average.h Analysis_Clustering.h Analysis_ConstantPHStats.h Analysis_Corr.h Analysis_CrankShaft.h Analysis_CrdFluct.h Analysis_CrossCorr.h Analysis_CurveFit.h Analysis_Divergence.h Analysis_EvalPlateau.h Analysis_FFT.h Analysis_HausdorffDistance.h Analysis_Hist.h Analysis_IRED.h Analysis_Integrate.h Analysis_KDE.h Analysis_Lifetime.h Analysis_LowestCurve.h Analysis_Matrix.h Analysis_MeltCurve.h Analysis_Modes.h Analysis_MultiHist.h Analysis_Multicurve.h Analysis_Overlap.h Analysis_PhiPsi.h Analysis_Regression.h Analysis_RemLog.h Analysis_Rms2d.h Analysis_RmsAvgCorr.h Analysis_Rotdif.h Analysis_RunningAvg.h Analysis_Slope.h Analysis_Spline.h Analysis_State.h Analysis_Statistics.h Analysis_TI.h Analysis_Timecorr.h Analysis_VectorMath.h Analysis_Wavelet.h ArgList.h Array1D.h ArrayIterator.h AssociatedData.h Atom.h AtomMap.h AtomMask.h AtomType.h AxisType.h BaseIOtype.h Box.h BoxArgs.h BufferedLine.h CharMask.h Cluster/Algorithm.h Cluster/BestReps.h Cluster/CentroidArray.h Cluster/Cframes.h Cluster/Control.h Cluster/DrawGraph.h Cluster/List.h Cluster/Metric.h Cluster/MetricArray.h Cluster/Node.h Cluster/Sieve.h Cluster/Silhouette.h ClusterMap.h Cmd.h CmdInput.h CmdList.h Command.h CompactFrameArray.h ComplexArray.h Constants.h Constraints.h ControlBlock.h ControlBlock_For.h CoordinateInfo.h Corr.h Cph.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataFilter.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_3D.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h DataSet_GridFlt.h DataSet_MatrixDbl.h DataSet_MatrixFlt.h DataSet_Mesh.h DataSet_Modes.h DataSet_RemLog.h DataSet_Vector.h DataSet_double.h DataSet_float.h DataSet_integer.h DataSet_integer_mem.h DataSet_pH.h DataSet_string.h Deprecated.h DihedralSearch.h Dimension.h DispatchObject.h Energy.h Energy_Sander.h EnsembleIn.h EnsembleOutList.h Ewald.h EwaldOptions.h Ewald_ParticleMesh.h ExclusionArray.h Exec.h Exec_AddMissingRes.h Exec_Analyze.h Exec_Calc.h Exec_CatCrd.h Exec_Change.h Exec_ClusterMap.h Exec_CombineCoords.h Exec_Commands.h Exec_CompareClusters.h Exec_CompareEnergy.h Exec_CompareTop.h Exec_CrdAction.h Exec_CrdOut.h Exec_CreateSet.h Exec_DataFile.h Exec_DataFilter.h Exec_DataSetCmd.h Exec_Emin.h Exec_Flatten.h Exec_GenerateAmberRst.h Exec_Graft.h Exec_Help.h Exec_HmassRepartition.h Exec_LoadCrd.h Exec_LoadTraj.h Exec_ParallelAnalysis.h Exec_ParmBox.h Exec_ParmSolvent.h Exec_ParmStrip.h Exec_ParmWrite.h Exec_PermuteDihedrals.h Exec_Precision.h Exec_PrepareForLeap.h Exec_PrintData.h Exec_Random.h Exec_ReadData.h Exec_ReadEnsembleData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_Set.h Exec_Show.h Exec_SortEnsembleData.h Exec_SplitCoords.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_UpdateParameters.h Exec_ViewRst.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h GIST_PME.h Grid.h GridAction.h GridBin.h HistBin.h Hungarian.h ImageOption.h ImageTypes.h InputTrajCommon.h MapAtom.h MaskArray.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NC_Routines.h NameType.h NetcdfFile.h OnlineVarT.h OutputTrajCommon.h PDBfile.h PairList.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h PubFFT.h Pucker.h Pucker_PuckerMask.h Pucker_PuckerSearch.h Pucker_PuckerToken.h RPNcalc.h Random.h Range.h ReferenceAction.h ReferenceFrame.h RemdReservoirNC.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h Spline.h SplineFxnTable.h StructureCheck.h SymbolExporting.h SymmetricRmsdCalc.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h TypeNameHolder.h Unit.h Vec3.h cuda_kernels/GistCudaSetup.cuh helpme_standalone.h molsurf.h +Command.o : Command.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h ActionTopWriter.h Action_Align.h Action_Angle.h Action_AreaPerMol.h Action_AtomMap.h Action_AtomicCorr.h Action_AtomicFluct.h Action_AutoImage.h Action_Average.h Action_AvgBox.h Action_Bounds.h Action_Box.h Action_Center.h Action_Channel.h Action_CheckChirality.h Action_CheckStructure.h Action_Closest.h Action_ClusterDihedral.h Action_Contacts.h Action_CreateCrd.h Action_CreateReservoir.h Action_DNAionTracker.h Action_DSSP.h Action_Density.h Action_Diffusion.h Action_Dihedral.h Action_DihedralRMS.h Action_Dipole.h Action_DistRmsd.h Action_Distance.h Action_Energy.h Action_Esander.h Action_FilterByData.h Action_FixAtomOrder.h Action_FixImagedBonds.h Action_GIST.h Action_Grid.h Action_GridFreeEnergy.h Action_HydrogenBond.h Action_Image.h Action_InfraredSpectrum.h Action_Jcoupling.h Action_Keep.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_MultiPucker.h Action_MultiVector.h Action_NAstruct.h Action_NMRrst.h Action_NativeContacts.h Action_OrderParameter.h Action_Outtraj.h Action_PairDist.h Action_Pairwise.h Action_Principal.h Action_Projection.h Action_Pucker.h Action_Radgyr.h Action_Radial.h Action_RandomizeIons.h Action_Remap.h Action_ReplicateCell.h Action_Rmsd.h Action_Rotate.h Action_RunningAvg.h Action_STFC_Diffusion.h Action_Scale.h Action_SetVelocity.h Action_Spam.h Action_Strip.h Action_Surf.h Action_SymmetricRmsd.h Action_Temperature.h Action_Time.h Action_Translate.h Action_Unstrip.h Action_Unwrap.h Action_Vector.h Action_VelocityAutoCorr.h Action_Volmap.h Action_Volume.h Action_Watershell.h Action_XtalSymm.h Analysis.h AnalysisList.h AnalysisState.h Analysis_AmdBias.h Analysis_AutoCorr.h Analysis_Average.h Analysis_Clustering.h Analysis_ConstantPHStats.h Analysis_Corr.h Analysis_CrankShaft.h Analysis_CrdFluct.h Analysis_CrossCorr.h Analysis_CurveFit.h Analysis_Divergence.h Analysis_EvalPlateau.h Analysis_FFT.h Analysis_HausdorffDistance.h Analysis_Hist.h Analysis_IRED.h Analysis_Integrate.h Analysis_KDE.h Analysis_Lifetime.h Analysis_LowestCurve.h Analysis_Matrix.h Analysis_MeltCurve.h Analysis_Modes.h Analysis_MultiHist.h Analysis_Multicurve.h Analysis_Overlap.h Analysis_PhiPsi.h Analysis_Regression.h Analysis_RemLog.h Analysis_Rms2d.h Analysis_RmsAvgCorr.h Analysis_Rotdif.h Analysis_RunningAvg.h Analysis_Slope.h Analysis_Spline.h Analysis_State.h Analysis_Statistics.h Analysis_TI.h Analysis_Timecorr.h Analysis_VectorMath.h Analysis_Wavelet.h ArgList.h Array1D.h ArrayIterator.h AssociatedData.h Atom.h AtomMap.h AtomMask.h AtomType.h AxisType.h BaseIOtype.h Box.h BoxArgs.h BufferedLine.h CharMask.h Cluster/Algorithm.h Cluster/BestReps.h Cluster/CentroidArray.h Cluster/Cframes.h Cluster/Control.h Cluster/DrawGraph.h Cluster/List.h Cluster/Metric.h Cluster/MetricArray.h Cluster/Node.h Cluster/Sieve.h Cluster/Silhouette.h ClusterMap.h Cmd.h CmdInput.h CmdList.h Command.h CompactFrameArray.h ComplexArray.h Constants.h Constraints.h ControlBlock.h ControlBlock_For.h CoordinateInfo.h Corr.h Cph.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataFilter.h DataSet.h DataSetList.h DataSet_1D.h DataSet_2D.h DataSet_3D.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h DataSet_GridFlt.h DataSet_MatrixDbl.h DataSet_MatrixFlt.h DataSet_Mesh.h DataSet_Modes.h DataSet_RemLog.h DataSet_Vector.h DataSet_double.h DataSet_float.h DataSet_integer.h DataSet_integer_mem.h DataSet_pH.h DataSet_string.h Deprecated.h DihedralSearch.h Dimension.h DispatchObject.h Energy.h Energy_Sander.h EnsembleIn.h EnsembleOutList.h Ewald.h EwaldOptions.h Ewald_ParticleMesh.h ExclusionArray.h Exec.h Exec_AddMissingRes.h Exec_Analyze.h Exec_Calc.h Exec_CatCrd.h Exec_Change.h Exec_ClusterMap.h Exec_CombineCoords.h Exec_Commands.h Exec_CompareClusters.h Exec_CompareEnergy.h Exec_CompareTop.h Exec_CrdAction.h Exec_CrdOut.h Exec_CreateSet.h Exec_DataFile.h Exec_DataFilter.h Exec_DataSetCmd.h Exec_Emin.h Exec_Flatten.h Exec_GenerateAmberRst.h Exec_Graft.h Exec_Help.h Exec_HmassRepartition.h Exec_LoadCrd.h Exec_LoadTraj.h Exec_ParallelAnalysis.h Exec_ParmBox.h Exec_ParmSolvent.h Exec_ParmStrip.h Exec_ParmWrite.h Exec_ParseTiming.h Exec_PermuteDihedrals.h Exec_Precision.h Exec_PrepareForLeap.h Exec_PrintData.h Exec_Random.h Exec_ReadData.h Exec_ReadEnsembleData.h Exec_ReadInput.h Exec_RotateDihedral.h Exec_RunAnalysis.h Exec_ScaleDihedralK.h Exec_SequenceAlign.h Exec_Set.h Exec_Show.h Exec_SortEnsembleData.h Exec_SplitCoords.h Exec_System.h Exec_Top.h Exec_Traj.h Exec_UpdateParameters.h Exec_ViewRst.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h GIST_PME.h Grid.h GridAction.h GridBin.h HistBin.h Hungarian.h ImageOption.h ImageTypes.h InputTrajCommon.h MapAtom.h MaskArray.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NC_Routines.h NameType.h NetcdfFile.h OnlineVarT.h OutputTrajCommon.h PDBfile.h PairList.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h PubFFT.h Pucker.h Pucker_PuckerMask.h Pucker_PuckerSearch.h Pucker_PuckerToken.h RPNcalc.h Random.h Range.h ReferenceAction.h ReferenceFrame.h RemdReservoirNC.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h Spline.h SplineFxnTable.h StructureCheck.h SymbolExporting.h SymmetricRmsdCalc.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h TypeNameHolder.h Unit.h Vec3.h cuda_kernels/GistCudaSetup.cuh helpme_standalone.h molsurf.h CompactFrameArray.o : CompactFrameArray.cpp Box.h CompactFrameArray.h CoordinateInfo.h CpptrajStdio.h Matrix_3x3.h Parallel.h ReplicaDimArray.h Vec3.h ComplexArray.o : ComplexArray.cpp ArrayIterator.h ComplexArray.h Constraints.o : Constraints.cpp ArgList.h Atom.h AtomMask.h AtomType.h Box.h CharMask.h Constants.h Constraints.h CoordinateInfo.h CpptrajStdio.h FileName.h Frame.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h Topology.h TypeNameHolder.h Unit.h Vec3.h @@ -305,6 +305,7 @@ Exec_ParmBox.o : Exec_ParmBox.cpp Action.h ActionList.h ActionState.h Analysis.h Exec_ParmSolvent.o : Exec_ParmSolvent.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_ParmSolvent.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_ParmStrip.o : Exec_ParmStrip.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_ParmStrip.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_ParmWrite.o : Exec_ParmWrite.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_ParmWrite.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h ParmFile.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h +Exec_ParseTiming.o : Exec_ParseTiming.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_ParseTiming.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_PermuteDihedrals.o : Exec_PermuteDihedrals.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h CharMask.h CompactFrameArray.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h DihedralSearch.h Dimension.h DispatchObject.h DistRoutines.h EnsembleIn.h EnsembleOutList.h ExclusionArray.h Exec.h Exec_PermuteDihedrals.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h ImageOption.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h PairList.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Random.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h StructureCheck.h SymbolExporting.h TextFormat.h Timer.h Topology.h TorsionRoutines.h TrajFrameCounter.h TrajectoryFile.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h TypeNameHolder.h Unit.h Vec3.h Exec_Precision.o : Exec_Precision.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_Precision.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_PrepareForLeap.o : Exec_PrepareForLeap.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMap.h AtomMask.h AtomType.h BaseIOtype.h Box.h CharMask.h CompactFrameArray.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_PrepareForLeap.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h LeapInterface.h MapAtom.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h ParmFile.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h StringRoutines.h Structure/Disulfide.h Structure/HisProt.h Structure/ResStatArray.h Structure/Sugar.h Structure/SugarBuilder.h Structure/SugarToken.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h TypeNameHolder.h Unit.h Vec3.h diff --git a/src/cpptrajfiles b/src/cpptrajfiles index 9e8642a9dc..e7d016d455 100644 --- a/src/cpptrajfiles +++ b/src/cpptrajfiles @@ -275,6 +275,7 @@ COMMON_SOURCES= \ Exec_ParmSolvent.cpp \ Exec_ParmStrip.cpp \ Exec_ParmWrite.cpp \ + Exec_ParseTiming.cpp \ Exec_PermuteDihedrals.cpp \ Exec_Precision.cpp \ Exec_PrepareForLeap.cpp \ From b2cd7a1a732c9825b8266eefde3c82b409fe2f04 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 10:41:03 -0400 Subject: [PATCH 02/55] Start storing run data in a separate class --- src/Exec_ParseTiming.cpp | 68 +++++++++++++++++++++++++++++++++++++--- src/Exec_ParseTiming.h | 2 ++ 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp index 52a5fa26b4..1794f292aa 100644 --- a/src/Exec_ParseTiming.cpp +++ b/src/Exec_ParseTiming.cpp @@ -2,6 +2,7 @@ #include "CpptrajStdio.h" #include "FileName.h" #include "BufferedLine.h" +#include // strncmp /** CONSTRUCTOR */ Exec_ParseTiming::Exec_ParseTiming() : @@ -10,11 +11,37 @@ Exec_ParseTiming::Exec_ParseTiming() : SetHidden( true ); } -// Exec_ParseTiming::Help() -void Exec_ParseTiming::Help() const -{ +/** Hold run timing and details. */ +class Exec_ParseTiming::RunTiming { + public: + RunTiming() : version_major_(-1), version_minor_(-1), version_revision_(-1), + isMPI_(false), isOpenMP_(false), isCUDA_(false), + nprocs_(-1) {} + RunTiming(std::string const& vstr, bool isM, bool isO, bool isC) : + isMPI_(isM), isOpenMP_(isO), isCUDA_(isC), nprocs_(-1) + { + ArgList varg( vstr, "V." ); + version_major_ = varg.getNextInteger(-1); + version_minor_ = varg.getNextInteger(-1); + version_revision_ = varg.getNextInteger(-1); + } -} + void SetNprocs(int n) { nprocs_ = n; } + + void Print() const { + mprintf("Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i\n", + version_major_, version_minor_, version_revision_, + (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_); + } + private: + int version_major_; + int version_minor_; + int version_revision_; + bool isMPI_; + bool isOpenMP_; + bool isCUDA_; + int nprocs_; +}; int Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { BufferedLine infile; @@ -23,10 +50,43 @@ int Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { mprinterr("Error: Could not open '%s'\n", fname.c_str()); return 1; } + RunTiming thisRun; + const char* ptr = infile.Line(); + while (ptr != 0) { + if (ptr[0] == 'C') { + if (strncmp(ptr, "CPPTRAJ: Trajectory Analysis.", 29)==0) { + mprintf("DEBUG: Title: %s\n", ptr); + ArgList title( ptr+29, " " ); + mprintf("DEBUG: TitleArg: %s\n", title.ArgLine()); + // Version should be the first arg + std::string versionStr = title.GetStringNext(); + bool isMPI = title.hasKey("MPI"); + bool isOpenMP = title.hasKey("OpenMP"); + bool isCUDA = title.hasKey("CUDA"); + thisRun = RunTiming(versionStr, isMPI, isOpenMP, isCUDA); + } + } else if (ptr[0] == '|') { + if (strncmp(ptr, "| Running on", 12)==0) { + ArgList procs( ptr+12, " " ); + // processes should be the next arg + thisRun.SetNprocs( procs.getNextInteger(-1) ); + } + } + ptr = infile.Line(); + } + thisRun.Print(); infile.CloseFile(); return 0; } +// Exec_ParseTiming::Help() +void Exec_ParseTiming::Help() const +{ + mprintf("\t ...\n" + " Parse cpptraj output for timing data.\n" + ); +} + // Exec_ParseTiming::Execute() Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) diff --git a/src/Exec_ParseTiming.h b/src/Exec_ParseTiming.h index a9fb156f20..579479e42e 100644 --- a/src/Exec_ParseTiming.h +++ b/src/Exec_ParseTiming.h @@ -9,6 +9,8 @@ class Exec_ParseTiming : public Exec { DispatchObject* Alloc() const { return (DispatchObject*)new Exec_ParseTiming(); } RetType Execute(CpptrajState&, ArgList&); private: + class RunTiming; + int read_cpptraj_output(std::string const&); }; #endif From 9023ba649eee895cd96ce455a7753b236c9e52ae Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 10:46:53 -0400 Subject: [PATCH 03/55] Extract total time --- src/Exec_ParseTiming.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp index 1794f292aa..7d768036c8 100644 --- a/src/Exec_ParseTiming.cpp +++ b/src/Exec_ParseTiming.cpp @@ -16,9 +16,9 @@ class Exec_ParseTiming::RunTiming { public: RunTiming() : version_major_(-1), version_minor_(-1), version_revision_(-1), isMPI_(false), isOpenMP_(false), isCUDA_(false), - nprocs_(-1) {} + nprocs_(-1), t_total_(-1) {} RunTiming(std::string const& vstr, bool isM, bool isO, bool isC) : - isMPI_(isM), isOpenMP_(isO), isCUDA_(isC), nprocs_(-1) + isMPI_(isM), isOpenMP_(isO), isCUDA_(isC), nprocs_(-1), t_total_(-1) { ArgList varg( vstr, "V." ); version_major_ = varg.getNextInteger(-1); @@ -27,11 +27,12 @@ class Exec_ParseTiming::RunTiming { } void SetNprocs(int n) { nprocs_ = n; } + void SetTotalTime(double t) { t_total_ = t; } void Print() const { - mprintf("Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i\n", + mprintf("Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i t_total=%g\n", version_major_, version_minor_, version_revision_, - (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_); + (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_, t_total_); } private: int version_major_; @@ -41,6 +42,7 @@ class Exec_ParseTiming::RunTiming { bool isOpenMP_; bool isCUDA_; int nprocs_; + double t_total_; }; int Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { @@ -71,6 +73,12 @@ int Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { // processes should be the next arg thisRun.SetNprocs( procs.getNextInteger(-1) ); } + } else if (ptr[0] == 'T') { + if (strncmp(ptr, "TIME:", 5) == 0) { + ArgList timeArg( ptr+5, " " ); + if (timeArg.Nargs() == 5 && timeArg[0] == "Total" && timeArg[1] == "execution") + thisRun.SetTotalTime( timeArg.getKeyDouble("time:", -1) ); + } // END TIME: } ptr = infile.Line(); } From 9b07d2fe5030e523279f3d78b7be925051a396d3 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 10:54:14 -0400 Subject: [PATCH 04/55] Get threads --- src/Exec_ParseTiming.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp index 7d768036c8..703e41db35 100644 --- a/src/Exec_ParseTiming.cpp +++ b/src/Exec_ParseTiming.cpp @@ -16,9 +16,9 @@ class Exec_ParseTiming::RunTiming { public: RunTiming() : version_major_(-1), version_minor_(-1), version_revision_(-1), isMPI_(false), isOpenMP_(false), isCUDA_(false), - nprocs_(-1), t_total_(-1) {} + nprocs_(-1), nthreads_(-1), t_total_(-1) {} RunTiming(std::string const& vstr, bool isM, bool isO, bool isC) : - isMPI_(isM), isOpenMP_(isO), isCUDA_(isC), nprocs_(-1), t_total_(-1) + isMPI_(isM), isOpenMP_(isO), isCUDA_(isC), nprocs_(-1), nthreads_(-1), t_total_(-1) { ArgList varg( vstr, "V." ); version_major_ = varg.getNextInteger(-1); @@ -27,12 +27,13 @@ class Exec_ParseTiming::RunTiming { } void SetNprocs(int n) { nprocs_ = n; } + void SetNthreads(int n) { nthreads_ = n; } void SetTotalTime(double t) { t_total_ = t; } void Print() const { - mprintf("Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i t_total=%g\n", + mprintf("Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i nthreads=%i t_total=%g\n", version_major_, version_minor_, version_revision_, - (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_, t_total_); + (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_, nthreads_, t_total_); } private: int version_major_; @@ -42,6 +43,7 @@ class Exec_ParseTiming::RunTiming { bool isOpenMP_; bool isCUDA_; int nprocs_; + int nthreads_; double t_total_; }; @@ -72,6 +74,10 @@ int Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { ArgList procs( ptr+12, " " ); // processes should be the next arg thisRun.SetNprocs( procs.getNextInteger(-1) ); + } else if (strncmp(ptr+4, "OpenMP", 6)==0) { + ArgList threads( ptr+1, " " ); + // threads should be the next arg + thisRun.SetNthreads( threads.getNextInteger(-1) ); } } else if (ptr[0] == 'T') { if (strncmp(ptr, "TIME:", 5) == 0) { @@ -83,7 +89,7 @@ int Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { ptr = infile.Line(); } thisRun.Print(); - + mprintf("\n"); infile.CloseFile(); return 0; } From 27374eed1e3b05f6d1348b2b7f2d2686a49ea148 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 11:04:01 -0400 Subject: [PATCH 05/55] Store results in an array --- src/Exec_ParseTiming.cpp | 44 +++++++++++++++++++++++++--------------- src/Exec_ParseTiming.h | 2 +- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp index 703e41db35..3ac47126ea 100644 --- a/src/Exec_ParseTiming.cpp +++ b/src/Exec_ParseTiming.cpp @@ -17,8 +17,8 @@ class Exec_ParseTiming::RunTiming { RunTiming() : version_major_(-1), version_minor_(-1), version_revision_(-1), isMPI_(false), isOpenMP_(false), isCUDA_(false), nprocs_(-1), nthreads_(-1), t_total_(-1) {} - RunTiming(std::string const& vstr, bool isM, bool isO, bool isC) : - isMPI_(isM), isOpenMP_(isO), isCUDA_(isC), nprocs_(-1), nthreads_(-1), t_total_(-1) + RunTiming(std::string const& name, std::string const& vstr, bool isM, bool isO, bool isC) : + name_(name), isMPI_(isM), isOpenMP_(isO), isCUDA_(isC), nprocs_(-1), nthreads_(-1), t_total_(-1) { ArgList varg( vstr, "V." ); version_major_ = varg.getNextInteger(-1); @@ -31,11 +31,18 @@ class Exec_ParseTiming::RunTiming { void SetTotalTime(double t) { t_total_ = t; } void Print() const { - mprintf("Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i nthreads=%i t_total=%g\n", - version_major_, version_minor_, version_revision_, + mprintf("%s Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i nthreads=%i t_total=%g\n", + name_.c_str(), version_major_, version_minor_, version_revision_, (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_, nthreads_, t_total_); } + + bool IsBad() const { + if (name_.empty()) return true; + if (t_total_ < 0) return true; + return false; + } private: + std::string name_; int version_major_; int version_minor_; int version_revision_; @@ -47,27 +54,27 @@ class Exec_ParseTiming::RunTiming { double t_total_; }; -int Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { +Exec_ParseTiming::RunTiming Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { BufferedLine infile; + RunTiming thisRun; if (infile.OpenFileRead( fname )) { mprinterr("Error: Could not open '%s'\n", fname.c_str()); - return 1; + return thisRun; } - RunTiming thisRun; const char* ptr = infile.Line(); while (ptr != 0) { if (ptr[0] == 'C') { if (strncmp(ptr, "CPPTRAJ: Trajectory Analysis.", 29)==0) { - mprintf("DEBUG: Title: %s\n", ptr); + //mprintf("DEBUG: Title: %s\n", ptr); ArgList title( ptr+29, " " ); - mprintf("DEBUG: TitleArg: %s\n", title.ArgLine()); + //mprintf("DEBUG: TitleArg: %s\n", title.ArgLine()); // Version should be the first arg std::string versionStr = title.GetStringNext(); bool isMPI = title.hasKey("MPI"); bool isOpenMP = title.hasKey("OpenMP"); bool isCUDA = title.hasKey("CUDA"); - thisRun = RunTiming(versionStr, isMPI, isOpenMP, isCUDA); + thisRun = RunTiming(fname, versionStr, isMPI, isOpenMP, isCUDA); } } else if (ptr[0] == '|') { if (strncmp(ptr, "| Running on", 12)==0) { @@ -88,10 +95,9 @@ int Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { } ptr = infile.Line(); } - thisRun.Print(); - mprintf("\n"); + //thisRun.Print(); infile.CloseFile(); - return 0; + return thisRun; } // Exec_ParseTiming::Help() void Exec_ParseTiming::Help() const @@ -119,12 +125,18 @@ Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) filearg = argIn.GetStringNext(); } + typedef std::vector RunArray; + RunArray Runs; + Runs.reserve( FileNameList.size() ); for (File::NameArray::const_iterator it = FileNameList.begin(); it != FileNameList.end(); ++it) { - mprintf("\t%s\n", it->full()); - if (read_cpptraj_output( it->Full() )) { - mprinterr("Error: Could not read cpptraj output '%s'\n", it->full()); + //mprintf("\t%s\n", it->full()); + Runs.push_back( read_cpptraj_output( it->Full() ) ); + if (Runs.back().IsBad()) { + mprinterr("Error: Problem reading cpptraj output from '%s'\n", it->full()); return CpptrajState::ERR; } + Runs.back().Print(); + mprintf("\n"); } return CpptrajState::OK; diff --git a/src/Exec_ParseTiming.h b/src/Exec_ParseTiming.h index 579479e42e..b1f336587a 100644 --- a/src/Exec_ParseTiming.h +++ b/src/Exec_ParseTiming.h @@ -11,6 +11,6 @@ class Exec_ParseTiming : public Exec { private: class RunTiming; - int read_cpptraj_output(std::string const&); + RunTiming read_cpptraj_output(std::string const&); }; #endif From 7be107dc40c6d393a138e732a7a84c7b27d01715 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 13:23:17 -0400 Subject: [PATCH 06/55] Sort by total time --- src/Exec_ParseTiming.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp index 3ac47126ea..8dbd46561b 100644 --- a/src/Exec_ParseTiming.cpp +++ b/src/Exec_ParseTiming.cpp @@ -3,6 +3,7 @@ #include "FileName.h" #include "BufferedLine.h" #include // strncmp +#include // std::sort /** CONSTRUCTOR */ Exec_ParseTiming::Exec_ParseTiming() : @@ -30,6 +31,8 @@ class Exec_ParseTiming::RunTiming { void SetNthreads(int n) { nthreads_ = n; } void SetTotalTime(double t) { t_total_ = t; } + double TotalTime() const { return t_total_; } + void Print() const { mprintf("%s Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i nthreads=%i t_total=%g\n", name_.c_str(), version_major_, version_minor_, version_revision_, @@ -41,6 +44,14 @@ class Exec_ParseTiming::RunTiming { if (t_total_ < 0) return true; return false; } + + /** Sort by total time, longest first. */ + struct sort_by_total_time { + inline bool operator()(RunTiming const& first, RunTiming const& second) const { + return (first.TotalTime() > second.TotalTime()); + } + }; + private: std::string name_; int version_major_; @@ -54,6 +65,7 @@ class Exec_ParseTiming::RunTiming { double t_total_; }; +/** Execute command. */ Exec_ParseTiming::RunTiming Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { BufferedLine infile; @@ -135,7 +147,14 @@ Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) mprinterr("Error: Problem reading cpptraj output from '%s'\n", it->full()); return CpptrajState::ERR; } - Runs.back().Print(); + //Runs.back().Print(); + //mprintf("\n"); + } + + std::sort(Runs.begin(), Runs.end(), RunTiming::sort_by_total_time()); + + for (RunArray::const_iterator it = Runs.begin(); it != Runs.end(); ++it) { + it->Print(); mprintf("\n"); } From 20319991fe8c569b185b091ae07a68e8d727433e Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 13:33:44 -0400 Subject: [PATCH 07/55] Fix # threads detection. Add total cores calc. Better error checking --- src/Exec_ParseTiming.cpp | 47 +++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp index 8dbd46561b..610a3c44ac 100644 --- a/src/Exec_ParseTiming.cpp +++ b/src/Exec_ParseTiming.cpp @@ -33,15 +33,28 @@ class Exec_ParseTiming::RunTiming { double TotalTime() const { return t_total_; } + int TotalCores() const { + if (isMPI_ && isOpenMP_) + return nprocs_ * nthreads_; + else if (isMPI_) + return nprocs_; + else if (isOpenMP_) + return nthreads_; + else + return 1; + } + void Print() const { - mprintf("%s Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i nthreads=%i t_total=%g\n", + mprintf("%s Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i nthreads=%i ncores=%i t_total=%g\n", name_.c_str(), version_major_, version_minor_, version_revision_, - (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_, nthreads_, t_total_); + (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_, nthreads_, TotalCores(), t_total_); } bool IsBad() const { - if (name_.empty()) return true; - if (t_total_ < 0) return true; + if (name_.empty()) { mprinterr("Error: Empty run name.\n"); return true; } + if (t_total_ < 0) { mprinterr("Error: Empty run time.\n"); return true; } + if (isMPI_ && nprocs_ < 1) { mprinterr("Error: MPI && procs < 1.\n"); return true; } + if (isOpenMP_ && nthreads_ < 1) { mprinterr("Error: OpenMP && threads < 1.\n"); return true; } return false; } @@ -79,24 +92,24 @@ Exec_ParseTiming::RunTiming Exec_ParseTiming::read_cpptraj_output(std::string co if (ptr[0] == 'C') { if (strncmp(ptr, "CPPTRAJ: Trajectory Analysis.", 29)==0) { //mprintf("DEBUG: Title: %s\n", ptr); - ArgList title( ptr+29, " " ); + ArgList titleArg( ptr+29, " " ); //mprintf("DEBUG: TitleArg: %s\n", title.ArgLine()); // Version should be the first arg - std::string versionStr = title.GetStringNext(); - bool isMPI = title.hasKey("MPI"); - bool isOpenMP = title.hasKey("OpenMP"); - bool isCUDA = title.hasKey("CUDA"); + std::string versionStr = titleArg.GetStringNext(); + bool isMPI = titleArg.hasKey("MPI"); + bool isOpenMP = titleArg.hasKey("OpenMP"); + bool isCUDA = titleArg.hasKey("CUDA"); thisRun = RunTiming(fname, versionStr, isMPI, isOpenMP, isCUDA); } } else if (ptr[0] == '|') { - if (strncmp(ptr, "| Running on", 12)==0) { - ArgList procs( ptr+12, " " ); - // processes should be the next arg - thisRun.SetNprocs( procs.getNextInteger(-1) ); - } else if (strncmp(ptr+4, "OpenMP", 6)==0) { - ArgList threads( ptr+1, " " ); - // threads should be the next arg - thisRun.SetNthreads( threads.getNextInteger(-1) ); + ArgList infoArg(ptr+1, " "); + if (infoArg.Nargs() == 4 && infoArg[0] == "Running" && infoArg[1] == "on") { + // processes should be the next integer arg + thisRun.SetNprocs( infoArg.getNextInteger(-1) ); + } else if (infoArg.Nargs() == 4 && infoArg[1] == "OpenMP" && infoArg[2] == "threads") { + mprintf("DEBUG: OpenMP threads. %s\n", ptr); + // threads should be the next integer arg + thisRun.SetNthreads( infoArg.getNextInteger(-1) ); } } else if (ptr[0] == 'T') { if (strncmp(ptr, "TIME:", 5) == 0) { From 2f039fb7d572bae8a5595b7a99177a34e1570e6f Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 13:40:49 -0400 Subject: [PATCH 08/55] Add sort by time/cores option --- src/Exec_ParseTiming.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp index 610a3c44ac..a1e1ebbfc6 100644 --- a/src/Exec_ParseTiming.cpp +++ b/src/Exec_ParseTiming.cpp @@ -65,6 +65,17 @@ class Exec_ParseTiming::RunTiming { } }; + /** Sort by total cores, then time. */ + struct sort_by_cores { + inline bool operator()(RunTiming const& first, RunTiming const& second) const { + int first_cores = first.TotalCores(); + int second_cores = second.TotalCores(); + if (first_cores == second_cores) + return (first.TotalTime() > second.TotalTime()); + else + return (first_cores < second_cores); + } + }; private: std::string name_; int version_major_; @@ -82,6 +93,7 @@ class Exec_ParseTiming::RunTiming { Exec_ParseTiming::RunTiming Exec_ParseTiming::read_cpptraj_output(std::string const& fname) { BufferedLine infile; + RunTiming thisRun; if (infile.OpenFileRead( fname )) { mprinterr("Error: Could not open '%s'\n", fname.c_str()); @@ -127,7 +139,7 @@ Exec_ParseTiming::RunTiming Exec_ParseTiming::read_cpptraj_output(std::string co // Exec_ParseTiming::Help() void Exec_ParseTiming::Help() const { - mprintf("\t ...\n" + mprintf("\t ... [sortby {time|cores}]\n" " Parse cpptraj output for timing data.\n" ); } @@ -136,6 +148,18 @@ void Exec_ParseTiming::Help() const // Exec_ParseTiming::Execute() Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) { + enum SortType { SORT_T_TOTAL = 0, SORT_CORES }; + const char* SortTypeStr[] = {"time", "total # cores"}; + SortType sort; + std::string sortarg = argIn.GetStringKey("sortby"); + if (sortarg.empty()) + sort = SORT_T_TOTAL; + else if (sortarg == "time") + sort = SORT_T_TOTAL; + else if (sortarg == "cores") + sort = SORT_CORES; + mprintf("\tSort by %s\n", SortTypeStr[sort]); + File::NameArray FileNameList; std::string filearg = argIn.GetStringNext(); @@ -164,7 +188,10 @@ Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) //mprintf("\n"); } - std::sort(Runs.begin(), Runs.end(), RunTiming::sort_by_total_time()); + switch (sort) { + case SORT_T_TOTAL : std::sort(Runs.begin(), Runs.end(), RunTiming::sort_by_total_time()); break; + case SORT_CORES : std::sort(Runs.begin(), Runs.end(), RunTiming::sort_by_cores()); break; + } for (RunArray::const_iterator it = Runs.begin(); it != Runs.end(); ++it) { it->Print(); From 24f96f695b281c9d2a1f4c48f8d90fe46f391f37 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 14:10:55 -0400 Subject: [PATCH 09/55] Add data sets and data file. Add shorthand names for each run --- src/Exec_ParseTiming.cpp | 92 +++++++++++++++++++++++++++++++++++++--- src/cpptrajdepend | 2 +- 2 files changed, 86 insertions(+), 8 deletions(-) diff --git a/src/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp index a1e1ebbfc6..f65f07413b 100644 --- a/src/Exec_ParseTiming.cpp +++ b/src/Exec_ParseTiming.cpp @@ -2,6 +2,8 @@ #include "CpptrajStdio.h" #include "FileName.h" #include "BufferedLine.h" +#include "DataSet_Mesh.h" +#include "StringRoutines.h" #include // strncmp #include // std::sort @@ -19,7 +21,7 @@ class Exec_ParseTiming::RunTiming { isMPI_(false), isOpenMP_(false), isCUDA_(false), nprocs_(-1), nthreads_(-1), t_total_(-1) {} RunTiming(std::string const& name, std::string const& vstr, bool isM, bool isO, bool isC) : - name_(name), isMPI_(isM), isOpenMP_(isO), isCUDA_(isC), nprocs_(-1), nthreads_(-1), t_total_(-1) + filename_(name), isMPI_(isM), isOpenMP_(isO), isCUDA_(isC), nprocs_(-1), nthreads_(-1), t_total_(-1) { ArgList varg( vstr, "V." ); version_major_ = varg.getNextInteger(-1); @@ -44,14 +46,30 @@ class Exec_ParseTiming::RunTiming { return 1; } + std::string const& Filename() const { return filename_; } + + std::string Name() const { + std::string out; + if (isMPI_ && isOpenMP_) + out.assign("H" + integerToString(nprocs_) + "x" + integerToString(nthreads_)); + else if (isMPI_) + out.assign("M" + integerToString(nprocs_)); + else if (isOpenMP_) + out.assign("O" + integerToString(nthreads_)); + else + out.assign("S"); + if (isCUDA_) out.append("(C)"); + return out; + } + void Print() const { mprintf("%s Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i nthreads=%i ncores=%i t_total=%g\n", - name_.c_str(), version_major_, version_minor_, version_revision_, + filename_.c_str(), version_major_, version_minor_, version_revision_, (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_, nthreads_, TotalCores(), t_total_); } bool IsBad() const { - if (name_.empty()) { mprinterr("Error: Empty run name.\n"); return true; } + if (filename_.empty()) { mprinterr("Error: Empty run name.\n"); return true; } if (t_total_ < 0) { mprinterr("Error: Empty run time.\n"); return true; } if (isMPI_ && nprocs_ < 1) { mprinterr("Error: MPI && procs < 1.\n"); return true; } if (isOpenMP_ && nthreads_ < 1) { mprinterr("Error: OpenMP && threads < 1.\n"); return true; } @@ -77,7 +95,7 @@ class Exec_ParseTiming::RunTiming { } }; private: - std::string name_; + std::string filename_; int version_major_; int version_minor_; int version_revision_; @@ -119,7 +137,7 @@ Exec_ParseTiming::RunTiming Exec_ParseTiming::read_cpptraj_output(std::string co // processes should be the next integer arg thisRun.SetNprocs( infoArg.getNextInteger(-1) ); } else if (infoArg.Nargs() == 4 && infoArg[1] == "OpenMP" && infoArg[2] == "threads") { - mprintf("DEBUG: OpenMP threads. %s\n", ptr); + //mprintf("DEBUG: OpenMP threads. %s\n", ptr); // threads should be the next integer arg thisRun.SetNthreads( infoArg.getNextInteger(-1) ); } @@ -139,7 +157,7 @@ Exec_ParseTiming::RunTiming Exec_ParseTiming::read_cpptraj_output(std::string co // Exec_ParseTiming::Help() void Exec_ParseTiming::Help() const { - mprintf("\t ... [sortby {time|cores}]\n" + mprintf("\t ... [sortby {time|cores}] [out ] [name ]\n" " Parse cpptraj output for timing data.\n" ); } @@ -160,6 +178,36 @@ Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) sort = SORT_CORES; mprintf("\tSort by %s\n", SortTypeStr[sort]); + DataFile* outfile = State.DFL().AddDataFile( argIn.GetStringKey("out"), argIn ); + if (outfile != 0) + mprintf("\tOutput to file '%s'\n", outfile->DataFilename().full()); + + std::string dsname = argIn.GetStringKey("name"); + if (dsname.empty()) + dsname = State.DSL().GenerateDefaultName("TIMING"); + mprintf("\tDataSet name: %s\n", dsname.c_str()); + + // Which variables to plot + enum Xtype { X_INDEX=0, X_CORES }; + enum Ytype { Y_T_TOTAL=0 }; + + Xtype xvar; + Ytype yvar; + Dimension Xdim; + //Dimension Ydim; + + if (sort == SORT_CORES) { + xvar = X_CORES; + Xdim.SetLabel("Cores"); + } else { + xvar = X_INDEX; + Xdim.SetLabel("Run"); + } + + yvar = Y_T_TOTAL; + //Ydim.SetLabel("TotalTime"); + + // Only file name args below here File::NameArray FileNameList; std::string filearg = argIn.GetStringNext(); @@ -193,9 +241,39 @@ Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) case SORT_CORES : std::sort(Runs.begin(), Runs.end(), RunTiming::sort_by_cores()); break; } + DataSet* ds = State.DSL().AddSet( DataSet::XYMESH, MetaData(dsname) ); + if (ds == 0) { + mprinterr("Error: Could not allocate output set.\n"); + return CpptrajState::ERR; + } + if (outfile != 0) outfile->AddDataSet( ds ); + DataSet_Mesh& outset = static_cast( *ds ); + outset.Allocate( DataSet::SizeArray(1, Runs.size()) ); + outset.SetDim(Dimension::X, Xdim); + //outset.SetDim(Dimension::Y, Ydim); + + DataSet* nameSet = State.DSL().AddSet(DataSet::STRING, MetaData(dsname, "name")); + if (nameSet == 0) { + mprinterr("Error: Could not allocate output names set.\n"); + return CpptrajState::ERR; + } + if (outfile != 0) outfile->AddDataSet( nameSet ); + nameSet->Allocate( DataSet::SizeArray(1, Runs.size()) ); + nameSet->SetDim(Dimension::X, Xdim); + for (RunArray::const_iterator it = Runs.begin(); it != Runs.end(); ++it) { + double X = 0; + switch (xvar) { + case X_INDEX : X = (double)(it - Runs.begin()); break; + case X_CORES : X = (double)it->TotalCores(); break; + } + double Y = 0; + switch (yvar) { + case Y_T_TOTAL : Y = it->TotalTime(); break; + } + outset.AddXY(X, Y); + nameSet->Add(it - Runs.begin(), it->Name().c_str()); it->Print(); - mprintf("\n"); } return CpptrajState::OK; diff --git a/src/cpptrajdepend b/src/cpptrajdepend index fa0db5c6a7..4326d69cf8 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -305,7 +305,7 @@ Exec_ParmBox.o : Exec_ParmBox.cpp Action.h ActionList.h ActionState.h Analysis.h Exec_ParmSolvent.o : Exec_ParmSolvent.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_ParmSolvent.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_ParmStrip.o : Exec_ParmStrip.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_ParmStrip.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_ParmWrite.o : Exec_ParmWrite.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_ParmWrite.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h ParmFile.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h -Exec_ParseTiming.o : Exec_ParseTiming.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_ParseTiming.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h +Exec_ParseTiming.o : Exec_ParseTiming.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h BufferedLine.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Mesh.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_ParseTiming.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h Spline.h StringRoutines.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_PermuteDihedrals.o : Exec_PermuteDihedrals.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h CharMask.h CompactFrameArray.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h DihedralSearch.h Dimension.h DispatchObject.h DistRoutines.h EnsembleIn.h EnsembleOutList.h ExclusionArray.h Exec.h Exec_PermuteDihedrals.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h ImageOption.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h PairList.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Random.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h StructureCheck.h SymbolExporting.h TextFormat.h Timer.h Topology.h TorsionRoutines.h TrajFrameCounter.h TrajectoryFile.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h TypeNameHolder.h Unit.h Vec3.h Exec_Precision.o : Exec_Precision.cpp Action.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_Precision.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h Trajin.h TrajinList.h TrajoutList.h TypeNameHolder.h Unit.h Vec3.h Exec_PrepareForLeap.o : Exec_PrepareForLeap.cpp Action.h ActionFrameCounter.h ActionList.h ActionState.h Analysis.h AnalysisList.h AnalysisState.h ArgList.h AssociatedData.h Atom.h AtomMap.h AtomMask.h AtomType.h BaseIOtype.h Box.h CharMask.h CompactFrameArray.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajState.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_Coords.h DataSet_Coords_CRD.h DataSet_Coords_REF.h Dimension.h DispatchObject.h EnsembleIn.h EnsembleOutList.h Exec.h Exec_PrepareForLeap.h FileIO.h FileName.h FileTypes.h Frame.h FramePtrArray.h InputTrajCommon.h LeapInterface.h MapAtom.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h ParmFile.h Range.h ReferenceFrame.h ReplicaDimArray.h ReplicaInfo.h Residue.h Segment.h StringRoutines.h Structure/Disulfide.h Structure/HisProt.h Structure/ResStatArray.h Structure/Sugar.h Structure/SugarBuilder.h Structure/SugarToken.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajFrameCounter.h TrajectoryFile.h Trajin.h TrajinList.h TrajoutList.h Trajout_Single.h TypeNameHolder.h Unit.h Vec3.h From 7edf08ddd50d263566ec0a5c95b9f611495adafb Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 14:37:08 -0400 Subject: [PATCH 10/55] Allow skipping over non-cpptraj-output files --- src/Exec_ParseTiming.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp index f65f07413b..f12a50c28c 100644 --- a/src/Exec_ParseTiming.cpp +++ b/src/Exec_ParseTiming.cpp @@ -68,14 +68,18 @@ class Exec_ParseTiming::RunTiming { (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_, nthreads_, TotalCores(), t_total_); } - bool IsBad() const { - if (filename_.empty()) { mprinterr("Error: Empty run name.\n"); return true; } - if (t_total_ < 0) { mprinterr("Error: Empty run time.\n"); return true; } - if (isMPI_ && nprocs_ < 1) { mprinterr("Error: MPI && procs < 1.\n"); return true; } - if (isOpenMP_ && nthreads_ < 1) { mprinterr("Error: OpenMP && threads < 1.\n"); return true; } + bool IsBad() { + errMsg_.clear(); + if (filename_.empty()) { errMsg_.assign("Empty run name.\n"); return true; } + if (t_total_ < 0) { errMsg_.assign("Empty run time.\n"); return true; } + if (isMPI_ && nprocs_ < 1) { errMsg_.assign("MPI && procs < 1.\n"); return true; } + if (isOpenMP_ && nthreads_ < 1) { errMsg_.assign("OpenMP && threads < 1.\n"); return true; } return false; } + /** \return last error message set by IsBad() */ + std::string const& ErrMsg() const { return errMsg_; } + /** Sort by total time, longest first. */ struct sort_by_total_time { inline bool operator()(RunTiming const& first, RunTiming const& second) const { @@ -105,6 +109,7 @@ class Exec_ParseTiming::RunTiming { int nprocs_; int nthreads_; double t_total_; + std::string errMsg_; }; /** Execute command. */ @@ -227,10 +232,12 @@ Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) Runs.reserve( FileNameList.size() ); for (File::NameArray::const_iterator it = FileNameList.begin(); it != FileNameList.end(); ++it) { //mprintf("\t%s\n", it->full()); - Runs.push_back( read_cpptraj_output( it->Full() ) ); - if (Runs.back().IsBad()) { - mprinterr("Error: Problem reading cpptraj output from '%s'\n", it->full()); - return CpptrajState::ERR; + RunTiming thisRun = read_cpptraj_output( it->Full() ); + if (thisRun.IsBad()) { + mprintf("Warning: Problem reading cpptraj output from '%s' : %s\n", it->full(), thisRun.ErrMsg().c_str()); + //return CpptrajState::ERR; + } else { + Runs.push_back( thisRun ); } //Runs.back().Print(); //mprintf("\n"); From b02632e812215763920b950f3d59bb3b11650cc8 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Fri, 19 May 2023 15:12:55 -0400 Subject: [PATCH 11/55] Extract detailed traj read and action process timings. --- src/Exec_ParseTiming.cpp | 57 +++++++++++++++++++++++++++++++++++++--- src/Exec_ParseTiming.h | 1 + 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/Exec_ParseTiming.cpp b/src/Exec_ParseTiming.cpp index f12a50c28c..2ab5b2f6da 100644 --- a/src/Exec_ParseTiming.cpp +++ b/src/Exec_ParseTiming.cpp @@ -32,9 +32,25 @@ class Exec_ParseTiming::RunTiming { void SetNprocs(int n) { nprocs_ = n; } void SetNthreads(int n) { nthreads_ = n; } void SetTotalTime(double t) { t_total_ = t; } + void AddTrajReadTime(double t) { t_traj_read_.push_back( t ); } + void AddActionFrameTime(double t) { t_action_frame_.push_back( t ); } double TotalTime() const { return t_total_; } + double TrajReadTime() const { + double t = 0; + for (Darray::const_iterator it = t_traj_read_.begin(); it != t_traj_read_.end(); ++it) + if (*it > t) t = *it; + return t; + } + + double ActionFrameTime() const { + double t = 0; + for (Darray::const_iterator it = t_action_frame_.begin(); it != t_action_frame_.end(); ++it) + if (*it > t) t = *it; + return t; + } + int TotalCores() const { if (isMPI_ && isOpenMP_) return nprocs_ * nthreads_; @@ -46,6 +62,8 @@ class Exec_ParseTiming::RunTiming { return 1; } + bool HasDetailedTiming() const { return !(t_traj_read_.empty() || t_action_frame_.empty()); } + std::string const& Filename() const { return filename_; } std::string Name() const { @@ -66,6 +84,11 @@ class Exec_ParseTiming::RunTiming { mprintf("%s Version %i.%i.%i mpi=%i omp=%i cuda=%i nprocs=%i nthreads=%i ncores=%i t_total=%g\n", filename_.c_str(), version_major_, version_minor_, version_revision_, (int)isMPI_, (int)isOpenMP_, (int)isCUDA_, nprocs_, nthreads_, TotalCores(), t_total_); + for (Darray::const_iterator it = t_traj_read_.begin(); it != t_traj_read_.end(); ++it) + mprintf(" %g", *it); + for (Darray::const_iterator it = t_action_frame_.begin(); it != t_action_frame_.end(); ++it) + mprintf(" %g", *it); + mprintf("\n"); } bool IsBad() { @@ -109,6 +132,8 @@ class Exec_ParseTiming::RunTiming { int nprocs_; int nthreads_; double t_total_; + Darray t_traj_read_; + Darray t_action_frame_; std::string errMsg_; }; @@ -148,9 +173,14 @@ Exec_ParseTiming::RunTiming Exec_ParseTiming::read_cpptraj_output(std::string co } } else if (ptr[0] == 'T') { if (strncmp(ptr, "TIME:", 5) == 0) { - ArgList timeArg( ptr+5, " " ); - if (timeArg.Nargs() == 5 && timeArg[0] == "Total" && timeArg[1] == "execution") + ArgList timeArg( ptr, " \t" ); + //timeArg.PrintDebug(); + if (timeArg.Nargs() == 6 && timeArg[1] == "Total" && timeArg[2] == "execution") thisRun.SetTotalTime( timeArg.getKeyDouble("time:", -1) ); + else if (timeArg.Nargs() > 3 && timeArg[1] == "Trajectory" && timeArg[2] == "read:") + thisRun.AddTrajReadTime( timeArg.getNextDouble(-1) ); + else if (timeArg.Nargs() > 4 && timeArg[1] == "Action" && timeArg[2] == "frame" && timeArg[3] == "processing:") + thisRun.AddActionFrameTime( timeArg.getNextDouble(-1) ); } // END TIME: } ptr = infile.Line(); @@ -163,6 +193,7 @@ Exec_ParseTiming::RunTiming Exec_ParseTiming::read_cpptraj_output(std::string co void Exec_ParseTiming::Help() const { mprintf("\t ... [sortby {time|cores}] [out ] [name ]\n" + "\t[type {trajread|actframe}]\n" " Parse cpptraj output for timing data.\n" ); } @@ -194,7 +225,7 @@ Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) // Which variables to plot enum Xtype { X_INDEX=0, X_CORES }; - enum Ytype { Y_T_TOTAL=0 }; + enum Ytype { Y_T_TOTAL=0, Y_T_TRAJREAD, Y_T_ACTFRAME }; Xtype xvar; Ytype yvar; @@ -209,7 +240,17 @@ Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) Xdim.SetLabel("Run"); } - yvar = Y_T_TOTAL; + bool needsDetailedTiming = false; + std::string typearg = argIn.GetStringKey("type"); + if (typearg.empty()) + yvar = Y_T_TOTAL; + else if (typearg == "trajread") { + yvar = Y_T_TRAJREAD; + needsDetailedTiming = true; + } else if (typearg == "actframe") { + yvar = Y_T_ACTFRAME; + needsDetailedTiming = true; + } //Ydim.SetLabel("TotalTime"); // Only file name args below here @@ -269,6 +310,12 @@ Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) nameSet->SetDim(Dimension::X, Xdim); for (RunArray::const_iterator it = Runs.begin(); it != Runs.end(); ++it) { + if (needsDetailedTiming && !it->HasDetailedTiming()) { + mprinterr("Error: Detailed timing requested but output %s does not contain detailed timing.\n", + it->Filename().c_str()); + it->Print(); + return CpptrajState::ERR; + } double X = 0; switch (xvar) { case X_INDEX : X = (double)(it - Runs.begin()); break; @@ -277,6 +324,8 @@ Exec::RetType Exec_ParseTiming::Execute(CpptrajState& State, ArgList& argIn) double Y = 0; switch (yvar) { case Y_T_TOTAL : Y = it->TotalTime(); break; + case Y_T_TRAJREAD : Y = it->TrajReadTime(); break; + case Y_T_ACTFRAME : Y = it->ActionFrameTime(); break; } outset.AddXY(X, Y); nameSet->Add(it - Runs.begin(), it->Name().c_str()); diff --git a/src/Exec_ParseTiming.h b/src/Exec_ParseTiming.h index b1f336587a..3fe1cd64d0 100644 --- a/src/Exec_ParseTiming.h +++ b/src/Exec_ParseTiming.h @@ -9,6 +9,7 @@ class Exec_ParseTiming : public Exec { DispatchObject* Alloc() const { return (DispatchObject*)new Exec_ParseTiming(); } RetType Execute(CpptrajState&, ArgList&); private: + typedef std::vector Darray; class RunTiming; RunTiming read_cpptraj_output(std::string const&); From 2cd264cc047128efe9e26da256ebd10edf712596 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 22 May 2023 09:36:52 -0400 Subject: [PATCH 12/55] Start TICA --- src/Analysis_TICA.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/Analysis_TICA.h | 17 +++++++++++++++++ src/cpptrajdepend | 1 + src/cpptrajfiles | 1 + 4 files changed, 59 insertions(+) create mode 100644 src/Analysis_TICA.cpp create mode 100644 src/Analysis_TICA.h diff --git a/src/Analysis_TICA.cpp b/src/Analysis_TICA.cpp new file mode 100644 index 0000000000..d832590df2 --- /dev/null +++ b/src/Analysis_TICA.cpp @@ -0,0 +1,40 @@ +#include "Analysis_TICA.h" +#include "CpptrajStdio.h" + +/** CONSTRUCTOR */ +Analysis_TICA::Analysis_TICA() : + TgtTraj_(0), + lag_(0) +{} + +// Analysis_TICA::Help() +void Analysis_TICA::Help() const { + +} + +// Analysis_TICA::Setup() +Analysis::RetType Analysis_TICA::Setup(ArgList& analyzeArgs, AnalysisSetup& setup, int debugIn) +{ + // Attempt to get coords dataset from datasetlist + std::string setname = analyzeArgs.GetStringKey("crdset"); + TgtTraj_ = (DataSet_Coords*)setup.DSL().FindCoordsSet( setname ); + if (TgtTraj_ == 0) { + mprinterr("Error: Could not locate COORDS set corresponding to %s\n", + setname.c_str()); + Help(); + return Analysis::ERR; + } + // Other keywords + lag_ = analyzeArgs.getKeyInt("lag", 1); + + mprintf(" TICA: Time independent correlation analysis.\n"); + mprintf("\tUsing coordinates from set '%s'\n", TgtTraj_->legend()); + mprintf("\tTime lag: %i frames.\n", lag_); + + return Analysis::OK; +} + +// Analysis_TICA::Analyze() +Analysis::RetType Analysis_TICA::Analyze() { + +} diff --git a/src/Analysis_TICA.h b/src/Analysis_TICA.h new file mode 100644 index 0000000000..d3e3d2e41e --- /dev/null +++ b/src/Analysis_TICA.h @@ -0,0 +1,17 @@ +#ifndef INC_ANALYSIS_TICA_H +#define INC_ANALYSIS_TICA_H +#include "Analysis.h" +/// +class Analysis_TICA : public Analysis { + public: + Analysis_TICA(); + DispatchObject* Alloc() const { return (DispatchObject*)new Analysis_TICA(); } + void Help() const; + + Analysis::RetType Setup(ArgList&, AnalysisSetup&, int); + Analysis::RetType Analyze(); + private: + DataSet_Coords* TgtTraj_; ///< Input trajectory + int lag_; ///< TICA time lag +}; +#endif diff --git a/src/cpptrajdepend b/src/cpptrajdepend index 4326d69cf8..11aa3e8dac 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -129,6 +129,7 @@ Analysis_Spline.o : Analysis_Spline.cpp ActionState.h Analysis.h AnalysisState.h Analysis_State.o : Analysis_State.cpp ActionState.h Analysis.h AnalysisState.h Analysis_State.h ArgList.h Array1D.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_double.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 ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h Analysis_Statistics.o : Analysis_Statistics.cpp ActionState.h Analysis.h AnalysisState.h Analysis_Statistics.h ArgList.h Array1D.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_float.h DataSet_integer.h DataSet_string.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 ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h Analysis_TI.o : Analysis_TI.cpp ActionState.h Analysis.h AnalysisState.h Analysis_TI.h ArgList.h Array1D.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.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 ParameterHolders.h ParameterSet.h ParameterTypes.h Random.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h Spline.h StringRoutines.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h +Analysis_TICA.o : Analysis_TICA.cpp ActionState.h Analysis.h AnalysisState.h Analysis_TICA.h ArgList.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.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 ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h Analysis_Timecorr.o : Analysis_Timecorr.cpp ActionState.h Analysis.h AnalysisState.h Analysis_Timecorr.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h ComplexArray.h Constants.h CoordinateInfo.h Corr.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Vector.h DataSet_double.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 ParameterHolders.h ParameterSet.h ParameterTypes.h PubFFT.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h Analysis_VectorMath.o : Analysis_VectorMath.cpp ActionState.h Analysis.h AnalysisState.h Analysis_VectorMath.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h ComplexArray.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_Vector.h DataSet_double.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 ParameterHolders.h ParameterSet.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h SymbolExporting.h TextFormat.h Timer.h Topology.h TypeNameHolder.h Unit.h Vec3.h Analysis_Wavelet.o : Analysis_Wavelet.cpp ActionFrameCounter.h ActionState.h Analysis.h AnalysisState.h Analysis_Wavelet.h ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMask.h AtomType.h BaseIOtype.h Box.h ClusterMap.h ComplexArray.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataFile.h DataFileList.h DataSet.h DataSetList.h DataSet_2D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_MatrixFlt.h Dimension.h DispatchObject.h DistRoutines.h FileIO.h FileName.h FileTypes.h Frame.h ImageOption.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h OutputTrajCommon.h Parallel.h ParameterHolders.h ParameterSet.h ParameterTypes.h ParmFile.h ProgressBar.h ProgressTimer.h PubFFT.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h Segment.h StringRoutines.h SymbolExporting.h TextFormat.h Timer.h Topology.h TrajectoryFile.h Trajout_Single.h TypeNameHolder.h Unit.h Vec3.h diff --git a/src/cpptrajfiles b/src/cpptrajfiles index e7d016d455..a3d9e6c79f 100644 --- a/src/cpptrajfiles +++ b/src/cpptrajfiles @@ -132,6 +132,7 @@ COMMON_SOURCES= \ Analysis_State.cpp \ Analysis_Statistics.cpp \ Analysis_TI.cpp \ + Analysis_TICA.cpp \ Analysis_Timecorr.cpp \ Analysis_VectorMath.cpp \ Analysis_Wavelet.cpp \ From ab580d1332225f4e7d86efc33ec9bf4b2767e3fe Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 22 May 2023 09:56:06 -0400 Subject: [PATCH 13/55] Set up frame from mask with coordinate info --- src/Frame.cpp | 14 ++++++++++++++ src/Frame.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/src/Frame.cpp b/src/Frame.cpp index abd8d91c1d..ef3f206fcc 100644 --- a/src/Frame.cpp +++ b/src/Frame.cpp @@ -484,6 +484,20 @@ int Frame::SetupFrameFromMask(AtomMask const& maskIn, std::vector const& a return 0; } +/** Set up frame to hold # selected atoms in given mask based on + * given array of atoms and coordinate info. + */ +int Frame::SetupFrameFromMask(AtomMask const& maskIn, std::vector const& atoms, + CoordinateInfo const& cinfo) +{ + setupFrame( maskIn.Nselected(), cinfo ); + Mass_.clear(); + Mass_.reserve( maskIn.Nselected() ); + for (AtomMask::const_iterator atom = maskIn.begin(); atom != maskIn.end(); ++atom) + Mass_.push_back( atoms[ *atom ].Mass() ); + return 0; +} + // ---------- FRAME Add/remove components -------------------------------------- int Frame::AddVelocities(Darray const& vIn) { if ((int)vIn.size() != ncoord_) { diff --git a/src/Frame.h b/src/Frame.h index 5f543fdb23..041ade57e0 100644 --- a/src/Frame.h +++ b/src/Frame.h @@ -154,6 +154,8 @@ class Frame { int SetupFrameV(std::vector const&, CoordinateInfo const&); /// Allocate frame for selected # atoms, coords/mass only. int SetupFrameFromMask(AtomMask const&, std::vector const&); + /// Allocate frame for selected # atoms and coordinate info. + int SetupFrameFromMask(AtomMask const&, std::vector const&, CoordinateInfo const&); // ----- Add/remove components from Frame ---- int AddVelocities(Darray const&); void RemoveVelocities(); From 8016e52df740895613677daa0a2b3d4e00eb0251 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Mon, 22 May 2023 09:56:24 -0400 Subject: [PATCH 14/55] Add mask set up and initial loop --- src/Analysis_TICA.cpp | 34 ++++++++++++++++++++++++++++++++-- src/Analysis_TICA.h | 1 + 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/Analysis_TICA.cpp b/src/Analysis_TICA.cpp index d832590df2..32c6c03cc7 100644 --- a/src/Analysis_TICA.cpp +++ b/src/Analysis_TICA.cpp @@ -9,7 +9,7 @@ Analysis_TICA::Analysis_TICA() : // Analysis_TICA::Help() void Analysis_TICA::Help() const { - + mprintf("[crdset ] [lag