/** Attempt to set up all actions in the action list with the given parm * If an action cannot be set up skip it. */ int ActionList::SetupActions(Topology **ParmAddress) { if (actionlist_.empty()) return 0; Topology *OriginalParm = *ParmAddress; mprintf(".....................................................\n"); mprintf("ACTION SETUP FOR PARM '%s' (%zu actions):\n",(*ParmAddress)->c_str(),actionlist_.size()); if (actionsAreSilent_) SetWorldSilent( true ); unsigned int actnum = 0; for (Aarray::iterator act = actionlist_.begin(); act != actionlist_.end(); ++act) { // Only attempt to set up action if active if (actionstatus_[actnum] != INACTIVE) { mprintf(" %u: [%s]\n", actnum, actioncmd_[actnum].c_str()); actionstatus_[actnum] = SETUP; Action::RetType err = (*act)->Setup(*ParmAddress, ParmAddress); if (err == Action::ERR) { mprintf("Warning: Setup failed for [%s]: Skipping\n", actioncmd_[actnum].c_str()); // Reset action status to INIT (pre-setup) actionstatus_[actnum] = INIT; } else if (err == Action::USEORIGINALFRAME) { *ParmAddress = OriginalParm; } } ++actnum; } if (actionsAreSilent_) SetWorldSilent( false ); 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; }
/** Process a mask from the command line. */ int Cpptraj::ProcessMask( Sarray const& topFiles, Sarray const& refFiles, std::string const& maskexpr, bool verbose, bool residue ) const { SetWorldSilent(true); if (topFiles.empty()) { mprinterr("Error: No topology file specified.\n"); return 1; } ParmFile pfile; Topology parm; if (pfile.ReadTopology(parm, topFiles[0], State_.Debug())) return 1; if (!refFiles.empty()) { DataSet_Coords_REF refCoords; if (refCoords.LoadRefFromFile( refFiles[0], parm, State_.Debug())) return 1; parm.SetDistMaskRef( refCoords.RefFrame() ); } if (!verbose) { AtomMask tempMask( maskexpr ); if (parm.SetupIntegerMask( tempMask )) return 1; loudPrintf("Selected="); if (residue) { int res = -1; for (AtomMask::const_iterator atom = tempMask.begin(); atom != tempMask.end(); ++atom) { if (parm[*atom].ResNum() > res) { loudPrintf(" %i", parm[*atom].ResNum()+1); res = parm[*atom].ResNum(); } } } else for (AtomMask::const_iterator atom = tempMask.begin(); atom != tempMask.end(); ++atom) loudPrintf(" %i", *atom + 1); loudPrintf("\n"); } else { if (residue) parm.PrintResidueInfo( maskexpr ); else parm.PrintAtomInfo( maskexpr ); } return 0; }
/** Read command line args. */ Cpptraj::Mode Cpptraj::ProcessCmdLineArgs(int argc, char** argv) { bool hasInput = false; bool interactive = false; Sarray inputFiles; Sarray topFiles; Sarray trajinFiles; Sarray trajoutFiles; Sarray refFiles; for (int i = 1; i < argc; i++) { std::string arg(argv[i]); if ( arg == "--help" || arg == "-h" ) { // --help, -help: Print usage and exit SetWorldSilent(true); Usage(); return QUIT; } if ( arg == "-V" || arg == "--version" ) { // -V, --version: Print version number and exit SetWorldSilent( true ); loudPrintf("CPPTRAJ: Version %s\n", CPPTRAJ_VERSION_STRING); return QUIT; } if ( arg == "--internal-version" ) { // --internal-version: Print internal version number and quit. SetWorldSilent( true ); loudPrintf("CPPTRAJ: Internal version # %s\n", CPPTRAJ_INTERNAL_VERSION); return QUIT; } if ( arg == "--defines" ) { // --defines: Print information on compiler defines used and exit SetWorldSilent( true ); loudPrintf("Compiled with:"); loudPrintf("%s\n", Cpptraj::Defines().c_str()); return QUIT; } if (arg == "-tl") { // -tl: Trajectory length if (topFiles.empty()) { mprinterr("Error: No topology file specified.\n"); return ERROR; } SetWorldSilent( true ); if (State_.TrajLength( topFiles[0], trajinFiles )) return ERROR; return QUIT; } if ( arg == "--interactive" ) interactive = true; else if ( arg == "-debug" && i+1 != argc) { // -debug: Set overall debug level ArgList dbgarg( argv[++i] ); State_.SetListDebug( dbgarg ); } else if ( arg == "--log" && i+1 != argc) // --log: Set up log file for interactive mode logfilename_ = argv[++i]; else if ( arg == "-p" && i+1 != argc) { // -p: Topology file topFiles.push_back( argv[++i] ); } else if ( arg == "-y" && i+1 != argc) { // -y: Trajectory file in trajinFiles.push_back( argv[++i] ); } else if ( arg == "-x" && i+1 != argc) { // -x: Trajectory file out trajoutFiles.push_back( argv[++i] ); } else if ( arg == "-c" && i+1 != argc) { // -c: Reference file refFiles.push_back( argv[++i] ); } else if (arg == "-i" && i+1 != argc) { // -i: Input file(s) inputFiles.push_back( argv[++i] ); } else if (arg == "-ms" && i+1 != argc) { // -ms: Parse mask string, print selected atom #s if (ProcessMask( topFiles, refFiles, std::string(argv[++i]), false, false )) return ERROR; return QUIT; } else if (arg == "-mr" && i+1 != argc) { // -mr: Parse mask string, print selected res #s if (ProcessMask( topFiles, refFiles, std::string(argv[++i]), false, true )) return ERROR; return QUIT; } else if (arg == "--mask" && i+1 != argc) { // --mask: Parse mask string, print selected atom details if (ProcessMask( topFiles, refFiles, std::string(argv[++i]), true, false )) return ERROR; return QUIT; } else if (arg == "--resmask" && i+1 != argc) { // --resmask: Parse mask string, print selected residue details if (ProcessMask( topFiles, refFiles, std::string(argv[++i]), true, true )) return ERROR; return QUIT; } else if ( i == 1 ) { // For backwards compatibility with PTRAJ; Position 1 = TOP file topFiles.push_back( argv[i] ); } else if ( i == 2 ) { // For backwards compatibility with PTRAJ; Position 2 = INPUT file inputFiles.push_back( argv[i] ); } else { // Unrecognized mprintf(" Unrecognized input on command line: %i: %s\n", i,argv[i]); Usage(); return ERROR; } } Cpptraj::Intro(); // Add all topology files specified on command line. for (Sarray::const_iterator topFilename = topFiles.begin(); topFilename != topFiles.end(); ++topFilename) if (State_.AddTopology( *topFilename, ArgList() )) return ERROR; // Add all reference trajectories specified on command line. for (Sarray::const_iterator refName = refFiles.begin(); refName != refFiles.end(); ++refName) if (State_.AddReference( *refName )) return ERROR; // Add all input trajectories specified on command line. for (Sarray::const_iterator trajinName = trajinFiles.begin(); trajinName != trajinFiles.end(); ++trajinName) if (State_.AddTrajin( *trajinName )) return ERROR; // Add all output trajectories specified on command line. if (!trajoutFiles.empty()) { hasInput = true; // This allows direct traj conversion with no other input for (Sarray::const_iterator trajoutName = trajoutFiles.begin(); trajoutName != trajoutFiles.end(); ++trajoutName) if (State_.AddOutputTrajectory( *trajoutName )) return ERROR; } // Process all input files specified on command line. if ( !inputFiles.empty() ) { hasInput = true; for (Sarray::const_iterator inputFilename = inputFiles.begin(); inputFilename != inputFiles.end(); ++inputFilename) { Command::RetType c_err = Command::ProcessInput( State_, *inputFilename ); if (c_err == Command::C_ERR && State_.ExitOnError()) return ERROR; if (c_err == Command::C_QUIT) return QUIT; } } // Determine whether to enter interactive mode if (!hasInput || interactive) { // Test if input is really from a console if ( isatty(fileno(stdin)) ) return INTERACTIVE; else { // "" means read from STDIN Command::RetType c_err = Command::ProcessInput( State_, "" ); if (c_err == Command::C_ERR && State_.ExitOnError()) return ERROR; if (c_err == Command::C_QUIT) return QUIT; } } return BATCH; }
// ----- M A I N --------------------------------------------------------------- int main(int argc, char** argv) { SetWorldSilent(true); // No STDOUT output from cpptraj routines. std::string topname, crdname, title, bres, pqr, sybyltype, writeconect; std::string aatm(" pdbatom"), ter_opt(" terbyres"), box(" sg \"P 1\""); TrajectoryFile::TrajFormatType fmt = TrajectoryFile::PDBFILE; bool ctr_origin = false; bool useExtendedInfo = false; int res_offset = 0; int debug = 0; int numSoloArgs = 0; for (int i = 1; i < argc; ++i) { std::string arg( argv[i] ); if (arg == "-p" && i+1 != argc && topname.empty()) // Topology topname = std::string( argv[++i] ); else if (arg == "-c" && i+1 != argc && crdname.empty()) // Coords crdname = std::string( argv[++i] ); else if (arg == "-tit" && i+1 != argc && title.empty()) // Title title = " title " + std::string( argv[++i] ); else if (arg == "-offset" && i+1 != argc) // Residue # offset res_offset = convertToInteger( argv[++i] ); else if ((arg == "-d" || arg == "--debug") && i+1 != argc) // Debug level debug = convertToInteger( argv[++i] ); else if (arg == "-h" || arg == "--help") { // Help Help(argv[0], true); return 0; } else if (arg == "-v" || arg == "--version") { // Version info WriteVersion(); return 0; } else if (arg == "-aatm") // Amber atom names, include extra pts aatm.assign(" include_ep"); else if (arg == "-sybyl") // Amber atom types to SYBYL sybyltype.assign(" sybyltype"); else if (arg == "-conect") // Write CONECT records from bond info writeconect.assign(" conect"); else if (arg == "-ep") // PDB atom names, include extra pts aatm.append(" include_ep"); else if (arg == "-bres") // PDB residue names bres.assign(" pdbres"); else if (arg == "-ext") // Use extended PDB info from Topology useExtendedInfo = true; else if (arg == "-ctr") // Center on origin ctr_origin = true; else if (arg == "-noter") // No TER cards ter_opt.assign(" noter"); else if (arg == "-nobox") // No CRYST1 record box.assign(" nobox"); else if (arg == "-pqr") { // Charge/Radii in occ/bfactor cols pqr.assign(" dumpq"); ++numSoloArgs; } else if (arg == "-mol2") { // output as mol2 fmt = TrajectoryFile::MOL2FILE; ++numSoloArgs; } else if (Unsupported(arg)) { mprinterr("Error: Option '%s' is not yet supported.\n\n", arg.c_str()); return 1; } else { mprinterr("Error: Unrecognized option '%s'\n", arg.c_str()); Help(argv[0], false); return 1; } } if (debug > 0) WriteVersion(); // Check command line for errors. if (topname.empty()) topname.assign("prmtop"); if (debug > 0 && crdname.empty()) mprinterr("| Reading Amber restart from STDIN\n"); if (numSoloArgs > 1) { mprinterr("Error: Only one alternate output format option may be specified (found %i)\n", numSoloArgs); Help(argv[0], true); return 1; } if (!sybyltype.empty() && fmt != TrajectoryFile::MOL2FILE) { mprinterr("Warning: -sybyl is only valid for MOL2 file output.\n"); sybyltype.clear(); } if (debug > 0) { mprinterr("Warning: debug is %i; debug info will be written to STDOUT.\n", debug); SetWorldSilent(false); } // Topology ParmFile pfile; Topology parm; if (pfile.ReadTopology(parm, topname, debug)) { if (topname == "prmtop") Help(argv[0], false); return 1; } if (!useExtendedInfo) parm.ResetPDBinfo(); if (res_offset != 0) for (int r = 0; r < parm.Nres(); r++) parm.SetRes(r).SetOriginalNum( parm.Res(r).OriginalResNum() + res_offset ); ArgList trajArgs; // Input coords Frame TrajFrame; CoordinateInfo cInfo; if (!crdname.empty()) { Trajin_Single trajin; if (trajin.SetupTrajRead(crdname, trajArgs, &parm)) return 1; cInfo = trajin.TrajCoordInfo(); TrajFrame.SetupFrameV(parm.Atoms(), cInfo); trajin.BeginTraj(); if (trajin.ReadTrajFrame(0, TrajFrame)) return 1; trajin.EndTraj(); } else { // Assume Amber restart from STDIN // Check that input is from a redirect. if ( isatty(fileno(stdin)) ) { mprinterr("Error: No coordinates specified with '-c' and no STDIN '<'.\n"); return 1; } Traj_AmberRestart restartIn; restartIn.SetDebug( debug ); //restartIn.processReadArgs( trajArgs ); int total_frames = restartIn.setupTrajin("", &parm); if (total_frames < 1) return 1; cInfo = restartIn.CoordInfo(); TrajFrame.SetupFrameV(parm.Atoms(), cInfo); if (restartIn.openTrajin()) return 1; if (restartIn.readFrame(0, TrajFrame)) return 1; restartIn.closeTraj(); } if (ctr_origin) TrajFrame.CenterOnOrigin(false); // Output coords Trajout_Single trajout; trajArgs.SetList( aatm + bres + pqr + title + ter_opt + box + sybyltype + writeconect, " " ); if ( trajout.PrepareStdoutTrajWrite(trajArgs, &parm, cInfo, 1, fmt) ) return 1; trajout.WriteSingle(0, TrajFrame); trajout.EndTraj(); return 0; }