/** Called every time a frame is read in. Calc RMSD. If not first and not * RefTraj SetRefStructure has already been called. When fitting, * SetRefStructure pre-centers the reference coordinates at the origin * and puts the translation from origin to reference in Trans[3-5]. */ Action::RetType Action_Rmsd::DoAction(int frameNum, Frame* currentFrame, Frame** frameAddress) { // Perform any needed reference actions ActionRef( *currentFrame, Fit(), UseMass() ); // Calculate RMSD double rmsdval = CalcRmsd( *currentFrame, SelectedRef(), RefTrans() ); rmsd_->Add(frameNum, &rmsdval); // ---=== Per Residue RMSD ===--- // Set reference and selected frame for each residue using the previously // set-up masks in refResMask and tgtResMask. Use SetFrame instead // of SetCoordinates since each residue can be a different size. if (perres_) { for (int N=0; N < NumResidues_; ++N) { if (!resIsActive_[N]) { //mprintf("DEBUG: [%4i] Not Active.\n",N); continue; } ResRefFrame_->SetFrame(RefFrame(), refResMask_[N]); ResFrame_->SetFrame(*currentFrame, tgtResMask_[N]); if (perrescenter_) { ResFrame_->CenterOnOrigin(false); ResRefFrame_->CenterOnOrigin(false); } double R = ResFrame_->RMSD_NoFit(*ResRefFrame_, UseMass()); //mprintf("DEBUG: [%4i] Res [%s] nofit RMSD to [%s] = %lf\n",N, // tgtResMask[N]->MaskString(),refResMask[N]->MaskString(),R); PerResRMSD_[N]->Add(frameNum, &R); } } if (Previous()) SetRefStructure( *currentFrame, Fit(), UseMass() ); return Action::OK; }
// 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; }