// Action_Distance::Init() Action::RetType Action_Distance::Init(ArgList& actionArgs, ActionInit& init, int debugIn) { AssociatedData_NOE noe; // Get Keywords image_.InitImaging( !(actionArgs.hasKey("noimage")) ); useMass_ = !(actionArgs.hasKey("geom")); DataFile* outfile = init.DFL().AddDataFile( actionArgs.GetStringKey("out"), actionArgs ); MetaData::scalarType stype = MetaData::UNDEFINED; std::string stypename = actionArgs.GetStringKey("type"); if ( stypename == "noe" ) { stype = MetaData::NOE; if (noe.NOE_Args( actionArgs )) return Action::ERR; } // Get Masks std::string mask1 = actionArgs.GetMaskNext(); std::string mask2 = actionArgs.GetMaskNext(); if (mask1.empty() || mask2.empty()) { mprinterr("Error: distance requires 2 masks\n"); return Action::ERR; } Mask1_.SetMaskString(mask1); Mask2_.SetMaskString(mask2); // Dataset to store distances TODO store masks in data set? dist_ = init.DSL().AddSet(DataSet::DOUBLE, MetaData(actionArgs.GetStringNext(), MetaData::M_DISTANCE, stype), "Dis"); if (dist_==0) return Action::ERR; if ( stype == MetaData::NOE ) { dist_->AssociateData( &noe ); dist_->SetLegend(Mask1_.MaskExpression() + " and " + Mask2_.MaskExpression()); } // Add dataset to data file if (outfile != 0) outfile->AddDataSet( dist_ ); mprintf(" DISTANCE: %s to %s",Mask1_.MaskString(), Mask2_.MaskString()); if (!image_.UseImage()) mprintf(", non-imaged"); if (useMass_) mprintf(", center of mass"); else mprintf(", geometric center"); mprintf(".\n"); return Action::OK; }
// Exec_DataSetCmd::ChangeModeType() Exec::RetType Exec_DataSetCmd::ChangeModeType(CpptrajState const& State, ArgList& argIn) { std::string modeKey = argIn.GetStringKey("mode"); std::string typeKey = argIn.GetStringKey("type"); if (modeKey.empty() && typeKey.empty()) { mprinterr("Error: No valid keywords specified.\n"); return CpptrajState::ERR; } // First determine mode if specified. MetaData::scalarMode dmode = MetaData::UNKNOWN_MODE; if (!modeKey.empty()) { dmode = MetaData::ModeFromKeyword( modeKey ); if (dmode == MetaData::UNKNOWN_MODE) { mprinterr("Error: Invalid mode keyword '%s'\n", modeKey.c_str()); return CpptrajState::ERR; } } // Next determine type if specified. MetaData::scalarType dtype = MetaData::UNDEFINED; if (!typeKey.empty()) { dtype = MetaData::TypeFromKeyword( typeKey, dmode ); if (dtype == MetaData::UNDEFINED) { mprinterr("Error: Invalid type keyword '%s'\n", typeKey.c_str()); return CpptrajState::ERR; } } // Additional options for type 'noe' AssociatedData_NOE noeData; if (dtype == MetaData::NOE) { if (noeData.NOE_Args(argIn)) return CpptrajState::ERR; } if (dmode != MetaData::UNKNOWN_MODE) mprintf("\tDataSet mode = %s\n", MetaData::ModeString(dmode)); if (dtype != MetaData::UNDEFINED) mprintf("\tDataSet type = %s\n", MetaData::TypeString(dtype)); // Loop over all DataSet arguments std::string ds_arg = argIn.GetStringNext(); while (!ds_arg.empty()) { DataSetList dsl = State.DSL().GetMultipleSets( ds_arg ); for (DataSetList::const_iterator ds = dsl.begin(); ds != dsl.end(); ++ds) { if (dmode != MetaData::UNKNOWN_MODE) { // Warn if mode does not seem appropriate for the data set type. if ( dmode >= MetaData::M_DISTANCE && dmode <= MetaData::M_RMS && (*ds)->Group() != DataSet::SCALAR_1D ) mprintf("Warning: '%s': Expected scalar 1D data set type for mode '%s'\n", (*ds)->legend(), MetaData::ModeString(dmode)); else if ( dmode == MetaData::M_VECTOR && (*ds)->Type() != DataSet::VECTOR ) mprintf("Warning: '%s': Expected vector data set type for mode '%s'\n", (*ds)->legend(), MetaData::ModeString(dmode)); else if ( dmode == MetaData::M_MATRIX && (*ds)->Group() != DataSet::MATRIX_2D ) mprintf("Warning: '%s': Expected 2D matrix data set type for mode '%s'\n", (*ds)->legend(), MetaData::ModeString(dmode)); } if ( dtype == MetaData::NOE ) (*ds)->AssociateData( &noeData ); mprintf("\t\t'%s'\n", (*ds)->legend()); MetaData md = (*ds)->Meta(); md.SetScalarMode( dmode ); md.SetScalarType( dtype ); (*ds)->SetMeta( md ); } ds_arg = argIn.GetStringNext(); } return CpptrajState::OK; }