/** Given an argument with format, DataSet_Name[,min,max,step,bins], check * that DataSet_Name exists and is valid. Add the argument to * dimensionArgs and the corresponding dataset to histdata. */ int Analysis_Hist::CheckDimension(std::string const& input, DataSetList& DSLin) { ArgList arglist; // Separate input string by ',' arglist.SetList(input, ","); if (arglist.Nargs()<1) { mprinterr("Error: No arguments found in histogram argument: %s\n",input.c_str()); return 1; } // First argument should specify dataset name if (debug_>0) mprintf("\tHist: Setting up histogram dimension using dataset %s\n", arglist.Command()); DataSet* dset = DSLin.GetDataSet( arglist[0] ); if (dset == 0) { mprinterr("Error: Dataset %s not found.\n",arglist.Command()); return 1; } // For now only 1D scalar data sets can be histogrammed if (dset->Group() != DataSet::SCALAR_1D) { mprinterr("Error: Cannot histogram data set '%s'\n", dset->legend()); mprinterr("Error: Currently only 1D scalar data sets can be histogrammed.\n"); return 1; } // TODO parse remaining args here, create data structure. dimensionArgs_.push_back( arglist ); histdata_.push_back( (DataSet_1D*)dset ); return 0; }
// Exec_CrdAction::ProcessArgs() Exec::RetType Exec_CrdAction::ProcessArgs(CpptrajState& State, ArgList& argIn) { std::string setname = argIn.GetStringNext(); if (setname.empty()) { mprinterr("Error: %s: Specify COORDS dataset name.\n", argIn.Command()); return CpptrajState::ERR; } DataSet_Coords* CRD = (DataSet_Coords*)State.DSL().FindCoordsSet( setname ); if (CRD == 0) { mprinterr("Error: %s: No COORDS set with name %s found.\n", argIn.Command(), setname.c_str()); return CpptrajState::ERR; } mprintf("\tUsing set '%s'\n", CRD->legend()); // Start, stop, offset TrajFrameCounter frameCount; ArgList crdarg( argIn.GetStringKey("crdframes"), "," ); if (frameCount.CheckFrameArgs( CRD->Size(), crdarg )) return CpptrajState::ERR; frameCount.PrintInfoLine(CRD->legend()); ArgList actionargs = argIn.RemainingArgs(); actionargs.MarkArg(0); Cmd const& cmd = Command::SearchTokenType( DispatchObject::ACTION, actionargs.Command() ); if ( cmd.Empty() ) return CpptrajState::ERR; Action* act = (Action*)cmd.Alloc(); if (act == 0) return CpptrajState::ERR; CpptrajState::RetType err = DoCrdAction(State, actionargs, CRD, act, frameCount); delete act; return err; }
// Exec_CrdAction::Execute() Exec::RetType Exec_CrdAction::Execute(CpptrajState& State, ArgList& argIn) { # ifdef MPI Exec::RetType ret = CpptrajState::OK; int err = 0; // Create a communicator that just contains the master. int ID = MPI_UNDEFINED; if (Parallel::TrajComm().IsNull()) { if (Parallel::World().Master()) ID = 0; } else if (Parallel::TrajComm().Master()) ID = Parallel::World().Rank(); //rprintf("DEBUG: About to create new comm, ID= %i\n", ID); trajComm_ = Parallel::World().Split( ID ); if (ID != MPI_UNDEFINED) { mprintf("Warning: '%s' command does not yet use multiple MPI threads.\n", argIn.Command()); ret = ProcessArgs(State, argIn); if (ret != CpptrajState::OK) err = 1; } trajComm_.Reset(); if (Parallel::World().CheckError( err )) ret = CpptrajState::ERR; return ret; # else return (ProcessArgs(State, argIn)); # endif }
Exec::RetType Exec_CrdAction::DoCrdAction(CpptrajState& State, ArgList& actionargs, DataSet_Coords* CRD, Action* act, TrajFrameCounter const& frameCount) const { Timer total_time; total_time.Start(); # ifdef MPI ActionInit state(State.DSL(), State.DFL(), trajComm_); # else ActionInit state(State.DSL(), State.DFL()); # endif if ( act->Init( actionargs, state, State.Debug() ) != Action::OK ) return CpptrajState::ERR; actionargs.CheckForMoreArgs(); // Set up frame and parm for COORDS. ActionSetup originalSetup( CRD->TopPtr(), CRD->CoordsInfo(), CRD->Size() ); Frame originalFrame = CRD->AllocateFrame(); ActionFrame frm( &originalFrame, 0 ); // Set up for this topology Action::RetType setup_ret = act->Setup( originalSetup ); if ( setup_ret == Action::ERR || setup_ret == Action::SKIP ) return CpptrajState::ERR; // Loop over all frames in COORDS. ProgressBar progress( frameCount.TotalReadFrames() ); int set = 0; for (int frame = frameCount.Start(); frame < frameCount.Stop(); frame += frameCount.Offset(), ++set) { progress.Update( set ); CRD->GetFrame( frame, originalFrame ); frm.SetTrajoutNum( set ); Action::RetType ret = act->DoAction( set, frm ); if (ret == Action::ERR) { mprinterr("Error: crdaction: Frame %i, set %i\n", frame + 1, set + 1); break; } // Check if frame was modified. If so, update COORDS. if ( ret == Action::MODIFY_COORDS ) CRD->SetCRD( frame, frm.Frm() ); } # ifdef MPI act->SyncAction(); # endif // Check if parm was modified. If so, update COORDS. if ( setup_ret == Action::MODIFY_TOPOLOGY ) { mprintf("Info: crdaction: Parm for %s was modified by action %s\n", CRD->legend(), actionargs.Command()); CRD->CoordsSetup( originalSetup.Top(), originalSetup.CoordInfo() ); } act->Print(); State.MasterDataFileWrite(); total_time.Stop(); mprintf("TIME: Total action execution time: %.4f seconds.\n", total_time.Total()); return CpptrajState::OK; }
// Exec_Analyze::Execute() Exec::RetType Exec_Analyze::Execute(CpptrajState& State, ArgList& argIn) { // Remove 'analyze' ArgList arg = argIn; arg.RemoveFirstArg(); if (arg.empty()) { mprinterr("Error: No analysis command specified.\n"); return CpptrajState::ERR; } mprintf("Warning: The 'analyze' prefix is no longer necessary and may be soon deprecated.\n"); if (arg.CommandIs("matrix")) mprintf("Warning: NOTE: 'analyze matrix' is now 'diagmatrix'.\n"); else mprintf("Warning: To add an analysis command the the queue, only the command name needs\n" "Warning: to be specified, e.g. '%s <args>'.\n", arg.Command()); Cmd const& cmd = Command::SearchTokenType(DispatchObject::ANALYSIS, arg.Command()); if (cmd.Empty()) { mprinterr("Error: Analysis command '%s' not found.\n", arg.Command()); return CpptrajState::ERR; } return State.AddToAnalysisQueue( (Analysis*)cmd.Alloc(), arg ); }
/** Add specified analysis to the analysis list with given args and * DataSetList. */ int AnalysisList::AddAnalysis(DispatchObject::DispatchAllocatorType Alloc, ArgList& argIn, DataSetList* DSLin, DataFileList* DFLin) { Analysis* ana = (Analysis*)Alloc(); // Attempt to set up analysis if (ana->Setup( argIn, DSLin, DFLin, debug_) != Analysis::OK) { mprinterr("Error: Could not setup analysis [%s]\n", argIn.Command()); delete ana; return 1; } analysisList_.push_back( ana ); analysisCmd_.push_back( argIn.ArgLine() ); analysisStatus_.push_back( SETUP ); if (argIn.CheckForMoreArgs()) return 1; return 0; }
Exec::RetType Exec_ParmStrip::Execute(CpptrajState& State, ArgList& argIn) { Topology* parm = State.DSL().GetTopByIndex( argIn ); if (parm == 0) return CpptrajState::ERR; // Check if this topology has already been used to set up an input // trajectory, as this will break the traj read. bool topology_in_use = false; const char* fname = 0; for (TrajinList::trajin_it tIn = State.InputTrajList().trajin_begin(); tIn != State.InputTrajList().trajin_end(); ++tIn) if ( (*tIn)->Traj().Parm() == parm ) { topology_in_use = true; fname = (*tIn)->Traj().Filename().full(); break; } if (!topology_in_use) { for (TrajinList::ensemble_it eIn = State.InputTrajList().ensemble_begin(); eIn != State.InputTrajList().ensemble_end(); ++eIn) if ( (*eIn)->Traj().Parm() == parm ) { topology_in_use = true; fname = (*eIn)->Traj().Filename().full(); break; } } if (topology_in_use) { mprinterr("Error: Topology '%s' has already been used to set up trajectory '%s'.\n" "Error: To strip this topology use the 'strip' action.\n", parm->c_str(), fname); return CpptrajState::ERR; } AtomMask tempMask( argIn.GetMaskNext() ); // Since want to keep atoms outside mask, invert selection tempMask.InvertMaskExpression(); if (parm->SetupIntegerMask( tempMask )) return CpptrajState::ERR; mprintf("\tStripping atoms in mask [%s] (%i) from %s\n",tempMask.MaskString(), parm->Natom() - tempMask.Nselected(), parm->c_str()); Topology* tempParm = parm->modifyStateByMask(tempMask); if (tempParm==0) { mprinterr("Error: %s: Could not strip parm.\n", argIn.Command()); return CpptrajState::ERR; } else { // Replace parm with stripped version *parm = *tempParm; parm->Brief("Stripped parm:"); delete tempParm; } return CpptrajState::OK; }
/** Add specified analysis to the analysis list with given args and * DataSetList. */ int AnalysisList::AddAnalysis(Analysis* anaIn, ArgList& argIn, AnalysisSetup& setup) { if (anaIn == 0) { mprinterr("Internal Error: AddAnalysis() called with null Analysis.\n"); return 1; } AnaHolder ana; ana.ptr_ = anaIn; ana.args_ = argIn; // Attempt to set up analysis if (ana.ptr_->Setup( argIn, setup, debug_) != Analysis::OK) { mprinterr("Error: Could not setup analysis [%s]\n", argIn.Command()); delete ana.ptr_; return 1; } ana.status_ = SETUP; analysisList_.push_back( ana ); if (argIn.CheckForMoreArgs()) return 1; return 0; }
// ActionList::AddAction() int ActionList::AddAction(DispatchObject::DispatchAllocatorType Alloc, ArgList& argIn, TopologyList* PFL, DataSetList* DSL, DataFileList* DFL) { int err = 0; if (actionsAreSilent_) SetWorldSilent( true ); Action* act = (Action*)Alloc(); // Attempt to initialize action if ( act->Init( argIn, PFL, DSL, DFL, debug_ ) != Action::OK ) { mprinterr("Error: Could not initialize action [%s]\n", argIn.Command()); delete act; err = 1; } else { actionlist_.push_back( act ); actioncmd_.push_back( argIn.ArgLine() ); actionAlloc_.push_back( Alloc ); actionstatus_.push_back( INIT ); if (argIn.CheckForMoreArgs()) err = 1; } if (actionsAreSilent_) SetWorldSilent( false ); return err; }
Exec::RetType Exec_CrdAction::DoCrdAction(CpptrajState& State, ArgList& actionargs, DataSet_Coords* CRD, Action* act, TrajFrameCounter const& frameCount) const { Timer total_time; total_time.Start(); # ifdef MPI ActionInit state(State.DSL(), State.DFL(), trajComm_); # else ActionInit state(State.DSL(), State.DFL()); # endif if ( act->Init( actionargs, state, State.Debug() ) != Action::OK ) return CpptrajState::ERR; actionargs.CheckForMoreArgs(); // Set up frame and parm for COORDS. ActionSetup originalSetup( CRD->TopPtr(), CRD->CoordsInfo(), CRD->Size() ); Frame originalFrame = CRD->AllocateFrame(); // Set up for this topology Action::RetType setup_ret = act->Setup( originalSetup ); if ( setup_ret == Action::ERR || setup_ret == Action::SKIP ) return CpptrajState::ERR; // If the topology was modified, we will need a new COORDS set. DataSet_Coords* crdOut = 0; if ( setup_ret == Action::MODIFY_TOPOLOGY ) { // This will not work for a TRJ set. switch ( CRD->Type() ) { case DataSet::TRAJ : mprinterr("Error: Cannot modify TRAJ data sets.\n"); break; case DataSet::COORDS : crdOut = (DataSet_Coords*)new DataSet_Coords_CRD(); break; case DataSet::REF_FRAME : crdOut = (DataSet_Coords*)new DataSet_Coords_REF(); break; default: crdOut = 0; // SANITY } if (crdOut == 0) return CpptrajState::ERR; mprintf("Info: crdaction: COORDS set '%s' will be modified by action '%s'\n", CRD->legend(), actionargs.Command()); if (frameCount.TotalReadFrames() != (int)CRD->Size()) mprintf("Info: crdaction: Previous size= %zu, new size is %i\n", CRD->Size(), frameCount.TotalReadFrames()); // Set up set, copy original metadata crdOut->SetMeta( CRD->Meta() ); if (crdOut->CoordsSetup( originalSetup.Top(), originalSetup.CoordInfo() )) return CpptrajState::ERR; DataSet::SizeArray mfArray(1, frameCount.TotalReadFrames()); if (crdOut->Allocate( mfArray )) return CpptrajState::ERR; } // Loop over all frames in COORDS. ProgressBar* progress = 0; if (State.ShowProgress()) progress = new ProgressBar( frameCount.TotalReadFrames() ); int set = 0; for (int frame = frameCount.Start(); frame < frameCount.Stop(); frame += frameCount.Offset(), ++set) { // Since Frame can be modified by actions, save original and use currentFrame ActionFrame frm( &originalFrame, set ); if (progress != 0) progress->Update( set ); CRD->GetFrame( frame, originalFrame ); Action::RetType ret = act->DoAction( set, frm ); if (ret == Action::ERR) { mprinterr("Error: crdaction: Frame %i, set %i\n", frame + 1, set + 1); break; } // Check if frame was modified. If so, update COORDS. if ( ret == Action::MODIFY_COORDS ) { if (crdOut != 0) crdOut->AddFrame( frm.Frm() ); else CRD->SetCRD( frame, frm.Frm() ); } } if (progress != 0) delete progress; # ifdef MPI act->SyncAction(); # endif // If topology was modified, replace old set with new. if ( setup_ret == Action::MODIFY_TOPOLOGY ) { mprintf("Info: crdaction: Topology for '%s' was modified by action '%s'\n", CRD->legend(), actionargs.Command()); State.DSL().RemoveSet( CRD ); State.DSL().AddSet( crdOut ); } act->Print(); State.MasterDataFileWrite(); total_time.Stop(); mprintf("TIME: Total action execution time: %.4f seconds.\n", total_time.Total()); return CpptrajState::OK; }