예제 #1
0
// ReferenceAction::InitRef()
int ReferenceAction::InitRef(bool previousIn, bool firstIn, bool massIn, bool fitIn,
                             std::string const& reftrajname, ReferenceFrame const& REF, 
                             Topology* RefParm, std::string const& refmaskIn, 
                             ArgList& actionArgs, const char* call)
{
  refmode_ = UNKNOWN_REF;
  previous_ = previousIn;
  if (firstIn || previous_)
    refmode_ = FIRST;
  else {
    if (REF.error()) return 1; 
    if (REF.empty()) {
      if (!reftrajname.empty()) {
        if (RefParm == 0) {
          mprinterr("Error: %s: No parm found for reftraj %s. Make sure parm has been loaded.\n",
                    call, reftrajname.c_str());
          return 1;
        }
        refmode_ = REFTRAJ;
      } else {
        // No reference keywords specified. Default to first.
        mprintf("Warning: %s: No reference structure given. Defaulting to first.\n",call);
        refmode_ = FIRST;
      }
    } else
      refmode_ = REFFRAME;
  }
  // Set the reference mask expression
  refMask_.SetMaskString(refmaskIn);
  // Initialize reference if not 'first'
  if (refmode_ != FIRST) {
    if ( !reftrajname.empty() ) {
      // Reference trajectory
      if (SetRefMask( *RefParm, call )!=0) return 1;
      // Attempt to open reference traj.
      if (refTraj_.SetupTrajRead( reftrajname, actionArgs, RefParm)) {
        mprinterr("Error: %s: Could not set up reftraj %s\n", call, reftrajname.c_str());
        return 1;
      }
      refFrame_.SetupFrameV(RefParm->Atoms(), refTraj_.TrajCoordInfo());
      if (refTraj_.BeginTraj()) {
        mprinterr("Error: %s: Could not open reftraj %s\n", call, reftrajname.c_str());
        return 1;
      }
    } else {
      // Reference Frame
      if (SetRefMask( REF.Parm(), call ) != 0) return 1;
      SetRefStructure( REF.Coord(), fitIn, massIn );
    }
  }
  // Set reference mode string
  if (previous_)
    modeString_ = "previous frame";
  else if (refmode_ == FIRST)
    modeString_ = "first frame";
  else if (refmode_==REFTRAJ)
    modeString_ = "trajectory " + refTraj_.Traj().Filename().Full();
  else // REFFRAME
    modeString_ = "\"" + REF.RefName() + "\"";
  modeString_ += " (" + refMask_.MaskExpression() + ")";

  return 0;
}