From 89f6029695d817b6d1e0630ab3c4e04656af31a0 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 10:14:58 -0400 Subject: [PATCH 01/27] DRR - Cpptraj: Start adding code for selection of molecules by mask. Modify ArgList::ArgIsMask so that it looks for characters which are valid to start masks, not just mask characters in a string. --- src/ArgList.cpp | 21 +++++++++++-- src/MaskToken.cpp | 75 ++++++++++++++++++++++++++++++++--------------- src/MaskToken.h | 8 ++--- 3 files changed, 75 insertions(+), 29 deletions(-) diff --git a/src/ArgList.cpp b/src/ArgList.cpp index dd264d8c1b..45a7dc81b3 100644 --- a/src/ArgList.cpp +++ b/src/ArgList.cpp @@ -238,8 +238,25 @@ std::string const& ArgList::GetStringNext() { /** \return true if argument at position is a potential mask. */ bool ArgList::ArgIsMask(unsigned int pos) const { - size_t found = arglist_[pos].find_first_of(":@*"); - return (found != std::string::npos); + std::string::const_iterator p = arglist_[pos].begin(); + // Advance past any negate operator or open parentheses. Assume token not empty. + while (*p == '!' || *p == '(') { + ++p; + if (p == arglist_[pos].end()) return false; + } + // Determine if character could start a mask expression. + bool isMask; + switch ( *p ) { + case '@': + case ':': + case '^': + case '*': + case '=': isMask = true; break; + default : isMask = false; + } + return isMask; + //size_t found = arglist_[pos].find_first_of(":@*"); + //return (found != std::string::npos); } // ArgList::GetMaskNext() diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 3481a981c2..19d91c3c5d 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -18,8 +18,8 @@ MaskToken::MaskToken() : { } const char* MaskToken::MaskTypeString[] = { - "OP_NONE", "ResNum", "ResName", "AtomNum", "AtomName", "AtomType", "AtomElement", "SelectAll", - "OP_AND", "OP_OR", "OP_NEG", "OP_DIST" + "OP_NONE", "ResNum", "ResName", "AtomNum", "AtomName", "AtomType", "AtomElement", "MolNum", + "SelectAll", "OP_AND", "OP_OR", "OP_NEG", "OP_DIST" }; void MaskToken::Print() const { @@ -27,6 +27,7 @@ void MaskToken::Print() const { switch (type_) { case ResName: case AtomName: mprintf(" Name=[%s]",*name_); break; + case MolNum: case ResNum: case AtomNum: mprintf(" First=%i Second=%i",res1_,res2_); break; case OP_DIST: @@ -43,15 +44,19 @@ void MaskToken::Print() const { (int)d_within_, (int)d_atom_, distance_);*/ } -const char *MaskToken::TypeName() const { - return MaskTypeString[type_]; -} +const char *MaskToken::TypeName() const { return MaskTypeString[type_]; } -void MaskToken::MakeNameType() { +/** Convert number type to name type if possible. */ +int MaskToken::MakeNameType() { if (type_ == ResNum) type_ = ResName; else if (type_ == AtomNum) type_ = AtomName; + else if (type_ == MolNum) { + mprinterr("Internal Error: Molecule name not yet supported.\n"); + return 1; + } + return 0; } /** Basic : or @ operand. */ @@ -69,20 +74,20 @@ int MaskToken::SetToken( MaskTokenType typeIn, std::string const& tokenString ) type_ = SelectAll; return 0; } else { - MakeNameType(); + if (MakeNameType()) return 1; } } // Check that all chars are digits or - for number range - if (type_ == ResNum || type_ == AtomNum) { + if (type_ == ResNum || type_ == AtomNum || type_ == MolNum) { for (std::string::const_iterator p = tokenString.begin(); p != tokenString.end(); ++p) { if (*p != '-' && isalpha(*p, loc)) { //mprintf("DEBUG: making name type because of %c\n",*p); - MakeNameType(); + if (MakeNameType()) return 1; break; } } } - if (type_ == ResNum || type_ == AtomNum) { + if (type_ == ResNum || type_ == AtomNum || type_ == MolNum) { // Does this token argument have a dash? Only valid for number ranges. size_t dashPosition = tokenString.find_first_of("-"); if (dashPosition != std::string::npos) { @@ -163,8 +168,9 @@ int MaskToken::SetDistance(std::string &distop) { // ============================================================================= // Class: MaskTokenArray -MaskTokenArray::MaskTokenArray() : debug_(0) {} +MaskTokenArray::MaskTokenArray() : debug_(10) {} +// TODO include parentheses? bool MaskTokenArray::IsOperator(char op) { if (op=='!') return true; if (op=='&') return true; @@ -200,7 +206,7 @@ int MaskTokenArray::OperatorPriority(char op) { if (op == '(') return(2); if (op == '_') return(1); - mprinterr("OperatorPriority(): unknown operator ==%c== on stack when processing atom mask",op); + mprinterr("OperatorPriority(): unknown operator '%c' on stack when processing atom mask",op); return(0); } @@ -245,10 +251,11 @@ int MaskTokenArray::Tokenize() { std::string postfix; std::stack Stack; - // 0 means new operand or operand was just completed, and terminated with ']', - // 1 means operand with ":" read, - // 2 means operand with "@" read + // 0 means new operand or operand was just completed, and terminated with ']'. + // 1 means operand with ":" read. + // 2 means operand with "@" read. // 3 means '<' or '>' read, waiting for numbers. + // 4 means operand with "^" read. int flag = 0; for (std::string::iterator p = maskExpression_.begin(); p != maskExpression_.end(); p++) @@ -257,6 +264,7 @@ int MaskTokenArray::Tokenize() { if ( isspace(*p, loc) ) continue; if ( IsOperator(*p) || *p == '(' || *p == ')' ) { + mprintf("DEBUG: Operator or parentheses: %c\n", *p); if (flag > 0) { buffer += "])"; flag = 0; @@ -277,7 +285,8 @@ int MaskTokenArray::Tokenize() { return 1; } } - } else if ( IsOperand(*p) || isalnum(*p, loc) ) { + } else if ( IsOperand(*p) ) { + mprintf("DEBUG: Operand: %c\n", *p); if (flag==0) { buffer.assign("(["); flag = 1; @@ -296,6 +305,7 @@ int MaskTokenArray::Tokenize() { } buffer += *p; } else if ( *p == ':' ) { + // Residue character if (flag == 0) { buffer.assign("([:"); flag = 1; @@ -304,16 +314,28 @@ int MaskTokenArray::Tokenize() { flag = 1; } } else if ( *p == '@' ) { + // Atom character if (flag == 0) { buffer.assign("([@"); flag = 2; } else if (flag == 1) { + // Residue AND atom buffer += "]&[@"; flag = 2; } else if (flag == 2) { + // Atom OR Atom buffer += "])|([@"; flag = 2; } + } else if ( *p == '^' ) { + // Molecule character + if (flag == 0) { + buffer.assign("([^"); + flag = 4; + } else { + buffer += "])|([^"; + flag = 4; + } } else { mprinterr("Error: Tokenize: Unknown symbol (%c) expression when parsing atom mask [%s]\n", *p, maskExpression_.c_str()); @@ -331,7 +353,7 @@ int MaskTokenArray::Tokenize() { infix += "_"; if (debug_ > 0) - mprintf("DEBUG: NEW_INFIX ==%s==\n",infix.c_str()); + mprintf("DEBUG: NEW_INFIX: %s\n",infix.c_str()); // ----------------------------------- // Convert to RPN @@ -397,7 +419,7 @@ int MaskTokenArray::Tokenize() { } } // END for loop over infix if (debug_ > 0) - mprintf("DEBUG: NEW_POSTFIX ==%s==\n",postfix.c_str()); + mprintf("DEBUG: NEW_POSTFIX: %s\n",postfix.c_str()); // Convert to MaskTokens in same order. The postfix expression is composed // of operands enclosed within brackets, and single character operators. @@ -433,12 +455,17 @@ int MaskTokenArray::Tokenize() { // Determine type from first char. Default to Num; MaskToken::SetToken // will convert to Name if appropriate. MaskToken::MaskTokenType tokenType = MaskToken::OP_NONE; - if (buffer[0]==':') // Residue + if (buffer[0]==':') { + // Residue tokenType = MaskToken::ResNum; - else if (buffer[0]=='@') { // Atom + } else if (buffer[0]=='@') { + // Atom tokenType = MaskToken::AtomNum; if (buffer[1]=='%') tokenType = MaskToken::AtomType; else if (buffer[1]=='/') tokenType = MaskToken::AtomElement; + } else if (buffer[0]=='^') { + // Molecule + tokenType = MaskToken::MolNum; } if (tokenType==MaskToken::OP_NONE) { mprinterr("Error: Unrecognized token type.\n"); @@ -446,7 +473,9 @@ int MaskTokenArray::Tokenize() { return 1; } // Create new string without type character(s) - if (tokenType==MaskToken::ResNum || tokenType==MaskToken::AtomNum) + if (tokenType==MaskToken::ResNum || + tokenType==MaskToken::AtomNum || + tokenType==MaskToken::MolNum) tokenString.assign( buffer.begin()+1, buffer.end() ); else tokenString.assign( buffer.begin()+2, buffer.end() ); @@ -470,7 +499,7 @@ int MaskTokenArray::Tokenize() { maskTokens_.back().SetOnStack(); } // operand is a part inside [...] - } else if ( IsOperand( *p ) || *p == ':' || *p == '@' || *p == '<' || *p == '>' ) { + } else if ( IsOperand( *p ) || *p == ':' || *p == '@' || *p == '^' || *p == '<' || *p == '>' ) { buffer += *p; // Operators } else if (*p == '!' ) { @@ -535,7 +564,7 @@ int MaskTokenArray::SetMaskString(const char* maskStringIn) { else maskExpression_.assign( "*" ); - if (debug_ > 0) mprintf("expression: ==%s==\n", maskExpression_.c_str()); + if (debug_ > 0) mprintf("expression: %s\n", maskExpression_.c_str()); // Convert mask expression to maskTokens if (Tokenize()) return 1; diff --git a/src/MaskToken.h b/src/MaskToken.h index b98745c7fc..e00069c8bb 100644 --- a/src/MaskToken.h +++ b/src/MaskToken.h @@ -6,8 +6,8 @@ class MaskToken { public: enum MaskTokenType { - OP_NONE=0, ResNum, ResName, AtomNum, AtomName, AtomType, AtomElement, SelectAll, - OP_AND, OP_OR, OP_NEG, OP_DIST + OP_NONE=0, ResNum, ResName, AtomNum, AtomName, AtomType, AtomElement, MolNum, + SelectAll, OP_AND, OP_OR, OP_NEG, OP_DIST }; MaskToken(); const char *TypeName() const; @@ -28,6 +28,8 @@ class MaskToken { private: static const char* MaskTypeString[]; + int MakeNameType(); + MaskTokenType type_; int res1_; int res2_; @@ -37,8 +39,6 @@ class MaskToken { bool d_within_; bool d_atom_; double distance_; - - void MakeNameType(); }; // ============================================================================= /// Hold an array of MaskTokens. Basis of all Mask classes. From 6ec9be6e6476c220bc9a89eaa0defc5eb207da42 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 10:20:02 -0400 Subject: [PATCH 02/27] DRR - Cpptraj: Add some notes on new ArgIsMask behavior --- src/ArgList.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ArgList.cpp b/src/ArgList.cpp index 45a7dc81b3..a593486c64 100644 --- a/src/ArgList.cpp +++ b/src/ArgList.cpp @@ -238,6 +238,13 @@ std::string const& ArgList::GetStringNext() { /** \return true if argument at position is a potential mask. */ bool ArgList::ArgIsMask(unsigned int pos) const { + //size_t found = arglist_[pos].find_first_of(":@*"); + //return (found != std::string::npos); + // NOTE: The below method is more rigorous but potentially allows more + // "bad" masks through as *. For example, with previous method above, + // 'select test@' fails with 'Tokenize: Wrong syntax' because 'test@' + // is treated as a mask, but with new method below 'test@' is ignored + // and 'select' assumes no mask present and selects all. std::string::const_iterator p = arglist_[pos].begin(); // Advance past any negate operator or open parentheses. Assume token not empty. while (*p == '!' || *p == '(') { @@ -255,8 +262,6 @@ bool ArgList::ArgIsMask(unsigned int pos) const { default : isMask = false; } return isMask; - //size_t found = arglist_[pos].find_first_of(":@*"); - //return (found != std::string::npos); } // ArgList::GetMaskNext() From c3fd23c5092e2e9b033e41d61e384b390ef0e79d Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 10:44:01 -0400 Subject: [PATCH 03/27] DRR - Cpptraj: Finish adding code to select atoms by molecule number. Update dependencies. --- src/AtomMask.cpp | 5 +++-- src/AtomMask.h | 2 +- src/CharMask.cpp | 5 +++-- src/CharMask.h | 2 +- src/MaskToken.cpp | 37 +++++++++++++++++++++++++++++++------ src/MaskToken.h | 7 +++++-- src/Topology.cpp | 12 ++++++------ src/cpptrajdepend | 12 ++++++------ 8 files changed, 56 insertions(+), 26 deletions(-) diff --git a/src/AtomMask.cpp b/src/AtomMask.cpp index 18b7a2f7a7..0f4a00ca9c 100644 --- a/src/AtomMask.cpp +++ b/src/AtomMask.cpp @@ -164,14 +164,15 @@ void AtomMask::PrintMaskAtoms(const char *header) const { * maskChar_ is used to determine whether atoms denoted by 'T' or 'F' will * be selected (the latter is the case e.g. with stripped atoms). */ -int AtomMask::SetupMask(AtomArrayT const& atoms, ResArrayT const& residues, const double* XYZ) +int AtomMask::SetupMask(AtomArrayT const& atoms, ResArrayT const& residues, + MolArrayT const& molecules, const double* XYZ) { // Set up an integer list of the selected atoms. // NOTE: For large selections this will use 4x the memory of the char atom // mask. Could check to see which will be bigger. Natom_ = (int)atoms.size(); Selected_.clear(); - char* charmask = ParseMask(atoms, residues, XYZ); + char* charmask = ParseMask(atoms, residues, molecules, XYZ); if (charmask == 0) return 1; for (int atom = 0; atom != Natom_; atom++) { if (charmask[atom] == maskChar_) diff --git a/src/AtomMask.h b/src/AtomMask.h index e92dd6d876..bb61750c32 100644 --- a/src/AtomMask.h +++ b/src/AtomMask.h @@ -63,7 +63,7 @@ class AtomMask : public MaskTokenArray { /// Print all mask atoms in to a line void PrintMaskAtoms(const char*) const; /// Set up integer mask based on current mask expression. - int SetupMask(AtomArrayT const&, ResArrayT const&, const double*); + int SetupMask(AtomArrayT const&, ResArrayT const&, MolArrayT const&, const double*); /// Reset atom mask void ResetMask(); /// Clear any selected atoms in mask. diff --git a/src/CharMask.cpp b/src/CharMask.cpp index 6c8ed772e3..b3696602f0 100644 --- a/src/CharMask.cpp +++ b/src/CharMask.cpp @@ -4,12 +4,13 @@ /** Given atom and residue info and coordinates, setup character mask * based on current mask tokens. */ -int CharMask::SetupMask(AtomArrayT const& atoms, ResArrayT const& residues, const double* XYZ) +int CharMask::SetupMask(AtomArrayT const& atoms, ResArrayT const& residues, + MolArrayT const& molecules, const double* XYZ) { CharMask_.clear(); nselected_ = 0; CharMask_.reserve( atoms.size() ); - char* charmask = ParseMask(atoms, residues, XYZ); + char* charmask = ParseMask(atoms, residues, molecules, XYZ); if (charmask == 0) return 1; for (unsigned int i = 0; i != atoms.size(); i++) { CharMask_.push_back( charmask[i] ); diff --git a/src/CharMask.h b/src/CharMask.h index bcdc10073f..6454b35094 100644 --- a/src/CharMask.h +++ b/src/CharMask.h @@ -27,7 +27,7 @@ class CharMask : public MaskTokenArray { /// Print all mask atoms in to a line void PrintMaskAtoms(const char*) const; /// Set up character mask based on current mask expression. - int SetupMask(AtomArrayT const&, ResArrayT const&, const double*); + int SetupMask(AtomArrayT const&, ResArrayT const&, MolArrayT const&, const double*); /// Reset atom mask void ResetMask(); /// Clear any selected atoms in mask. diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 19d91c3c5d..ff1c3b6ad9 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -598,8 +598,9 @@ char MaskTokenArray::UnselectedChar_ = 'F'; /** \return Array of char, same size as atoms_, with T for selected atoms and F otherwise. */ -char* MaskTokenArray::ParseMask(std::vector const& atoms_, - std::vector const& residues_, +char* MaskTokenArray::ParseMask(AtomArrayT const& atoms_, + ResArrayT const& residues_, + MolArrayT const& molecules_, const double* XYZ) const { std::stack Stack; @@ -633,6 +634,9 @@ char* MaskTokenArray::ParseMask(std::vector const& atoms_, case MaskToken::AtomElement : MaskSelectElements( atoms_, token->Name(), pMask ); break; + case MaskToken::MolNum : + MaskSelectMolecules( molecules_, token->Res1(), token->Res2(), pMask ); + break; case MaskToken::SelectAll : std::fill(pMask, pMask + atoms_.size(), SelectedChar_); break; @@ -869,8 +873,7 @@ void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues_, int res1, in //mprintf("\t\t\tSelecting residues %i to %i\n",res1,res2); // Check start atom. res1 and res2 are checked by MaskToken if (res1 > nres) { - if (debug_>0) - mprintf("Warning: Select residues: res 1 out of range (%i)\n",res1); + mprintf("Warning: Select residues: res 1 out of range (%i > %i)\n",res1, nres); return; } // If last res > nres, make it nres @@ -882,6 +885,29 @@ void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues_, int res1, in std::fill(mask + residues_[res1-1].FirstAtom(), mask + endatom, SelectedChar_); } +// Mask args expected to start from 1 +void MaskTokenArray::MaskSelectMolecules(MolArrayT const& molecules, int mol1, int mol2, + char* mask) const +{ + if (molecules.empty()) { + mprintf("Warning: No molecule information, cannot select by molecule.\n"); + return; + } + int endatom; + int nmol = (int)molecules.size(); + if (mol1 > nmol) { + mprintf("Warning: Select molecules: mol 1 out of range (%i > %i)\n", mol1, nmol); + return; + } + // If last mol > nmol, make it nmol + if ( mol2 >= nmol ) + endatom = molecules.back().EndAtom(); + else + endatom = molecules[mol2-1].EndAtom(); + // Select atoms + std::fill(mask + molecules[mol1-1].BeginAtom(), mask + endatom, SelectedChar_); +} + // MaskTokenArray::MaskSelectElements() void MaskTokenArray::MaskSelectElements(AtomArrayT const& atoms_, NameType const& element, char* mask ) const @@ -932,8 +958,7 @@ void MaskTokenArray::MaskSelectAtoms(AtomArrayT const& atoms_, int atom1, int at int startatom, endatom; //mprintf("\t\t\tSelecting atoms %i to %i\n",atom1,atom2); if (atom1 > (int)atoms_.size()) { - if (debug_>0) - mprintf("Warning: Select atoms: atom 1 out of range (%i)\n",atom1); + mprintf("Warning: Select atoms: atom 1 out of range (%i > %zu)\n",atom1, atoms_.size()); return; } startatom = atom1 - 1; diff --git a/src/MaskToken.h b/src/MaskToken.h index e00069c8bb..601c89d05b 100644 --- a/src/MaskToken.h +++ b/src/MaskToken.h @@ -2,6 +2,7 @@ #define INC_MASKTOKEN_H #include "Atom.h" #include "Residue.h" +#include "Molecule.h" /// Hold information used in mask selection. class MaskToken { public: @@ -46,6 +47,7 @@ class MaskTokenArray { public: typedef std::vector AtomArrayT; typedef std::vector ResArrayT; + typedef std::vector MolArrayT; MaskTokenArray(); // Virtual destructor since this will be inherited virtual ~MaskTokenArray() {} @@ -68,7 +70,7 @@ class MaskTokenArray { /// Print selected atoms to screen. virtual void PrintMaskAtoms(const char*) const = 0; /// Select atoms based on current MaskTokens given atom/residue info - virtual int SetupMask(AtomArrayT const&, ResArrayT const&, const double*) = 0; + virtual int SetupMask(AtomArrayT const&, ResArrayT const&, MolArrayT const&, const double*) = 0; /// Clear all mask information. virtual void ResetMask() = 0; /// Clear selected atoms only. @@ -83,7 +85,7 @@ class MaskTokenArray { protected: void ClearTokens() { maskTokens_.clear(); maskExpression_.clear(); } /// \return array of characters with selected atoms marked with SelectedChar_ - char* ParseMask(AtomArrayT const&, ResArrayT const&, const double*) const; + char* ParseMask(AtomArrayT const&, ResArrayT const&, MolArrayT const&, const double*) const; static char SelectedChar_; static char UnselectedChar_; private: @@ -104,6 +106,7 @@ class MaskTokenArray { void Mask_NEG(char *, unsigned int) const; void MaskSelectResidues(ResArrayT const&, NameType const&, char*) const; void MaskSelectResidues(ResArrayT const&, int, int, char*) const; + void MaskSelectMolecules(MolArrayT const&, int, int, char*) const; void MaskSelectElements(AtomArrayT const&, NameType const&, char*) const; void MaskSelectTypes(AtomArrayT const&, NameType const&, char*) const; void MaskSelectAtoms(AtomArrayT const&, NameType const&, char*) const; diff --git a/src/Topology.cpp b/src/Topology.cpp index 20ce71ec63..c564a7f20f 100644 --- a/src/Topology.cpp +++ b/src/Topology.cpp @@ -1037,24 +1037,24 @@ int Topology::SetSolventInfo() { // Topology::SetupIntegerMask() int Topology::SetupIntegerMask(AtomMask &mask) const { - return mask.SetupMask(atoms_, residues_, refCoords_.xAddress()); + return mask.SetupMask(atoms_, residues_, molecules_, refCoords_.xAddress()); } // Topology::SetupCharMask() int Topology::SetupCharMask(CharMask &mask) const { - return mask.SetupMask(atoms_, residues_, refCoords_.xAddress()); + return mask.SetupMask(atoms_, residues_, molecules_, refCoords_.xAddress()); } // Topology::SetupIntegerMask() int Topology::SetupIntegerMask(AtomMask &mask, Frame const& frame) const { - if (frame.empty()) return mask.SetupMask(atoms_, residues_, 0); - return mask.SetupMask(atoms_, residues_, frame.xAddress()); + if (frame.empty()) return mask.SetupMask(atoms_, residues_, molecules_, 0); + return mask.SetupMask(atoms_, residues_, molecules_, frame.xAddress()); } // Topology::SetupCharMask() int Topology::SetupCharMask(CharMask &mask, Frame const& frame) const { - if (frame.empty()) return mask.SetupMask(atoms_, residues_, 0); - return mask.SetupMask(atoms_, residues_, frame.xAddress()); + if (frame.empty()) return mask.SetupMask(atoms_, residues_, molecules_, 0); + return mask.SetupMask(atoms_, residues_, molecules_, frame.xAddress()); } // ----------------------------------------------------------------------------- diff --git a/src/cpptrajdepend b/src/cpptrajdepend index 98538e1797..8dd25a4779 100644 --- a/src/cpptrajdepend +++ b/src/cpptrajdepend @@ -124,14 +124,14 @@ Array1D.o : Array1D.cpp ArgList.h Array1D.h AssociatedData.h Atom.h AtomExtra.h AssociatedData.o : AssociatedData.cpp ArgList.h AssociatedData.h CpptrajStdio.h Atom.o : Atom.cpp Atom.h CpptrajStdio.h NameType.h AtomMap.o : AtomMap.cpp Atom.h AtomExtra.h AtomMap.h AtomMask.h Box.h CharMask.h CoordinateInfo.h CpptrajStdio.h FileName.h Frame.h MapAtom.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h Vec3.h -AtomMask.o : AtomMask.cpp Atom.h AtomMask.h CpptrajStdio.h MaskToken.h NameType.h Residue.h +AtomMask.o : AtomMask.cpp Atom.h AtomMask.h CpptrajStdio.h MaskToken.h Molecule.h NameType.h Residue.h AxisType.o : AxisType.cpp ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h AxisType.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSetList.h DataSet_1D.h DataSet_Coords.h DataSet_Coords_REF.h Dimension.h FileIO.h FileName.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h PDBfile.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h StringRoutines.h TextFormat.h Timer.h Topology.h TorsionRoutines.h Vec3.h BondSearch.o : BondSearch.cpp Atom.h AtomExtra.h AtomMask.h BondSearch.h Box.h CharMask.h CoordinateInfo.h CpptrajStdio.h DistRoutines.h FileName.h Frame.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Timer.h Topology.h Vec3.h Box.o : Box.cpp Box.h Constants.h CpptrajStdio.h Matrix_3x3.h Parallel.h Vec3.h BufferedFrame.o : BufferedFrame.cpp BufferedFrame.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h Parallel.h TextFormat.h BufferedLine.o : BufferedLine.cpp BufferedLine.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h Parallel.h ByteRoutines.o : ByteRoutines.cpp -CharMask.o : CharMask.cpp Atom.h CharMask.h CpptrajStdio.h MaskToken.h NameType.h Residue.h +CharMask.o : CharMask.cpp Atom.h CharMask.h CpptrajStdio.h MaskToken.h Molecule.h NameType.h Residue.h CIFfile.o : CIFfile.cpp Atom.h BufferedLine.h CIFfile.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h NameType.h Parallel.h ClusterDist.o : ClusterDist.cpp ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMap.h AtomMask.h Box.h CharMask.h ClusterDist.h Constants.h CoordinateInfo.h CpptrajFile.h DataSet.h DataSet_1D.h DataSet_Coords.h Dimension.h FileIO.h FileName.h Frame.h Hungarian.h MapAtom.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h SymmetricRmsdCalc.h TextFormat.h Topology.h Vec3.h ClusterList.o : ClusterList.cpp ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMap.h AtomMask.h Box.h CharMask.h ClusterDist.h ClusterList.h ClusterNode.h ClusterSieve.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSet_1D.h DataSet_Cmatrix.h DataSet_Coords.h Dimension.h FileIO.h FileName.h Frame.h Hungarian.h MapAtom.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h PDBfile.h Parallel.h ParameterTypes.h ProgressBar.h Range.h ReplicaDimArray.h Residue.h StringRoutines.h SymmetricRmsdCalc.h TextFormat.h Topology.h Vec3.h @@ -192,7 +192,7 @@ DataSet_Mat3x3.o : DataSet_Mat3x3.cpp ArgList.h AssociatedData.h CpptrajFile.h D DataSet_MatrixDbl.o : DataSet_MatrixDbl.cpp ArgList.h ArrayIterator.h AssociatedData.h CpptrajFile.h DataSet.h DataSet_2D.h DataSet_MatrixDbl.h Dimension.h FileIO.h FileName.h Matrix.h MetaData.h Parallel.h Range.h TextFormat.h DataSet_MatrixFlt.o : DataSet_MatrixFlt.cpp ArgList.h ArrayIterator.h AssociatedData.h CpptrajFile.h DataSet.h DataSet_2D.h DataSet_MatrixFlt.h Dimension.h FileIO.h FileName.h Matrix.h MetaData.h Parallel.h Range.h TextFormat.h DataSet_Mesh.o : DataSet_Mesh.cpp ArgList.h AssociatedData.h Constants.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSet_1D.h DataSet_Mesh.h Dimension.h FileIO.h FileName.h MetaData.h Parallel.h Range.h Spline.h TextFormat.h -DataSet_Modes.o : DataSet_Modes.cpp ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMask.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSet_2D.h DataSet_MatrixDbl.h DataSet_Modes.h Dimension.h FileIO.h FileName.h Frame.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h NameType.h Parallel.h Range.h ReplicaDimArray.h Residue.h TextFormat.h Vec3.h +DataSet_Modes.o : DataSet_Modes.cpp ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomMask.h Box.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSet_2D.h DataSet_MatrixDbl.h DataSet_Modes.h Dimension.h FileIO.h FileName.h Frame.h MaskToken.h Matrix.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h Range.h ReplicaDimArray.h Residue.h TextFormat.h Vec3.h DataSet_RemLog.o : DataSet_RemLog.cpp ArgList.h AssociatedData.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSet_RemLog.h Dimension.h FileIO.h FileName.h MetaData.h Parallel.h Range.h ReplicaDimArray.h TextFormat.h DataSet_Topology.o : DataSet_Topology.cpp ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h BaseIOtype.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSet_Topology.h Dimension.h FileIO.h FileName.h FileTypes.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h ParmFile.h ParmIO.h Range.h ReplicaDimArray.h Residue.h TextFormat.h Topology.h Vec3.h DataSet_Vector.o : DataSet_Vector.cpp ArgList.h ArrayIterator.h AssociatedData.h ComplexArray.h Constants.h Corr.h CpptrajFile.h DataSet.h DataSet_1D.h DataSet_Vector.h Dimension.h FileIO.h FileName.h MetaData.h Parallel.h PubFFT.h Range.h TextFormat.h Vec3.h @@ -254,7 +254,7 @@ FileIO_Mpi.o : FileIO_Mpi.cpp FileIO.h FileIO_Mpi.h Parallel.h FileIO_Std.o : FileIO_Std.cpp FileIO.h FileIO_Std.h FileName.o : FileName.cpp CpptrajStdio.h FileName.h FileTypes.o : FileTypes.cpp ArgList.h BaseIOtype.h CpptrajStdio.h FileTypes.h -Frame.o : Frame.cpp Atom.h AtomMask.h Box.h Constants.h CoordinateInfo.h CpptrajStdio.h Frame.h MaskToken.h Matrix_3x3.h NameType.h Parallel.h ReplicaDimArray.h Residue.h Vec3.h +Frame.o : Frame.cpp Atom.h AtomMask.h Box.h Constants.h CoordinateInfo.h CpptrajStdio.h Frame.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ReplicaDimArray.h Residue.h Vec3.h GridAction.o : GridAction.cpp ArgList.h ArrayIterator.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h Box.h CharMask.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSetList.h DataSet_3D.h DataSet_Coords.h DataSet_Coords_REF.h DataSet_GridFlt.h Dimension.h FileIO.h FileName.h Frame.h Grid.h GridAction.h GridBin.h MaskToken.h Matrix_3x3.h MetaData.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReferenceFrame.h ReplicaDimArray.h Residue.h TextFormat.h Timer.h Topology.h Vec3.h HistBin.o : HistBin.cpp Constants.h CpptrajStdio.h Dimension.h HistBin.h Hungarian.o : Hungarian.cpp ArrayIterator.h Constants.h CpptrajStdio.h Hungarian.h Matrix.h @@ -262,7 +262,7 @@ ImageRoutines.o : ImageRoutines.cpp Atom.h AtomExtra.h AtomMask.h Box.h CharMask InputTrajCommon.o : InputTrajCommon.cpp ArgList.h Atom.h AtomExtra.h AtomMask.h Box.h CharMask.h CoordinateInfo.h CpptrajStdio.h FileName.h Frame.h InputTrajCommon.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h TrajFrameCounter.h Vec3.h KDE.o : KDE.cpp ArgList.h AssociatedData.h Constants.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSet_1D.h DataSet_double.h Dimension.h FileIO.h FileName.h HistBin.h KDE.h MetaData.h Parallel.h Range.h TextFormat.h MapAtom.o : MapAtom.cpp Atom.h MapAtom.h NameType.h -MaskToken.o : MaskToken.cpp ArgList.h Atom.h Box.h CpptrajStdio.h DistRoutines.h MaskToken.h Matrix_3x3.h NameType.h Parallel.h Residue.h StringRoutines.h Vec3.h +MaskToken.o : MaskToken.cpp ArgList.h Atom.h Box.h CpptrajStdio.h DistRoutines.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h Residue.h StringRoutines.h Vec3.h Matrix_3x3.o : Matrix_3x3.cpp Constants.h CpptrajStdio.h Matrix_3x3.h Vec3.h MetaData.o : MetaData.cpp CpptrajStdio.h FileName.h MetaData.h Range.h StringRoutines.h Mol.o : Mol.cpp Atom.h AtomExtra.h AtomMask.h Box.h CharMask.h CoordinateInfo.h CpptrajStdio.h FileName.h Frame.h MaskToken.h Matrix_3x3.h Mol.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h Topology.h Vec3.h @@ -302,7 +302,7 @@ StructureMapper.o : StructureMapper.cpp ArgList.h AssociatedData.h Atom.h AtomEx SymmetricRmsdCalc.o : SymmetricRmsdCalc.cpp ArrayIterator.h Atom.h AtomExtra.h AtomMap.h AtomMask.h Box.h CharMask.h CoordinateInfo.h CpptrajStdio.h DistRoutines.h FileName.h Frame.h Hungarian.h MapAtom.h MaskToken.h Matrix.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h SymmetricRmsdCalc.h Topology.h Vec3.h TextFormat.o : TextFormat.cpp StringRoutines.h TextFormat.h Timer.o : Timer.cpp CpptrajStdio.h Timer.h -TinkerFile.o : TinkerFile.cpp ArgList.h Atom.h AtomMask.h Box.h BufferedLine.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h Frame.h MaskToken.h Matrix_3x3.h NameType.h Parallel.h ReplicaDimArray.h Residue.h StringRoutines.h TinkerFile.h Vec3.h +TinkerFile.o : TinkerFile.cpp ArgList.h Atom.h AtomMask.h Box.h BufferedLine.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h FileIO.h FileName.h Frame.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ReplicaDimArray.h Residue.h StringRoutines.h TinkerFile.h Vec3.h TopInfo.o : TopInfo.cpp ArgList.h AssociatedData.h Atom.h AtomExtra.h AtomMask.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajFile.h CpptrajStdio.h DataSet.h DataSet_Coords.h Dimension.h DistRoutines.h FileIO.h FileName.h Frame.h MaskToken.h Matrix_3x3.h MetaData.h Mol.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h StringRoutines.h TextFormat.h TopInfo.h Topology.h TorsionRoutines.h Vec3.h Topology.o : Topology.cpp Atom.h AtomExtra.h AtomMask.h Box.h CharMask.h Constants.h CoordinateInfo.h CpptrajStdio.h FileName.h Frame.h MaskToken.h Matrix_3x3.h Molecule.h NameType.h Parallel.h ParameterTypes.h Range.h ReplicaDimArray.h Residue.h StringRoutines.h Topology.h Vec3.h TorsionRoutines.o : TorsionRoutines.cpp Constants.h TorsionRoutines.h Vec3.h From 8401b78ff578bb894c96d4cff6dd08473a6e499d Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 10:48:14 -0400 Subject: [PATCH 04/27] DRR - Cpptraj: Hide debug info --- src/MaskToken.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index ff1c3b6ad9..29469f37d2 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -168,7 +168,7 @@ int MaskToken::SetDistance(std::string &distop) { // ============================================================================= // Class: MaskTokenArray -MaskTokenArray::MaskTokenArray() : debug_(10) {} +MaskTokenArray::MaskTokenArray() : debug_(0) {} // TODO include parentheses? bool MaskTokenArray::IsOperator(char op) { @@ -264,7 +264,7 @@ int MaskTokenArray::Tokenize() { if ( isspace(*p, loc) ) continue; if ( IsOperator(*p) || *p == '(' || *p == ')' ) { - mprintf("DEBUG: Operator or parentheses: %c\n", *p); + //mprintf("DEBUG: Operator or parentheses: %c\n", *p); if (flag > 0) { buffer += "])"; flag = 0; @@ -286,7 +286,7 @@ int MaskTokenArray::Tokenize() { } } } else if ( IsOperand(*p) ) { - mprintf("DEBUG: Operand: %c\n", *p); + //mprintf("DEBUG: Operand: %c\n", *p); if (flag==0) { buffer.assign("(["); flag = 1; @@ -419,7 +419,7 @@ int MaskTokenArray::Tokenize() { } } // END for loop over infix if (debug_ > 0) - mprintf("DEBUG: NEW_POSTFIX: %s\n",postfix.c_str()); + mprintf("DEBUG: NEW_POSTFIX: %s\n",postfix.c_str()); // Convert to MaskTokens in same order. The postfix expression is composed // of operands enclosed within brackets, and single character operators. @@ -483,7 +483,6 @@ int MaskTokenArray::Tokenize() { mprinterr("Error: empty token for '%c'\n",buffer[0]); return 1; } - // DEBUG //mprintf("DEBUG: buffer=[%s] tokenString=[%s]\n",buffer.c_str(),tokenString.c_str()); // Split operand by comma ArgList commaList(tokenString, ","); @@ -564,7 +563,7 @@ int MaskTokenArray::SetMaskString(const char* maskStringIn) { else maskExpression_.assign( "*" ); - if (debug_ > 0) mprintf("expression: %s\n", maskExpression_.c_str()); + if (debug_ > 0) mprintf("DEBUG: expression: %s\n", maskExpression_.c_str()); // Convert mask expression to maskTokens if (Tokenize()) return 1; From eee72624fd8a2df152dc1e550cd9398a3bbe283d Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 10:48:30 -0400 Subject: [PATCH 05/27] DRR - Cpptraj: Add molecule selection syntax test --- test/Test_TopInfo/RunTest.sh | 4 +++- test/Test_TopInfo/molselect.dat.save | 35 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/Test_TopInfo/molselect.dat.save diff --git a/test/Test_TopInfo/RunTest.sh b/test/Test_TopInfo/RunTest.sh index 2787ad6e74..66aeb564c7 100755 --- a/test/Test_TopInfo/RunTest.sh +++ b/test/Test_TopInfo/RunTest.sh @@ -3,7 +3,7 @@ . ../MasterTest.sh CleanFiles info.in atoms.dat residues.dat bonds.dat angles.dat dihedrals.dat \ - molecules.dat masscharge.dat values.dat molshort.dat + molecules.dat masscharge.dat values.dat molshort.dat molselect.dat INPUT="-i info.in" cat > info.in < Date: Tue, 26 Sep 2017 10:54:31 -0400 Subject: [PATCH 06/27] DRR - Cpptraj: Add molecule AND atom shorthand --- src/MaskToken.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 29469f37d2..2aeea4f827 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -322,6 +322,10 @@ int MaskTokenArray::Tokenize() { // Residue AND atom buffer += "]&[@"; flag = 2; + } else if (flag == 4) { + // Molecule AND atom + buffer += "]&[@"; + flag = 2; } else if (flag == 2) { // Atom OR Atom buffer += "])|([@"; From 8787feb069bb37630f66ab5f7803081dbbfdc9ed Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 11:26:06 -0400 Subject: [PATCH 07/27] DRR - Cpptraj: Add molecule AND residue shorthand --- src/MaskToken.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 2aeea4f827..236337018e 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -309,6 +309,9 @@ int MaskTokenArray::Tokenize() { if (flag == 0) { buffer.assign("([:"); flag = 1; + } else if (flag == 4) { + // Molecule AND residue + buffer += ("]&[:"); } else { buffer += "])|([:"; flag = 1; From d8e726abeca7834837f7a8ea4279331fdcf1c8d1 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 11:53:19 -0400 Subject: [PATCH 08/27] DRR - Cpptraj: Record all input in history, even if it doesnt work. Will add option to return to original behavior later. --- src/Cpptraj.cpp | 2 +- src/CpptrajState.cpp | 1 + src/CpptrajState.h | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Cpptraj.cpp b/src/Cpptraj.cpp index 640f24c673..451e4568c8 100644 --- a/src/Cpptraj.cpp +++ b/src/Cpptraj.cpp @@ -513,7 +513,7 @@ int Cpptraj::Interactive() { } if (!inputLine.empty()) { readLoop = Command::Dispatch( State_, *inputLine ); - if (logfile_.IsOpen() && readLoop != CpptrajState::ERR) { + if (logfile_.IsOpen() && (readLoop != CpptrajState::ERR || State_.RecordAllInput())) { logfile_.Printf("%s\n", inputLine.c_str()); logfile_.Flush(); } diff --git a/src/CpptrajState.cpp b/src/CpptrajState.cpp index c0ccf0cc81..2ded0222d8 100644 --- a/src/CpptrajState.cpp +++ b/src/CpptrajState.cpp @@ -20,6 +20,7 @@ CpptrajState::CpptrajState() : topDebug_(0), showProgress_(true), exitOnError_(true), + recordAllInput_(true), noEmptyRun_(false), mode_(UNDEFINED) # ifdef MPI diff --git a/src/CpptrajState.h b/src/CpptrajState.h index adf9f0adf6..05a44e6292 100644 --- a/src/CpptrajState.h +++ b/src/CpptrajState.h @@ -31,6 +31,7 @@ class CpptrajState { int Debug() const { return debug_; } bool ShowProgress() const { return showProgress_;} bool ExitOnError() const { return exitOnError_; } + bool RecordAllInput() const { return recordAllInput_; } bool EmptyState() const { return (actionList_.Empty() && analysisList_.Empty() && trajoutList_.Empty() && @@ -102,6 +103,7 @@ class CpptrajState { int topDebug_; ///< Topology debug level. bool showProgress_; ///< If true, display progress during Run. bool exitOnError_; ///< If true exit when errors encountered instead of continuing. + bool recordAllInput_; ///< When true save all input to log, even errors. /// If true do not process input trajectories when no actions/output trajectories. bool noEmptyRun_; // DEBUG: false is used for benchmarking trajectory read speed. TrajModeType mode_; ///< Current trajectory mode (NORMAL/ENSEMBLE) From bb90221d8182bbc97e12ba1e34e1a7b0ae94dafe Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 11:54:11 -0400 Subject: [PATCH 09/27] DRR - Cpptraj: Add beginnings of ResChain for ChainID --- src/MaskToken.cpp | 11 +++++++++-- src/MaskToken.h | 5 ++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 236337018e..4a5590e4ba 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -18,7 +18,10 @@ MaskToken::MaskToken() : { } const char* MaskToken::MaskTypeString[] = { - "OP_NONE", "ResNum", "ResName", "AtomNum", "AtomName", "AtomType", "AtomElement", "MolNum", + "OP_NONE", + "ResNum", "ResName", "ResChain", + "AtomNum", "AtomName", "AtomType", "AtomElement", + "MolNum", "SelectAll", "OP_AND", "OP_OR", "OP_NEG", "OP_DIST" }; @@ -26,6 +29,9 @@ void MaskToken::Print() const { mprintf("TOKEN: [%s]",MaskTypeString[type_]); switch (type_) { case ResName: + case ResChain: + case AtomType: + case AtomElement: case AtomName: mprintf(" Name=[%s]",*name_); break; case MolNum: case ResNum: @@ -464,7 +470,8 @@ int MaskTokenArray::Tokenize() { MaskToken::MaskTokenType tokenType = MaskToken::OP_NONE; if (buffer[0]==':') { // Residue - tokenType = MaskToken::ResNum; + tokenType = MaskToken::ResNum; + if (buffer[1] =='/') tokenType = MaskToken::ResChain; } else if (buffer[0]=='@') { // Atom tokenType = MaskToken::AtomNum; diff --git a/src/MaskToken.h b/src/MaskToken.h index 601c89d05b..7e1462b9c1 100644 --- a/src/MaskToken.h +++ b/src/MaskToken.h @@ -7,7 +7,10 @@ class MaskToken { public: enum MaskTokenType { - OP_NONE=0, ResNum, ResName, AtomNum, AtomName, AtomType, AtomElement, MolNum, + OP_NONE=0, + ResNum, ResName, ResChain, + AtomNum, AtomName, AtomType, AtomElement, + MolNum, SelectAll, OP_AND, OP_OR, OP_NEG, OP_DIST }; MaskToken(); From 91dd885e786dbae7b6934c950b40dc7ad3b8d1f2 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 12:06:22 -0400 Subject: [PATCH 10/27] DRR - Cpptraj: Finish selection by chain ID --- src/MaskToken.cpp | 13 +++++++++++++ src/MaskToken.h | 1 + 2 files changed, 14 insertions(+) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 4a5590e4ba..81e9d34fe4 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -635,6 +635,9 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms_, case MaskToken::ResName : MaskSelectResidues( residues_, token->Name(), pMask ); break; + case MaskToken::ResChain : + MaskSelectChainID( residues_, token->Name(), pMask ); + break; case MaskToken::AtomNum : MaskSelectAtoms( atoms_, token->Res1(), token->Res2(), pMask ); break; @@ -898,6 +901,16 @@ void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues_, int res1, in std::fill(mask + residues_[res1-1].FirstAtom(), mask + endatom, SelectedChar_); } +/** Select residues by chain ID. */ +void MaskTokenArray::MaskSelectChainID(ResArrayT const& residues, NameType const& name, + char* mask) const +{ + for (ResArrayT::const_iterator res = residues.begin(); + res != residues.end(); ++res) + if ( res->ChainID() == name[0] ) + std::fill(mask + res->FirstAtom(), mask + res->LastAtom(), SelectedChar_); +} + // Mask args expected to start from 1 void MaskTokenArray::MaskSelectMolecules(MolArrayT const& molecules, int mol1, int mol2, char* mask) const diff --git a/src/MaskToken.h b/src/MaskToken.h index 7e1462b9c1..1b207b816a 100644 --- a/src/MaskToken.h +++ b/src/MaskToken.h @@ -109,6 +109,7 @@ class MaskTokenArray { void Mask_NEG(char *, unsigned int) const; void MaskSelectResidues(ResArrayT const&, NameType const&, char*) const; void MaskSelectResidues(ResArrayT const&, int, int, char*) const; + void MaskSelectChainID(ResArrayT const&, NameType const&, char*) const; void MaskSelectMolecules(MolArrayT const&, int, int, char*) const; void MaskSelectElements(AtomArrayT const&, NameType const&, char*) const; void MaskSelectTypes(AtomArrayT const&, NameType const&, char*) const; From f51bf60ba9fb363d951d57893d7b2e8749107f47 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 12:08:18 -0400 Subject: [PATCH 11/27] DRR - Cpptraj: Add selection by chain ID test --- test/Test_PDB/RunTest.sh | 5 ++- test/Test_PDB/chainA.dat.save | 79 +++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 test/Test_PDB/chainA.dat.save diff --git a/test/Test_PDB/RunTest.sh b/test/Test_PDB/RunTest.sh index 431e1e2e68..664dff09de 100755 --- a/test/Test_PDB/RunTest.sh +++ b/test/Test_PDB/RunTest.sh @@ -2,7 +2,8 @@ . ../MasterTest.sh -CleanFiles pdb.in test.pdb tz2.pqr.gb.pdb tz2.pqr.parse.pdb tz2.pqr.vdw.pdb +CleanFiles pdb.in test.pdb tz2.pqr.gb.pdb tz2.pqr.parse.pdb \ + tz2.pqr.vdw.pdb chainA.dat INPUT="-i pdb.in" @@ -13,11 +14,13 @@ Requires maxthreads 1 UNITNAME='PDB format read/write test' cat >> pdb.in < Date: Tue, 26 Sep 2017 12:12:59 -0400 Subject: [PATCH 12/27] DRR - Cpptraj: Remove terminal underscores from passed in variable names --- src/MaskToken.cpp | 104 +++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 81e9d34fe4..ce280a4589 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -609,11 +609,11 @@ void MaskTokenArray::BriefMaskInfo() const { char MaskTokenArray::SelectedChar_ = 'T'; char MaskTokenArray::UnselectedChar_ = 'F'; -/** \return Array of char, same size as atoms_, with T for selected atoms and F otherwise. +/** \return Array of char, same size as atoms, with T for selected atoms and F otherwise. */ -char* MaskTokenArray::ParseMask(AtomArrayT const& atoms_, - ResArrayT const& residues_, - MolArrayT const& molecules_, +char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, + ResArrayT const& residues, + MolArrayT const& molecules, const double* XYZ) const { std::stack Stack; @@ -625,54 +625,54 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms_, { if (pMask==0) { // Create new blank mask - pMask = new char[ atoms_.size() ]; - std::fill(pMask, pMask + atoms_.size(), UnselectedChar_); + pMask = new char[ atoms.size() ]; + std::fill(pMask, pMask + atoms.size(), UnselectedChar_); } switch ( token->Type() ) { case MaskToken::ResNum : - MaskSelectResidues( residues_, token->Res1(), token->Res2(), pMask ); + MaskSelectResidues( residues, token->Res1(), token->Res2(), pMask ); break; case MaskToken::ResName : - MaskSelectResidues( residues_, token->Name(), pMask ); + MaskSelectResidues( residues, token->Name(), pMask ); break; case MaskToken::ResChain : - MaskSelectChainID( residues_, token->Name(), pMask ); + MaskSelectChainID( residues, token->Name(), pMask ); break; case MaskToken::AtomNum : - MaskSelectAtoms( atoms_, token->Res1(), token->Res2(), pMask ); + MaskSelectAtoms( atoms, token->Res1(), token->Res2(), pMask ); break; case MaskToken::AtomName : - MaskSelectAtoms( atoms_, token->Name(), pMask ); + MaskSelectAtoms( atoms, token->Name(), pMask ); break; case MaskToken::AtomType : - MaskSelectTypes( atoms_, token->Name(), pMask ); + MaskSelectTypes( atoms, token->Name(), pMask ); break; case MaskToken::AtomElement : - MaskSelectElements( atoms_, token->Name(), pMask ); + MaskSelectElements( atoms, token->Name(), pMask ); break; case MaskToken::MolNum : - MaskSelectMolecules( molecules_, token->Res1(), token->Res2(), pMask ); + MaskSelectMolecules( molecules, token->Res1(), token->Res2(), pMask ); break; case MaskToken::SelectAll : - std::fill(pMask, pMask + atoms_.size(), SelectedChar_); + std::fill(pMask, pMask + atoms.size(), SelectedChar_); break; case MaskToken::OP_AND : pMask2 = Stack.top(); Stack.pop(); - Mask_AND( Stack.top(), pMask2, atoms_.size() ); + Mask_AND( Stack.top(), pMask2, atoms.size() ); delete[] pMask2; break; case MaskToken::OP_OR : pMask2 = Stack.top(); Stack.pop(); - Mask_OR( Stack.top(), pMask2, atoms_.size() ); + Mask_OR( Stack.top(), pMask2, atoms.size() ); delete[] pMask2; break; case MaskToken::OP_NEG : - Mask_NEG( Stack.top(), atoms_.size() ); + Mask_NEG( Stack.top(), atoms.size() ); break; case MaskToken::OP_DIST : - err = Mask_SelectDistance( XYZ, Stack.top(), *token, atoms_, residues_); + err = Mask_SelectDistance( XYZ, Stack.top(), *token, atoms, residues); break; default: mprinterr("Error: Invalid mask token (Mask [%s], type [%s]).\n", @@ -716,14 +716,14 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms_, /** \param REF reference coordinates. * \param mask Initial atom selection; will be set with final output mask. * \param token Describe how atoms are to be selected. - * \param atoms_ Atom array. - * \param residues_ Residue array. + * \param atoms Atom array. + * \param residues Residue array. * \return 0 if successful, 1 if an error occurs. */ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, MaskToken const& token, - AtomArrayT const& atoms_, - ResArrayT const& residues_) const + AtomArrayT const& atoms, + ResArrayT const& residues) const { if (REF == 0) { mprinterr("Error: No reference set, cannot select by distance.\n"); @@ -735,7 +735,7 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, // These are the atoms the search is based on. typedef std::vector Uarray; Uarray Idx; - for (unsigned int i = 0; i < atoms_.size(); i++) { + for (unsigned int i = 0; i < atoms.size(); i++) { if (mask[i] == SelectedChar_) Idx.push_back( i*3 ); } @@ -767,7 +767,7 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, if (token.ByAtom()) { // Select by atom - int n_of_atoms = (int)atoms_.size(); + int n_of_atoms = (int)atoms.size(); int atomi; # ifdef _OPENMP # pragma omp parallel private(atomi) @@ -793,7 +793,7 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, # endif } else { // Select by residue - int n_of_res = (int)residues_.size(); + int n_of_res = (int)residues.size(); int resi; // Loop over all residues # ifdef _OPENMP @@ -804,10 +804,10 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, for (resi = 0; resi < n_of_res; resi++) { // Initial state char schar = char0; - int atomi = residues_[resi].FirstAtom(); + int atomi = residues[resi].FirstAtom(); const double* i_crd = REF + (atomi * 3); // Loop over residue atoms - for (; atomi != residues_[resi].LastAtom(); atomi++, i_crd += 3) { + for (; atomi != residues[resi].LastAtom(); atomi++, i_crd += 3) { // Loop over initially selected atoms for (Uarray::const_iterator idx = Idx.begin(); idx != Idx.end(); ++idx) { double d2 = DIST2_NoImage(i_crd, REF + *idx); @@ -820,8 +820,8 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, if (schar == char1) break; } // END loop over residue atoms // Set residue selection status - for (atomi = residues_[resi].FirstAtom(); - atomi != residues_[resi].LastAtom(); atomi++) + for (atomi = residues[resi].FirstAtom(); + atomi != residues[resi].LastAtom(); atomi++) mask[atomi] = schar; } // END loop over all residues # ifdef _OPENMP @@ -866,12 +866,12 @@ void MaskTokenArray::Mask_NEG(char *mask1, unsigned int N) const { } // MaskTokenArray::MaskSelectResidues() -void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues_, NameType const& name, +void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues, NameType const& name, char *mask) const { //mprintf("\t\t\tSelecting residues named [%s]\n",*name); - for (std::vector::const_iterator res = residues_.begin(); - res != residues_.end(); res++) + for (std::vector::const_iterator res = residues.begin(); + res != residues.end(); res++) { if ( res->Name().Match( name ) ) { std::fill(mask + res->FirstAtom(), mask + res->LastAtom(), SelectedChar_); @@ -881,11 +881,11 @@ void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues_, NameType con // MaskTokenArray::MaskSelectResidues() // Mask args expected to start from 1 -void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues_, int res1, int res2, +void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues, int res1, int res2, char *mask) const { int endatom; - int nres = (int) residues_.size(); + int nres = (int) residues.size(); //mprintf("\t\t\tSelecting residues %i to %i\n",res1,res2); // Check start atom. res1 and res2 are checked by MaskToken if (res1 > nres) { @@ -894,11 +894,11 @@ void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues_, int res1, in } // If last res > nres, make it nres if ( res2 >= nres ) - endatom = residues_.back().LastAtom(); + endatom = residues.back().LastAtom(); else - endatom = residues_[res2-1].LastAtom(); + endatom = residues[res2-1].LastAtom(); // Select atoms - std::fill(mask + residues_[res1-1].FirstAtom(), mask + endatom, SelectedChar_); + std::fill(mask + residues[res1-1].FirstAtom(), mask + endatom, SelectedChar_); } /** Select residues by chain ID. */ @@ -935,12 +935,12 @@ void MaskTokenArray::MaskSelectMolecules(MolArrayT const& molecules, int mol1, i } // MaskTokenArray::MaskSelectElements() -void MaskTokenArray::MaskSelectElements(AtomArrayT const& atoms_, NameType const& element, +void MaskTokenArray::MaskSelectElements(AtomArrayT const& atoms, NameType const& element, char* mask ) const { unsigned int m = 0; - for (std::vector::const_iterator atom = atoms_.begin(); - atom != atoms_.end(); ++atom, ++m) + for (std::vector::const_iterator atom = atoms.begin(); + atom != atoms.end(); ++atom, ++m) { NameType atom_element( atom->ElementName() ); if ( atom_element.Match( element ) ) @@ -949,12 +949,12 @@ void MaskTokenArray::MaskSelectElements(AtomArrayT const& atoms_, NameType const } // MaskTokenArray::MaskSelectTypes() -void MaskTokenArray::MaskSelectTypes(AtomArrayT const& atoms_, NameType const& type, +void MaskTokenArray::MaskSelectTypes(AtomArrayT const& atoms, NameType const& type, char* mask ) const { unsigned int m = 0; - for (std::vector::const_iterator atom = atoms_.begin(); - atom != atoms_.end(); ++atom, ++m) + for (std::vector::const_iterator atom = atoms.begin(); + atom != atoms.end(); ++atom, ++m) { if ( atom->Type().Match( type ) ) mask[m] = SelectedChar_; @@ -962,13 +962,13 @@ void MaskTokenArray::MaskSelectTypes(AtomArrayT const& atoms_, NameType const& t } // MaskTokenArray::MaskSelectAtoms() -void MaskTokenArray::MaskSelectAtoms(AtomArrayT const& atoms_, NameType const& name, +void MaskTokenArray::MaskSelectAtoms(AtomArrayT const& atoms, NameType const& name, char *mask) const { //mprintf("\t\t\tSelecting atoms named [%s]\n",*name); unsigned int m = 0; - for (std::vector::const_iterator atom = atoms_.begin(); - atom != atoms_.end(); atom++, ++m) + for (std::vector::const_iterator atom = atoms.begin(); + atom != atoms.end(); atom++, ++m) { //mprintf("\t\t\t%u PARM[%s] NAME[%s]",m,(*atom).c_str(),*name); if ( atom->Name().Match( name ) ) @@ -978,19 +978,19 @@ void MaskTokenArray::MaskSelectAtoms(AtomArrayT const& atoms_, NameType const& n } // Mask args expected to start from 1 -void MaskTokenArray::MaskSelectAtoms(AtomArrayT const& atoms_, int atom1, int atom2, +void MaskTokenArray::MaskSelectAtoms(AtomArrayT const& atoms, int atom1, int atom2, char *mask) const { int startatom, endatom; //mprintf("\t\t\tSelecting atoms %i to %i\n",atom1,atom2); - if (atom1 > (int)atoms_.size()) { - mprintf("Warning: Select atoms: atom 1 out of range (%i > %zu)\n",atom1, atoms_.size()); + if (atom1 > (int)atoms.size()) { + mprintf("Warning: Select atoms: atom 1 out of range (%i > %zu)\n",atom1, atoms.size()); return; } startatom = atom1 - 1; - if (atom2 > (int)atoms_.size()) + if (atom2 > (int)atoms.size()) //mprinterr("Error: Select atoms: atom 2 out of range (%i)\n",atom2) - endatom = atoms_.size(); + endatom = atoms.size(); else endatom = atom2; // Select atoms From 050725bbcc1375cb3c318feff5a68eae53297c91 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 12:17:01 -0400 Subject: [PATCH 13/27] DRR - Cpptraj: Use typedefs --- src/MaskToken.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index ce280a4589..903e3c99ba 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -537,7 +537,7 @@ int MaskTokenArray::Tokenize() { if (!maskTokens_.empty()) { std::stack tempStack; bool validMask = true; - std::vector::const_iterator T = maskTokens_.begin(); + MTarray::const_iterator T = maskTokens_.begin(); for ( ; T != maskTokens_.end(); ++T) { if (T->Type() == MaskToken::OP_AND || @@ -561,8 +561,7 @@ int MaskTokenArray::Tokenize() { } } if (debug_ > 0) - for (std::vector::const_iterator T = maskTokens_.begin(); - T != maskTokens_.end(); T++) + for (MTarray::const_iterator T = maskTokens_.begin(); T != maskTokens_.end(); ++T) T->Print(); return 0; @@ -870,8 +869,7 @@ void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues, NameType cons char *mask) const { //mprintf("\t\t\tSelecting residues named [%s]\n",*name); - for (std::vector::const_iterator res = residues.begin(); - res != residues.end(); res++) + for (ResArrayT::const_iterator res = residues.begin(); res != residues.end(); ++res) { if ( res->Name().Match( name ) ) { std::fill(mask + res->FirstAtom(), mask + res->LastAtom(), SelectedChar_); @@ -939,8 +937,7 @@ void MaskTokenArray::MaskSelectElements(AtomArrayT const& atoms, NameType const& char* mask ) const { unsigned int m = 0; - for (std::vector::const_iterator atom = atoms.begin(); - atom != atoms.end(); ++atom, ++m) + for (AtomArrayT::const_iterator atom = atoms.begin(); atom != atoms.end(); ++atom, ++m) { NameType atom_element( atom->ElementName() ); if ( atom_element.Match( element ) ) @@ -953,8 +950,7 @@ void MaskTokenArray::MaskSelectTypes(AtomArrayT const& atoms, NameType const& ty char* mask ) const { unsigned int m = 0; - for (std::vector::const_iterator atom = atoms.begin(); - atom != atoms.end(); ++atom, ++m) + for (AtomArrayT::const_iterator atom = atoms.begin(); atom != atoms.end(); ++atom, ++m) { if ( atom->Type().Match( type ) ) mask[m] = SelectedChar_; @@ -967,8 +963,7 @@ void MaskTokenArray::MaskSelectAtoms(AtomArrayT const& atoms, NameType const& na { //mprintf("\t\t\tSelecting atoms named [%s]\n",*name); unsigned int m = 0; - for (std::vector::const_iterator atom = atoms.begin(); - atom != atoms.end(); atom++, ++m) + for (AtomArrayT::const_iterator atom = atoms.begin(); atom != atoms.end(); ++atom, ++m) { //mprintf("\t\t\t%u PARM[%s] NAME[%s]",m,(*atom).c_str(),*name); if ( atom->Name().Match( name ) ) From 225c679e1bba0b050d6bf21f72bd7e5c91338799 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 12:38:07 -0400 Subject: [PATCH 14/27] DRR - Cpptraj: Slight reconfig of MaskToken in preparation for adding distance selection by molecule --- src/MaskToken.cpp | 32 ++++++++++++++++---------------- src/MaskToken.h | 34 +++++++++++++++++----------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 903e3c99ba..753429e4d6 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -7,14 +7,14 @@ #include "DistRoutines.h" // selection by distance MaskToken::MaskToken() : + distance2_(0.0), + name_(""), type_(OP_NONE), + distOp_(BY_ATOM), res1_(-1), res2_(-1), - name_(""), onStack_(false), - d_within_(false), - d_atom_(false), - distance_(0.0) + d_within_(false) { } const char* MaskToken::MaskTypeString[] = { @@ -37,8 +37,8 @@ void MaskToken::Print() const { case ResNum: case AtomNum: mprintf(" First=%i Second=%i",res1_,res2_); break; case OP_DIST: - mprintf(" within=%i d_atom=%i distance^2=%lf", - (int)d_within_, (int)d_atom_, distance_); + mprintf(" within=%i distOp=%i distance^2=%f", + (int)d_within_, (int)distOp_, distance2_); break; default: mprintf(" "); } @@ -46,8 +46,8 @@ void MaskToken::Print() const { /* mprintf("TOKEN: [%s] Res1=%i Res2=%i Name=[%s] OnStack=%i\n", MaskTypeString[type_], res1_, res2_, *name_, (int)onStack_); - mprintf(" within=%i d_atom=%i distance^2=%lf\n", - (int)d_within_, (int)d_atom_, distance_);*/ + mprintf(" within=%i distOp=%i distance^2=%f\n", + (int)d_within_, (int)distOp_, distance2_);*/ } const char *MaskToken::TypeName() const { return MaskTypeString[type_]; } @@ -157,18 +157,18 @@ int MaskToken::SetDistance(std::string &distop) { } // 2nd char indidcates atoms (@) or residues (:) if (distop[1]=='@') - d_atom_ = true; + distOp_ = BY_ATOM; else if (distop[1]==':') - d_atom_ = false; + distOp_ = BY_RES; else { mprinterr("Error: Malformed distance operator: expected ':' or '@' (%c)\n",distop[1]); return 1; } // 3rd char onwards is the distance argument std::string distarg(distop.begin()+2, distop.end()); - distance_ = convertToDouble(distarg); + distance2_ = convertToDouble(distarg); // Pre-square the distance - distance_ *= distance_; + distance2_ *= distance2_; return 0; } @@ -729,7 +729,7 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, return 1; } // Distance cutoff has been pre-squared. - double dcut2 = token.Distance(); + double dcut2 = token.Distance2(); // Create temporary array of atom #s currently selected in mask. // These are the atoms the search is based on. typedef std::vector Uarray; @@ -743,8 +743,8 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, return 1; } //if (debug_ > 1) { - // mprintf("\t\tDistance Op: Within=%i byAtom=%i distance^2=%lf\n", - // (int)token.Within(), (int)token.ByAtom(), token.Distance()); + // mprintf("\t\tDistance Op: Within=%i DistOp=%i distance^2=%f\n", + // (int)token.Within(), (int)token.DistOp(), token.Distance2()); // mprintf("\t\tSearch Mask=["); // for (Uarray::const_iterator at = Idx.begin(); at != Idx.end(); ++at) // mprintf(" %u",*at/3 + 1); @@ -764,7 +764,7 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, char1 = UnselectedChar_; } - if (token.ByAtom()) { + if (token.DistOp() == MaskToken::BY_ATOM) { // Select by atom int n_of_atoms = (int)atoms.size(); int atomi; diff --git a/src/MaskToken.h b/src/MaskToken.h index 1b207b816a..a1b8bf4fdd 100644 --- a/src/MaskToken.h +++ b/src/MaskToken.h @@ -13,6 +13,7 @@ class MaskToken { MolNum, SelectAll, OP_AND, OP_OR, OP_NEG, OP_DIST }; + enum DistOpType { BY_ATOM = 0, BY_RES, BY_MOL }; MaskToken(); const char *TypeName() const; void Print() const; @@ -21,28 +22,27 @@ class MaskToken { void SetOperator(MaskTokenType t) { type_ = t; onStack_ = false; } void SetOnStack() { onStack_ = true; } - inline MaskTokenType Type() const { return type_; } - inline int Res1() const { return res1_; } - inline int Res2() const { return res2_; } - inline const NameType& Name() const { return name_; } - inline bool OnStack() const { return onStack_; } - inline bool Within() const { return d_within_; } - inline bool ByAtom() const { return d_atom_; } - inline double Distance() const { return distance_; } + inline MaskTokenType Type() const { return type_; } + inline int Res1() const { return res1_; } + inline int Res2() const { return res2_; } + inline const NameType& Name() const { return name_; } + inline bool OnStack() const { return onStack_; } + inline bool Within() const { return d_within_; } + inline DistOpType DistOp() const { return distOp_; } + inline double Distance2() const { return distance2_; } private: static const char* MaskTypeString[]; int MakeNameType(); - MaskTokenType type_; - int res1_; - int res2_; - NameType name_; - bool onStack_; - // Distance criteria - bool d_within_; - bool d_atom_; - double distance_; + double distance2_; ///< Distance cutoff squared + NameType name_; ///< Atom name/type/element, residue name, chain ID + MaskTokenType type_; ///< Mask token type + DistOpType distOp_; ///< Distance selection type + int res1_; ///< Begin atom/residue/molecule index + int res2_; ///< End atom/residue/molecule index + bool onStack_; ///< True if resulting mask needs to go on stack + bool d_within_; ///< True if distance selection is within }; // ============================================================================= /// Hold an array of MaskTokens. Basis of all Mask classes. From 35b669981470be1036c04ae1b819ec49938a060a Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 13:07:13 -0400 Subject: [PATCH 15/27] DRR - Cpptraj: Add molecule selection by distance --- src/MaskToken.cpp | 66 +++++++++++++++++++++++++++++++++++++++-------- src/MaskToken.h | 4 +-- 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 753429e4d6..422c633bfd 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -65,7 +65,7 @@ int MaskToken::MakeNameType() { return 0; } -/** Basic : or @ operand. */ +/** Basic : @ or ^ operand. */ int MaskToken::SetToken( MaskTokenType typeIn, std::string const& tokenString ) { std::locale loc; if (tokenString.empty()) return 1; @@ -136,8 +136,8 @@ int MaskToken::SetToken( MaskTokenType typeIn, std::string const& tokenString ) return 0; } -/** [<|>][@|:] */ -int MaskToken::SetDistance(std::string &distop) { +/** [<|>][@|:|^] */ +int MaskToken::SetDistance(std::string const& distop) { if (distop.empty()) return 1; type_ = OP_DIST; onStack_ = false; @@ -155,13 +155,15 @@ int MaskToken::SetDistance(std::string &distop) { mprinterr("Error: Malformed distance operator: expected '<' or '>' (%c)\n",distop[0]); return 1; } - // 2nd char indidcates atoms (@) or residues (:) + // 2nd char indidcates atoms (@), residues (:), or molecules (^) if (distop[1]=='@') distOp_ = BY_ATOM; else if (distop[1]==':') distOp_ = BY_RES; + else if (distop[1]=='^') + distOp_ = BY_MOL; else { - mprinterr("Error: Malformed distance operator: expected ':' or '@' (%c)\n",distop[1]); + mprinterr("Error: Malformed distance operator: expected '^', ':', or '@' (%c)\n",distop[1]); return 1; } // 3rd char onwards is the distance argument @@ -285,7 +287,7 @@ int MaskTokenArray::Tokenize() { ++p; buffer += *p; flag = 3; - if ( *p != ':' && *p != '@' ) { + if ( *p != ':' && *p != '@' && *p != '^' ) { --p; mprinterr("Error: Tokenize: Wrong syntax for distance mask [%c]\n",*p); return 1; @@ -671,7 +673,7 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, Mask_NEG( Stack.top(), atoms.size() ); break; case MaskToken::OP_DIST : - err = Mask_SelectDistance( XYZ, Stack.top(), *token, atoms, residues); + err = Mask_SelectDistance( XYZ, Stack.top(), *token, atoms, residues, molecules); break; default: mprinterr("Error: Invalid mask token (Mask [%s], type [%s]).\n", @@ -722,7 +724,8 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, MaskToken const& token, AtomArrayT const& atoms, - ResArrayT const& residues) const + ResArrayT const& residues, + MolArrayT const& molecules) const { if (REF == 0) { mprinterr("Error: No reference set, cannot select by distance.\n"); @@ -774,7 +777,7 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, # pragma omp for # endif for (atomi = 0; atomi < n_of_atoms; atomi++) { - // Initial state + // Initial state mask[atomi] = char0; const double* i_crd = REF + (atomi * 3); // Loop over initially selected atoms @@ -790,7 +793,7 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, # ifdef _OPENMP } // END pragma omp parallel # endif - } else { + } else if (token.DistOp() == MaskToken::BY_RES) { // Select by residue int n_of_res = (int)residues.size(); int resi; @@ -801,7 +804,7 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, # pragma omp for # endif for (resi = 0; resi < n_of_res; resi++) { - // Initial state + // Initial state char schar = char0; int atomi = residues[resi].FirstAtom(); const double* i_crd = REF + (atomi * 3); @@ -826,6 +829,47 @@ int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, # ifdef _OPENMP } // END pragma omp parallel # endif + } else { + // Select by molecule + if (molecules.empty()) { + mprinterr("Error: No molecule info. Cannot select molecules by distance.\n"); + return 1; + } + int n_of_mol = (int)molecules.size(); + int moli; + // Loop over all molecules +# ifdef _OPENMP +# pragma omp parallel private(moli) + { +# pragma omp for +# endif + for (moli = 0; moli < n_of_mol; moli++) { + // Initial state + char schar = char0; + int atomi = molecules[moli].BeginAtom(); + const double* i_crd = REF + (atomi * 3); + // Loop over molecule atoms + for (; atomi != molecules[moli].EndAtom(); atomi++, i_crd += 3) { + // Loop over initially selected atoms + for (Uarray::const_iterator idx = Idx.begin(); idx != Idx.end(); ++idx) { + double d2 = DIST2_NoImage(i_crd, REF + *idx); + if (d2 < dcut2) { + // State changes + schar = char1; + break; + } + } // END loop over initially selected atoms + if (schar == char1) break; + } // END loop over molecule atoms + // Set molecule selection status + for (atomi = molecules[moli].BeginAtom(); + atomi != molecules[moli].EndAtom(); atomi++) + mask[atomi] = schar; + } // END loop over all molecules +# ifdef _OPENMP + } // END pragma omp parallel +# endif + } return 0; } diff --git a/src/MaskToken.h b/src/MaskToken.h index a1b8bf4fdd..b00d906d6c 100644 --- a/src/MaskToken.h +++ b/src/MaskToken.h @@ -18,7 +18,7 @@ class MaskToken { const char *TypeName() const; void Print() const; int SetToken( MaskTokenType, std::string const& ); - int SetDistance( std::string & ); + int SetDistance( std::string const& ); void SetOperator(MaskTokenType t) { type_ = t; onStack_ = false; } void SetOnStack() { onStack_ = true; } @@ -103,7 +103,7 @@ class MaskTokenArray { // Mask selection routines. int Mask_SelectDistance(const double*, char *, MaskToken const&, - AtomArrayT const&, ResArrayT const&) const; + AtomArrayT const&, ResArrayT const&, MolArrayT const&) const; void Mask_AND(char*, char*, unsigned int) const; void Mask_OR(char*, char*, unsigned int) const; void Mask_NEG(char *, unsigned int) const; From 9f85d694d6c29974eeddb87e9f53ef8764c81146 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 13:08:02 -0400 Subject: [PATCH 16/27] DRR - Cpptraj: Add molecule selection by distance test --- test/Test_DistBasedMask/Fifth.pdb.1.save | 692 +++++++++++++++++++++++ test/Test_DistBasedMask/RunTest.sh | 19 +- 2 files changed, 709 insertions(+), 2 deletions(-) create mode 100644 test/Test_DistBasedMask/Fifth.pdb.1.save diff --git a/test/Test_DistBasedMask/Fifth.pdb.1.save b/test/Test_DistBasedMask/Fifth.pdb.1.save new file mode 100644 index 0000000000..a3dc6a0c53 --- /dev/null +++ b/test/Test_DistBasedMask/Fifth.pdb.1.save @@ -0,0 +1,692 @@ +CRYST1 59.446 61.825 66.459 90.00 90.00 90.00 1 +ATOM 1 C12 OL 1 32.043 9.558 43.219 1.00 0.00 C +ATOM 2 H2R OL 1 31.040 9.944 43.415 1.00 0.00 H +ATOM 3 H2S OL 1 31.958 8.476 43.111 1.00 0.00 H +ATOM 4 C13 OL 1 32.602 10.178 41.919 1.00 0.00 C +ATOM 5 H3R OL 1 33.535 9.677 41.649 1.00 0.00 H +ATOM 6 H3S OL 1 32.844 11.228 42.093 1.00 0.00 H +ATOM 7 C14 OL 1 31.609 10.099 40.739 1.00 0.00 C +ATOM 8 H4R OL 1 30.665 10.569 41.018 1.00 0.00 H +ATOM 9 H4S OL 1 31.392 9.056 40.504 1.00 0.00 H +ATOM 10 C15 OL 1 32.213 10.793 39.497 1.00 0.00 C +ATOM 11 H5R OL 1 32.417 10.052 38.721 1.00 0.00 H +ATOM 12 H5S OL 1 33.172 11.227 39.767 1.00 0.00 H +ATOM 13 C16 OL 1 31.348 11.933 38.924 1.00 0.00 C +ATOM 14 H6R OL 1 31.953 12.474 38.193 1.00 0.00 H +ATOM 15 H6S OL 1 31.084 12.643 39.710 1.00 0.00 H +ATOM 16 C17 OL 1 30.079 11.405 38.230 1.00 0.00 C +ATOM 17 H7R OL 1 29.339 11.101 38.974 1.00 0.00 H +ATOM 18 H7S OL 1 30.339 10.521 37.646 1.00 0.00 H +ATOM 19 C18 OL 1 29.482 12.466 37.285 1.00 0.00 C +ATOM 20 H8R OL 1 29.088 13.295 37.875 1.00 0.00 H +ATOM 21 H8S OL 1 30.271 12.883 36.657 1.00 0.00 H +ATOM 22 C19 OL 1 28.376 11.873 36.436 1.00 0.00 C +ATOM 23 H9R OL 1 27.386 11.904 36.886 1.00 0.00 H +ATOM 24 C110 OL 1 28.520 11.348 35.222 1.00 0.00 C +ATOM 25 H10R OL 1 27.645 10.957 34.707 1.00 0.00 H +ATOM 26 C111 OL 1 29.820 11.238 34.453 1.00 0.00 C +ATOM 27 H11R OL 1 30.529 11.998 34.777 1.00 0.00 H +ATOM 28 H11S OL 1 29.629 11.428 33.394 1.00 0.00 H +ATOM 29 C112 OL 1 30.435 9.831 34.609 1.00 0.00 C +ATOM 30 H12R OL 1 29.766 9.101 34.148 1.00 0.00 H +ATOM 31 H12S OL 1 30.521 9.568 35.665 1.00 0.00 H +ATOM 32 C113 OL 1 31.821 9.734 33.945 1.00 0.00 C +ATOM 33 H13R OL 1 32.087 8.682 33.817 1.00 0.00 H +ATOM 34 H13S OL 1 31.764 10.171 32.946 1.00 0.00 H +ATOM 35 C114 OL 1 32.925 10.419 34.784 1.00 0.00 C +ATOM 36 H14R OL 1 32.572 11.361 35.209 1.00 0.00 H +ATOM 37 H14S OL 1 33.189 9.770 35.622 1.00 0.00 H +ATOM 38 C115 OL 1 34.177 10.685 33.928 1.00 0.00 C +ATOM 39 H15R OL 1 34.375 9.816 33.296 1.00 0.00 H +ATOM 40 H15S OL 1 35.049 10.814 34.573 1.00 0.00 H +ATOM 41 C116 OL 1 34.002 11.936 33.044 1.00 0.00 C +ATOM 42 H16R OL 1 32.994 11.989 32.625 1.00 0.00 H +ATOM 43 H16S OL 1 34.676 11.846 32.199 1.00 0.00 H +ATOM 44 C117 OL 1 34.313 13.229 33.823 1.00 0.00 C +ATOM 45 H17R OL 1 33.475 13.473 34.480 1.00 0.00 H +ATOM 46 H17S OL 1 35.199 13.096 34.448 1.00 0.00 H +ATOM 47 C118 OL 1 34.563 14.398 32.865 1.00 0.00 C +ATOM 48 H18R OL 1 34.629 15.333 33.423 1.00 0.00 H +ATOM 49 H18S OL 1 33.757 14.465 32.136 1.00 0.00 H +ATOM 50 H18T OL 1 35.491 14.280 32.309 1.00 0.00 H +ATOM 51 C11 PC 2 32.919 9.871 44.416 1.00 0.00 C +ATOM 52 O12 PC 2 33.893 10.604 44.374 1.00 0.00 O +ATOM 53 O11 PC 2 32.466 9.274 45.545 1.00 0.00 O +ATOM 54 C1 PC 2 33.314 9.282 46.733 1.00 0.00 C +ATOM 55 HR PC 2 33.988 10.145 46.743 1.00 0.00 H +ATOM 56 HS PC 2 32.676 9.340 47.619 1.00 0.00 H +ATOM 57 C2 PC 2 34.114 7.967 46.804 1.00 0.00 C +ATOM 58 HX PC 2 33.407 7.143 46.943 1.00 0.00 H +ATOM 59 C3 PC 2 35.135 7.998 47.966 1.00 0.00 C +ATOM 60 HA PC 2 35.582 7.008 48.106 1.00 0.00 H +ATOM 61 HB PC 2 35.930 8.709 47.726 1.00 0.00 H +ATOM 62 O31 PC 2 34.471 8.412 49.192 1.00 0.00 O +ATOM 63 P31 PC 2 35.319 8.625 50.530 1.00 0.00 P +ATOM 64 O32 PC 2 34.435 9.734 51.250 1.00 0.00 O +ATOM 65 C31 PC 2 33.189 9.350 51.872 1.00 0.00 C +ATOM 66 H1A PC 2 32.366 9.539 51.180 1.00 0.00 H +ATOM 67 H1B PC 2 33.201 8.279 52.103 1.00 0.00 H +ATOM 68 C32 PC 2 33.019 10.121 53.199 1.00 0.00 C +ATOM 69 H2A PC 2 32.091 9.802 53.672 1.00 0.00 H +ATOM 70 H2B PC 2 33.838 9.855 53.866 1.00 0.00 H +ATOM 71 N31 PC 2 32.965 11.631 53.174 1.00 0.00 N +ATOM 72 C33 PC 2 34.332 12.209 52.939 1.00 0.00 C +ATOM 73 H3A PC 2 34.267 13.298 52.992 1.00 0.00 H +ATOM 74 H3B PC 2 34.997 11.831 53.718 1.00 0.00 H +ATOM 75 H3C PC 2 34.687 11.888 51.960 1.00 0.00 H +ATOM 76 C34 PC 2 32.013 12.101 52.117 1.00 0.00 C +ATOM 77 H4A PC 2 31.017 11.715 52.337 1.00 0.00 H +ATOM 78 H4B PC 2 31.996 13.190 52.115 1.00 0.00 H +ATOM 79 H4C PC 2 32.357 11.725 51.153 1.00 0.00 H +ATOM 80 C35 PC 2 32.477 12.121 54.508 1.00 0.00 C +ATOM 81 H5A PC 2 32.441 13.212 54.487 1.00 0.00 H +ATOM 82 H5B PC 2 33.168 11.773 55.280 1.00 0.00 H +ATOM 83 H5C PC 2 31.482 11.711 54.685 1.00 0.00 H +ATOM 84 O33 PC 2 35.418 7.405 51.361 1.00 0.00 O +ATOM 85 O34 PC 2 36.701 9.099 50.314 1.00 0.00 O +ATOM 86 O21 PC 2 34.825 7.789 45.549 1.00 0.00 O +ATOM 87 C21 PC 2 35.226 6.551 45.184 1.00 0.00 C +ATOM 88 O22 PC 2 34.980 5.544 45.826 1.00 0.00 O +ATOM 89 C12 OL2 3 35.955 6.540 43.858 1.00 0.00 C +ATOM 90 H2R OL2 3 36.358 5.543 43.670 1.00 0.00 H +ATOM 91 H2S OL2 3 36.801 7.224 43.931 1.00 0.00 H +ATOM 92 C13 OL2 3 35.083 6.995 42.668 1.00 0.00 C +ATOM 93 H3R OL2 3 35.740 7.161 41.812 1.00 0.00 H +ATOM 94 H3S OL2 3 34.612 7.953 42.898 1.00 0.00 H +ATOM 95 C14 OL2 3 34.004 5.954 42.293 1.00 0.00 C +ATOM 96 H4R OL2 3 33.306 5.854 43.128 1.00 0.00 H +ATOM 97 H4S OL2 3 34.465 4.977 42.137 1.00 0.00 H +ATOM 98 C15 OL2 3 33.210 6.370 41.032 1.00 0.00 C +ATOM 99 H5R OL2 3 32.896 7.407 41.142 1.00 0.00 H +ATOM 100 H5S OL2 3 32.298 5.772 40.966 1.00 0.00 H +ATOM 101 C16 OL2 3 34.004 6.224 39.712 1.00 0.00 C +ATOM 102 H6R OL2 3 35.012 6.629 39.820 1.00 0.00 H +ATOM 103 H6S OL2 3 33.503 6.819 38.945 1.00 0.00 H +ATOM 104 C17 OL2 3 34.062 4.758 39.230 1.00 0.00 C +ATOM 105 H7R OL2 3 33.042 4.384 39.122 1.00 0.00 H +ATOM 106 H7S OL2 3 34.564 4.131 39.971 1.00 0.00 H +ATOM 107 C18 OL2 3 34.778 4.627 37.871 1.00 0.00 C +ATOM 108 H8R OL2 3 34.380 5.369 37.176 1.00 0.00 H +ATOM 109 H8S OL2 3 34.538 3.647 37.453 1.00 0.00 H +ATOM 110 C19 OL2 3 36.286 4.729 38.000 1.00 0.00 C +ATOM 111 H9R OL2 3 36.759 3.883 38.494 1.00 0.00 H +ATOM 112 C110 OL2 3 37.053 5.699 37.513 1.00 0.00 C +ATOM 113 H10R OL2 3 38.132 5.636 37.642 1.00 0.00 H +ATOM 114 C111 OL2 3 36.561 6.971 36.855 1.00 0.00 C +ATOM 115 H11R OL2 3 37.328 7.742 36.952 1.00 0.00 H +ATOM 116 H11S OL2 3 35.679 7.344 37.380 1.00 0.00 H +ATOM 117 C112 OL2 3 36.216 6.788 35.365 1.00 0.00 C +ATOM 118 H12R OL2 3 35.864 7.749 34.981 1.00 0.00 H +ATOM 119 H12S OL2 3 35.391 6.081 35.262 1.00 0.00 H +ATOM 120 C113 OL2 3 37.409 6.308 34.509 1.00 0.00 C +ATOM 121 H13R OL2 3 37.734 5.313 34.820 1.00 0.00 H +ATOM 122 H13S OL2 3 38.251 6.988 34.651 1.00 0.00 H +ATOM 123 C114 OL2 3 36.995 6.286 33.024 1.00 0.00 C +ATOM 124 H14R OL2 3 36.320 7.125 32.849 1.00 0.00 H +ATOM 125 H14S OL2 3 36.441 5.373 32.809 1.00 0.00 H +ATOM 126 C115 OL2 3 38.201 6.397 32.069 1.00 0.00 C +ATOM 127 H15R OL2 3 38.826 5.506 32.163 1.00 0.00 H +ATOM 128 H15S OL2 3 38.817 7.243 32.366 1.00 0.00 H +ATOM 129 C116 OL2 3 37.787 6.579 30.589 1.00 0.00 C +ATOM 130 H16R OL2 3 37.322 5.661 30.224 1.00 0.00 H +ATOM 131 H16S OL2 3 38.692 6.741 29.999 1.00 0.00 H +ATOM 132 C117 OL2 3 36.819 7.766 30.366 1.00 0.00 C +ATOM 133 H17R OL2 3 37.183 8.652 30.891 1.00 0.00 H +ATOM 134 H17S OL2 3 35.834 7.520 30.770 1.00 0.00 H +ATOM 135 C118 OL2 3 36.662 8.096 28.872 1.00 0.00 C +ATOM 136 H18R OL2 3 36.332 7.216 28.317 1.00 0.00 H +ATOM 137 H18S OL2 3 37.610 8.441 28.454 1.00 0.00 H +ATOM 138 H18T OL2 3 35.920 8.886 28.740 1.00 0.00 H +ATOM 139 C12 OL 85 32.103 18.891 43.993 1.00 0.00 C +ATOM 140 H2R OL 85 31.377 19.328 43.330 1.00 0.00 H +ATOM 141 H2S OL 85 33.039 19.427 43.877 1.00 0.00 H +ATOM 142 C13 OL 85 32.249 17.448 43.509 1.00 0.00 C +ATOM 143 H3R OL 85 31.543 17.261 42.700 1.00 0.00 H +ATOM 144 H3S OL 85 31.985 16.788 44.317 1.00 0.00 H +ATOM 145 C14 OL 85 33.684 17.183 43.018 1.00 0.00 C +ATOM 146 H4R OL 85 33.906 17.824 42.160 1.00 0.00 H +ATOM 147 H4S OL 85 34.367 17.452 43.823 1.00 0.00 H +ATOM 148 C15 OL 85 33.940 15.709 42.671 1.00 0.00 C +ATOM 149 H5R OL 85 33.077 15.118 42.954 1.00 0.00 H +ATOM 150 H5S OL 85 34.778 15.350 43.270 1.00 0.00 H +ATOM 151 C16 OL 85 34.253 15.491 41.181 1.00 0.00 C +ATOM 152 H6R OL 85 33.417 15.836 40.575 1.00 0.00 H +ATOM 153 H6S OL 85 35.132 16.077 40.902 1.00 0.00 H +ATOM 154 C17 OL 85 34.517 13.996 40.916 1.00 0.00 C +ATOM 155 H7R OL 85 35.276 13.641 41.614 1.00 0.00 H +ATOM 156 H7S OL 85 33.608 13.421 41.106 1.00 0.00 H +ATOM 157 C18 OL 85 35.002 13.735 39.479 1.00 0.00 C +ATOM 158 H8R OL 85 35.757 14.474 39.208 1.00 0.00 H +ATOM 159 H8S OL 85 34.156 13.849 38.797 1.00 0.00 H +ATOM 160 C19 OL 85 35.560 12.329 39.386 1.00 0.00 C +ATOM 161 H9R OL 85 35.045 11.589 39.991 1.00 0.00 H +ATOM 162 C110 OL 85 36.652 11.949 38.733 1.00 0.00 C +ATOM 163 H10R OL 85 36.966 10.910 38.804 1.00 0.00 H +ATOM 164 C111 OL 85 37.519 12.829 37.859 1.00 0.00 C +ATOM 165 H11R OL 85 38.398 13.126 38.433 1.00 0.00 H +ATOM 166 H11S OL 85 36.994 13.741 37.571 1.00 0.00 H +ATOM 167 C112 OL 85 37.987 12.104 36.581 1.00 0.00 C +ATOM 168 H12R OL 85 38.638 12.783 36.027 1.00 0.00 H +ATOM 169 H12S OL 85 37.122 11.887 35.950 1.00 0.00 H +ATOM 170 C113 OL 85 38.756 10.796 36.882 1.00 0.00 C +ATOM 171 H13R OL 85 38.050 10.003 37.140 1.00 0.00 H +ATOM 172 H13S OL 85 39.394 10.955 37.749 1.00 0.00 H +ATOM 173 C114 OL 85 39.653 10.339 35.711 1.00 0.00 C +ATOM 174 H14R OL 85 40.216 9.454 36.013 1.00 0.00 H +ATOM 175 H14S OL 85 40.373 11.127 35.487 1.00 0.00 H +ATOM 176 C115 OL 85 38.825 10.010 34.456 1.00 0.00 C +ATOM 177 H15R OL 85 38.159 9.177 34.682 1.00 0.00 H +ATOM 178 H15S OL 85 38.185 10.856 34.226 1.00 0.00 H +ATOM 179 C116 OL 85 39.681 9.648 33.218 1.00 0.00 C +ATOM 180 H16R OL 85 40.291 8.768 33.432 1.00 0.00 H +ATOM 181 H16S OL 85 38.992 9.381 32.415 1.00 0.00 H +ATOM 182 C117 OL 85 40.581 10.794 32.706 1.00 0.00 C +ATOM 183 H17R OL 85 41.418 10.955 33.373 1.00 0.00 H +ATOM 184 H17S OL 85 40.039 11.728 32.699 1.00 0.00 H +ATOM 185 C118 OL 85 41.084 10.521 31.277 1.00 0.00 C +ATOM 186 H18R OL 85 41.707 11.349 30.933 1.00 0.00 H +ATOM 187 H18S OL 85 41.673 9.604 31.238 1.00 0.00 H +ATOM 188 H18T OL 85 40.242 10.418 30.589 1.00 0.00 H +ATOM 189 C11 PC 86 31.612 19.110 45.405 1.00 0.00 C +ATOM 190 O12 PC 86 30.757 18.425 45.929 1.00 0.00 O +ATOM 191 O11 PC 86 32.166 20.208 45.969 1.00 0.00 O +ATOM 192 C1 PC 86 31.564 20.826 47.147 1.00 0.00 C +ATOM 193 HR PC 86 31.662 21.911 47.035 1.00 0.00 H +ATOM 194 HS PC 86 30.501 20.574 47.187 1.00 0.00 H +ATOM 195 C2 PC 86 32.230 20.430 48.486 1.00 0.00 C +ATOM 196 HX PC 86 32.363 19.346 48.567 1.00 0.00 H +ATOM 197 C3 PC 86 31.428 20.982 49.680 1.00 0.00 C +ATOM 198 HA PC 86 31.942 20.781 50.623 1.00 0.00 H +ATOM 199 HB PC 86 31.374 22.065 49.578 1.00 0.00 H +ATOM 200 O31 PC 86 30.087 20.440 49.723 1.00 0.00 O +ATOM 201 P31 PC 86 29.820 19.069 50.477 1.00 0.00 P +ATOM 202 O32 PC 86 28.788 19.478 51.618 1.00 0.00 O +ATOM 203 C31 PC 86 29.214 20.252 52.756 1.00 0.00 C +ATOM 204 H1A PC 86 30.297 20.406 52.740 1.00 0.00 H +ATOM 205 H1B PC 86 28.725 21.230 52.702 1.00 0.00 H +ATOM 206 C32 PC 86 28.768 19.515 54.036 1.00 0.00 C +ATOM 207 H2A PC 86 28.792 20.213 54.873 1.00 0.00 H +ATOM 208 H2B PC 86 27.738 19.171 53.916 1.00 0.00 H +ATOM 209 N31 PC 86 29.575 18.310 54.478 1.00 0.00 N +ATOM 210 C33 PC 86 31.030 18.652 54.633 1.00 0.00 C +ATOM 211 H3A PC 86 31.427 18.918 53.651 1.00 0.00 H +ATOM 212 H3B PC 86 31.113 19.494 55.322 1.00 0.00 H +ATOM 213 H3C PC 86 31.549 17.776 55.027 1.00 0.00 H +ATOM 214 C34 PC 86 29.450 17.173 53.510 1.00 0.00 C +ATOM 215 H4A PC 86 29.955 16.300 53.927 1.00 0.00 H +ATOM 216 H4B PC 86 28.390 16.972 53.351 1.00 0.00 H +ATOM 217 H4C PC 86 29.925 17.459 52.575 1.00 0.00 H +ATOM 218 C35 PC 86 29.037 17.849 55.801 1.00 0.00 C +ATOM 219 H5A PC 86 29.666 17.040 56.171 1.00 0.00 H +ATOM 220 H5B PC 86 28.016 17.494 55.650 1.00 0.00 H +ATOM 221 H5C PC 86 29.045 18.692 56.495 1.00 0.00 H +ATOM 222 O33 PC 86 29.241 18.044 49.589 1.00 0.00 O +ATOM 223 O34 PC 86 31.057 18.449 51.013 1.00 0.00 O +ATOM 224 O21 PC 86 33.481 21.136 48.621 1.00 0.00 O +ATOM 225 C21 PC 86 34.612 20.640 48.108 1.00 0.00 C +ATOM 226 O22 PC 86 34.722 19.529 47.614 1.00 0.00 O +ATOM 227 C12 OL2 87 35.752 21.623 48.219 1.00 0.00 C +ATOM 228 H2R OL2 87 36.376 21.370 49.077 1.00 0.00 H +ATOM 229 H2S OL2 87 35.356 22.630 48.374 1.00 0.00 H +ATOM 230 C13 OL2 87 36.563 21.580 46.923 1.00 0.00 C +ATOM 231 H3R OL2 87 35.874 21.757 46.093 1.00 0.00 H +ATOM 232 H3S OL2 87 36.975 20.579 46.794 1.00 0.00 H +ATOM 233 C14 OL2 87 37.707 22.606 46.853 1.00 0.00 C +ATOM 234 H4R OL2 87 38.457 22.415 47.625 1.00 0.00 H +ATOM 235 H4S OL2 87 37.311 23.616 46.987 1.00 0.00 H +ATOM 236 C15 OL2 87 38.312 22.451 45.451 1.00 0.00 C +ATOM 237 H5R OL2 87 37.472 22.450 44.758 1.00 0.00 H +ATOM 238 H5S OL2 87 38.813 21.483 45.371 1.00 0.00 H +ATOM 239 C16 OL2 87 39.277 23.561 45.015 1.00 0.00 C +ATOM 240 H6R OL2 87 40.212 23.479 45.566 1.00 0.00 H +ATOM 241 H6S OL2 87 38.846 24.539 45.239 1.00 0.00 H +ATOM 242 C17 OL2 87 39.554 23.440 43.499 1.00 0.00 C +ATOM 243 H7R OL2 87 39.923 22.439 43.265 1.00 0.00 H +ATOM 244 H7S OL2 87 40.349 24.133 43.231 1.00 0.00 H +ATOM 245 C18 OL2 87 38.280 23.733 42.675 1.00 0.00 C +ATOM 246 H8R OL2 87 37.694 24.489 43.202 1.00 0.00 H +ATOM 247 H8S OL2 87 37.659 22.843 42.618 1.00 0.00 H +ATOM 248 C19 OL2 87 38.563 24.265 41.292 1.00 0.00 C +ATOM 249 H9R OL2 87 38.885 25.303 41.284 1.00 0.00 H +ATOM 250 C110 OL2 87 38.436 23.637 40.126 1.00 0.00 C +ATOM 251 H10R OL2 87 38.688 24.195 39.229 1.00 0.00 H +ATOM 252 C111 OL2 87 38.016 22.202 39.866 1.00 0.00 C +ATOM 253 H11R OL2 87 37.709 21.709 40.787 1.00 0.00 H +ATOM 254 H11S OL2 87 38.874 21.648 39.483 1.00 0.00 H +ATOM 255 C112 OL2 87 36.885 22.093 38.815 1.00 0.00 C +ATOM 256 H12R OL2 87 35.974 22.518 39.232 1.00 0.00 H +ATOM 257 H12S OL2 87 36.684 21.037 38.619 1.00 0.00 H +ATOM 258 C113 OL2 87 37.221 22.799 37.480 1.00 0.00 C +ATOM 259 H13R OL2 87 38.101 22.336 37.042 1.00 0.00 H +ATOM 260 H13S OL2 87 37.477 23.838 37.661 1.00 0.00 H +ATOM 261 C114 OL2 87 36.051 22.737 36.474 1.00 0.00 C +ATOM 262 H14R OL2 87 35.136 23.105 36.944 1.00 0.00 H +ATOM 263 H14S OL2 87 35.884 21.693 36.208 1.00 0.00 H +ATOM 264 C115 OL2 87 36.324 23.548 35.182 1.00 0.00 C +ATOM 265 H15R OL2 87 35.570 23.287 34.438 1.00 0.00 H +ATOM 266 H15S OL2 87 37.295 23.267 34.772 1.00 0.00 H +ATOM 267 C116 OL2 87 36.249 25.071 35.435 1.00 0.00 C +ATOM 268 H16R OL2 87 36.967 25.347 36.203 1.00 0.00 H +ATOM 269 H16S OL2 87 35.254 25.304 35.818 1.00 0.00 H +ATOM 270 C117 OL2 87 36.496 25.947 34.189 1.00 0.00 C +ATOM 271 H17R OL2 87 36.285 26.989 34.443 1.00 0.00 H +ATOM 272 H17S OL2 87 35.796 25.668 33.405 1.00 0.00 H +ATOM 273 C118 OL2 87 37.941 25.866 33.666 1.00 0.00 C +ATOM 274 H18R OL2 87 38.030 26.405 32.724 1.00 0.00 H +ATOM 275 H18S OL2 87 38.252 24.835 33.496 1.00 0.00 H +ATOM 276 H18T OL2 87 38.624 26.329 34.378 1.00 0.00 H +ATOM 277 C12 OL 91 27.243 15.678 45.045 1.00 0.00 C +ATOM 278 H2R OL 91 27.223 16.719 45.370 1.00 0.00 H +ATOM 279 H2S OL 91 28.203 15.266 45.365 1.00 0.00 H +ATOM 280 C13 OL 91 27.176 15.636 43.501 1.00 0.00 C +ATOM 281 H3R OL 91 27.229 14.600 43.161 1.00 0.00 H +ATOM 282 H3S OL 91 28.054 16.154 43.112 1.00 0.00 H +ATOM 283 C14 OL 91 25.920 16.314 42.917 1.00 0.00 C +ATOM 284 H4R OL 91 25.045 15.707 43.162 1.00 0.00 H +ATOM 285 H4S OL 91 25.777 17.297 43.372 1.00 0.00 H +ATOM 286 C15 OL 91 26.012 16.472 41.383 1.00 0.00 C +ATOM 287 H5R OL 91 26.438 15.570 40.942 1.00 0.00 H +ATOM 288 H5S OL 91 26.668 17.308 41.130 1.00 0.00 H +ATOM 289 C16 OL 91 24.603 16.695 40.805 1.00 0.00 C +ATOM 290 H6R OL 91 24.152 17.568 41.274 1.00 0.00 H +ATOM 291 H6S OL 91 23.987 15.836 41.083 1.00 0.00 H +ATOM 292 C17 OL 91 24.563 16.831 39.266 1.00 0.00 C +ATOM 293 H7R OL 91 23.725 16.232 38.903 1.00 0.00 H +ATOM 294 H7S OL 91 25.468 16.418 38.822 1.00 0.00 H +ATOM 295 C18 OL 91 24.368 18.284 38.783 1.00 0.00 C +ATOM 296 H8R OL 91 25.349 18.759 38.744 1.00 0.00 H +ATOM 297 H8S OL 91 23.759 18.835 39.494 1.00 0.00 H +ATOM 298 C19 OL 91 23.736 18.310 37.405 1.00 0.00 C +ATOM 299 H9R OL 91 24.120 17.550 36.728 1.00 0.00 H +ATOM 300 C110 OL 91 22.764 19.112 36.970 1.00 0.00 C +ATOM 301 H10R OL 91 22.407 18.981 35.950 1.00 0.00 H +ATOM 302 C111 OL 91 22.094 20.252 37.719 1.00 0.00 C +ATOM 303 H11R OL 91 21.048 19.989 37.891 1.00 0.00 H +ATOM 304 H11S OL 91 22.558 20.426 38.687 1.00 0.00 H +ATOM 305 C112 OL 91 22.135 21.569 36.916 1.00 0.00 C +ATOM 306 H12R OL 91 21.404 22.273 37.319 1.00 0.00 H +ATOM 307 H12S OL 91 21.858 21.367 35.878 1.00 0.00 H +ATOM 308 C113 OL 91 23.539 22.203 36.984 1.00 0.00 C +ATOM 309 H13R OL 91 23.728 22.577 37.992 1.00 0.00 H +ATOM 310 H13S OL 91 24.279 21.426 36.784 1.00 0.00 H +ATOM 311 C114 OL 91 23.722 23.347 35.966 1.00 0.00 C +ATOM 312 H14R OL 91 23.173 23.122 35.048 1.00 0.00 H +ATOM 313 H14S OL 91 23.319 24.278 36.373 1.00 0.00 H +ATOM 314 C115 OL 91 25.216 23.506 35.625 1.00 0.00 C +ATOM 315 H15R OL 91 25.583 22.566 35.217 1.00 0.00 H +ATOM 316 H15S OL 91 25.779 23.696 36.537 1.00 0.00 H +ATOM 317 C116 OL 91 25.459 24.627 34.596 1.00 0.00 C +ATOM 318 H16R OL 91 24.707 24.557 33.808 1.00 0.00 H +ATOM 319 H16S OL 91 25.324 25.592 35.085 1.00 0.00 H +ATOM 320 C117 OL 91 26.855 24.529 33.936 1.00 0.00 C +ATOM 321 H17R OL 91 27.006 23.518 33.552 1.00 0.00 H +ATOM 322 H17S OL 91 26.895 25.202 33.078 1.00 0.00 H +ATOM 323 C118 OL 91 28.011 24.888 34.888 1.00 0.00 C +ATOM 324 H18R OL 91 27.947 24.333 35.821 1.00 0.00 H +ATOM 325 H18S OL 91 28.970 24.659 34.419 1.00 0.00 H +ATOM 326 H18T OL 91 27.994 25.950 35.122 1.00 0.00 H +ATOM 327 C11 PC 92 26.128 14.934 45.756 1.00 0.00 C +ATOM 328 O12 PC 92 24.949 15.213 45.636 1.00 0.00 O +ATOM 329 O11 PC 92 26.582 13.944 46.562 1.00 0.00 O +ATOM 330 C1 PC 92 25.633 13.251 47.429 1.00 0.00 C +ATOM 331 HR PC 92 25.194 13.969 48.132 1.00 0.00 H +ATOM 332 HS PC 92 24.821 12.832 46.825 1.00 0.00 H +ATOM 333 C2 PC 92 26.352 12.122 48.211 1.00 0.00 C +ATOM 334 HX PC 92 25.626 11.613 48.854 1.00 0.00 H +ATOM 335 C3 PC 92 27.508 12.690 49.071 1.00 0.00 C +ATOM 336 HA PC 92 28.375 12.829 48.423 1.00 0.00 H +ATOM 337 HB PC 92 27.228 13.661 49.491 1.00 0.00 H +ATOM 338 O31 PC 92 27.899 11.803 50.158 1.00 0.00 O +ATOM 339 P31 PC 92 27.058 11.692 51.515 1.00 0.00 P +ATOM 340 O32 PC 92 26.029 10.571 51.077 1.00 0.00 O +ATOM 341 C31 PC 92 26.410 9.184 51.094 1.00 0.00 C +ATOM 342 H1A PC 92 27.033 8.980 50.217 1.00 0.00 H +ATOM 343 H1B PC 92 26.979 8.951 52.000 1.00 0.00 H +ATOM 344 C32 PC 92 25.104 8.369 51.037 1.00 0.00 C +ATOM 345 H2A PC 92 24.491 8.754 50.219 1.00 0.00 H +ATOM 346 H2B PC 92 25.338 7.324 50.830 1.00 0.00 H +ATOM 347 N31 PC 92 24.225 8.386 52.276 1.00 0.00 N +ATOM 348 C33 PC 92 22.976 7.618 51.969 1.00 0.00 C +ATOM 349 H3A PC 92 22.314 7.676 52.836 1.00 0.00 H +ATOM 350 H3B PC 92 22.496 8.094 51.110 1.00 0.00 H +ATOM 351 H3C PC 92 23.236 6.584 51.744 1.00 0.00 H +ATOM 352 C34 PC 92 24.914 7.747 53.447 1.00 0.00 C +ATOM 353 H4A PC 92 24.231 7.776 54.298 1.00 0.00 H +ATOM 354 H4B PC 92 25.174 6.720 53.192 1.00 0.00 H +ATOM 355 H4C PC 92 25.809 8.327 53.675 1.00 0.00 H +ATOM 356 C35 PC 92 23.832 9.782 52.669 1.00 0.00 C +ATOM 357 H5A PC 92 23.080 9.738 53.459 1.00 0.00 H +ATOM 358 H5B PC 92 23.423 10.280 51.786 1.00 0.00 H +ATOM 359 H5C PC 92 24.718 10.311 53.024 1.00 0.00 H +ATOM 360 O33 PC 92 27.856 11.247 52.677 1.00 0.00 O +ATOM 361 O34 PC 92 26.343 12.920 51.929 1.00 0.00 O +ATOM 362 O21 PC 92 26.898 11.197 47.225 1.00 0.00 O +ATOM 363 C21 PC 92 26.078 10.301 46.633 1.00 0.00 C +ATOM 364 O22 PC 92 25.008 9.955 47.099 1.00 0.00 O +ATOM 365 C12 OL2 93 26.595 9.836 45.287 1.00 0.00 C +ATOM 366 H2R OL2 93 27.220 8.954 45.439 1.00 0.00 H +ATOM 367 H2S OL2 93 27.230 10.608 44.855 1.00 0.00 H +ATOM 368 C13 OL2 93 25.468 9.508 44.279 1.00 0.00 C +ATOM 369 H3R OL2 93 24.873 8.682 44.676 1.00 0.00 H +ATOM 370 H3S OL2 93 25.912 9.152 43.347 1.00 0.00 H +ATOM 371 C14 OL2 93 24.522 10.700 43.984 1.00 0.00 C +ATOM 372 H4R OL2 93 24.107 11.082 44.919 1.00 0.00 H +ATOM 373 H4S OL2 93 23.675 10.337 43.398 1.00 0.00 H +ATOM 374 C15 OL2 93 25.184 11.869 43.220 1.00 0.00 C +ATOM 375 H5R OL2 93 26.068 12.230 43.750 1.00 0.00 H +ATOM 376 H5S OL2 93 24.470 12.696 43.193 1.00 0.00 H +ATOM 377 C16 OL2 93 25.551 11.485 41.770 1.00 0.00 C +ATOM 378 H6R OL2 93 24.721 10.937 41.317 1.00 0.00 H +ATOM 379 H6S OL2 93 26.426 10.831 41.766 1.00 0.00 H +ATOM 380 C17 OL2 93 25.834 12.743 40.928 1.00 0.00 C +ATOM 381 H7R OL2 93 26.682 13.281 41.353 1.00 0.00 H +ATOM 382 H7S OL2 93 24.966 13.407 40.964 1.00 0.00 H +ATOM 383 C18 OL2 93 26.133 12.387 39.462 1.00 0.00 C +ATOM 384 H8R OL2 93 25.321 11.782 39.062 1.00 0.00 H +ATOM 385 H8S OL2 93 27.039 11.779 39.426 1.00 0.00 H +ATOM 386 C19 OL2 93 26.352 13.651 38.656 1.00 0.00 C +ATOM 387 H9R OL2 93 27.167 14.272 39.017 1.00 0.00 H +ATOM 388 C110 OL2 93 25.661 14.069 37.600 1.00 0.00 C +ATOM 389 H10R OL2 93 25.943 15.014 37.143 1.00 0.00 H +ATOM 390 C111 OL2 93 24.481 13.379 36.943 1.00 0.00 C +ATOM 391 H11R OL2 93 23.591 14.001 37.063 1.00 0.00 H +ATOM 392 H11S OL2 93 24.271 12.422 37.415 1.00 0.00 H +ATOM 393 C112 OL2 93 24.713 13.139 35.439 1.00 0.00 C +ATOM 394 H12R OL2 93 23.852 12.609 35.026 1.00 0.00 H +ATOM 395 H12S OL2 93 25.588 12.498 35.306 1.00 0.00 H +ATOM 396 C113 OL2 93 24.918 14.456 34.665 1.00 0.00 C +ATOM 397 H13R OL2 93 25.789 14.977 35.065 1.00 0.00 H +ATOM 398 H13S OL2 93 24.051 15.107 34.804 1.00 0.00 H +ATOM 399 C114 OL2 93 25.122 14.181 33.162 1.00 0.00 C +ATOM 400 H14R OL2 93 24.203 13.756 32.752 1.00 0.00 H +ATOM 401 H14S OL2 93 25.918 13.446 33.017 1.00 0.00 H +ATOM 402 C115 OL2 93 25.467 15.466 32.387 1.00 0.00 C +ATOM 403 H15R OL2 93 24.760 16.249 32.663 1.00 0.00 H +ATOM 404 H15S OL2 93 25.350 15.278 31.318 1.00 0.00 H +ATOM 405 C116 OL2 93 26.904 15.951 32.671 1.00 0.00 C +ATOM 406 H16R OL2 93 27.630 15.187 32.384 1.00 0.00 H +ATOM 407 H16S OL2 93 27.025 16.133 33.740 1.00 0.00 H +ATOM 408 C117 OL2 93 27.203 17.264 31.934 1.00 0.00 C +ATOM 409 H17R OL2 93 28.062 17.732 32.412 1.00 0.00 H +ATOM 410 H17S OL2 93 26.358 17.942 32.032 1.00 0.00 H +ATOM 411 C118 OL2 93 27.493 17.060 30.442 1.00 0.00 C +ATOM 412 H18R OL2 93 28.380 16.440 30.300 1.00 0.00 H +ATOM 413 H18S OL2 93 27.667 18.028 29.967 1.00 0.00 H +ATOM 414 H18T OL2 93 26.644 16.582 29.951 1.00 0.00 H +ATOM 415 C12 OL 94 41.252 12.587 49.162 1.00 0.00 C +ATOM 416 H2R OL 94 41.657 13.166 49.990 1.00 0.00 H +ATOM 417 H2S OL 94 41.660 13.005 48.241 1.00 0.00 H +ATOM 418 C13 OL 94 41.659 11.101 49.299 1.00 0.00 C +ATOM 419 H3R OL 94 41.440 10.568 48.371 1.00 0.00 H +ATOM 420 H3S OL 94 41.062 10.636 50.087 1.00 0.00 H +ATOM 421 C14 OL 94 43.145 10.926 49.679 1.00 0.00 C +ATOM 422 H4R OL 94 43.316 9.885 49.957 1.00 0.00 H +ATOM 423 H4S OL 94 43.349 11.515 50.573 1.00 0.00 H +ATOM 424 C15 OL 94 44.124 11.348 48.556 1.00 0.00 C +ATOM 425 H5R OL 94 45.018 11.788 49.004 1.00 0.00 H +ATOM 426 H5S OL 94 43.670 12.120 47.938 1.00 0.00 H +ATOM 427 C16 OL 94 44.541 10.162 47.661 1.00 0.00 C +ATOM 428 H6R OL 94 44.976 10.540 46.736 1.00 0.00 H +ATOM 429 H6S OL 94 43.660 9.574 47.392 1.00 0.00 H +ATOM 430 C17 OL 94 45.582 9.280 48.376 1.00 0.00 C +ATOM 431 H7R OL 94 45.199 8.989 49.355 1.00 0.00 H +ATOM 432 H7S OL 94 46.490 9.861 48.540 1.00 0.00 H +ATOM 433 C18 OL 94 45.920 7.998 47.595 1.00 0.00 C +ATOM 434 H8R OL 94 45.012 7.574 47.166 1.00 0.00 H +ATOM 435 H8S OL 94 46.301 7.262 48.306 1.00 0.00 H +ATOM 436 C19 OL 94 46.990 8.229 46.547 1.00 0.00 C +ATOM 437 H9R OL 94 48.006 8.262 46.933 1.00 0.00 H +ATOM 438 C110 OL 94 46.795 8.358 45.241 1.00 0.00 C +ATOM 439 H10R OL 94 47.660 8.492 44.596 1.00 0.00 H +ATOM 440 C111 OL 94 45.452 8.407 44.540 1.00 0.00 C +ATOM 441 H11R OL 94 45.080 9.434 44.578 1.00 0.00 H +ATOM 442 H11S OL 94 44.713 7.774 45.034 1.00 0.00 H +ATOM 443 C112 OL 94 45.577 7.991 43.060 1.00 0.00 C +ATOM 444 H12R OL 94 45.671 6.905 43.001 1.00 0.00 H +ATOM 445 H12S OL 94 46.478 8.425 42.621 1.00 0.00 H +ATOM 446 C113 OL 94 44.352 8.467 42.254 1.00 0.00 C +ATOM 447 H13R OL 94 43.440 8.185 42.784 1.00 0.00 H +ATOM 448 H13S OL 94 44.370 9.557 42.185 1.00 0.00 H +ATOM 449 C114 OL 94 44.330 7.845 40.841 1.00 0.00 C +ATOM 450 H14R OL 94 45.223 8.136 40.281 1.00 0.00 H +ATOM 451 H14S OL 94 44.345 6.757 40.940 1.00 0.00 H +ATOM 452 C115 OL 94 43.060 8.249 40.065 1.00 0.00 C +ATOM 453 H15R OL 94 42.198 8.147 40.727 1.00 0.00 H +ATOM 454 H15S OL 94 42.908 7.556 39.234 1.00 0.00 H +ATOM 455 C116 OL 94 43.154 9.686 39.502 1.00 0.00 C +ATOM 456 H16R OL 94 43.854 9.688 38.664 1.00 0.00 H +ATOM 457 H16S OL 94 43.552 10.367 40.256 1.00 0.00 H +ATOM 458 C117 OL 94 41.791 10.223 39.020 1.00 0.00 C +ATOM 459 H17R OL 94 41.956 11.167 38.495 1.00 0.00 H +ATOM 460 H17S OL 94 41.346 9.527 38.305 1.00 0.00 H +ATOM 461 C118 OL 94 40.818 10.468 40.191 1.00 0.00 C +ATOM 462 H18R OL 94 39.947 11.035 39.856 1.00 0.00 H +ATOM 463 H18S OL 94 40.464 9.524 40.608 1.00 0.00 H +ATOM 464 H18T OL 94 41.306 11.037 40.985 1.00 0.00 H +ATOM 465 C11 PC 95 39.754 12.760 49.170 1.00 0.00 C +ATOM 466 O12 PC 95 39.007 12.140 49.909 1.00 0.00 O +ATOM 467 O11 PC 95 39.319 13.629 48.234 1.00 0.00 O +ATOM 468 C1 PC 95 37.889 13.809 48.022 1.00 0.00 C +ATOM 469 HR PC 95 37.749 13.974 46.950 1.00 0.00 H +ATOM 470 HS PC 95 37.332 12.905 48.288 1.00 0.00 H +ATOM 471 C2 PC 95 37.351 15.038 48.799 1.00 0.00 C +ATOM 472 HX PC 95 37.817 15.941 48.389 1.00 0.00 H +ATOM 473 C3 PC 95 37.602 14.999 50.326 1.00 0.00 C +ATOM 474 HA PC 95 37.122 14.125 50.778 1.00 0.00 H +ATOM 475 HB PC 95 38.679 14.947 50.517 1.00 0.00 H +ATOM 476 O31 PC 95 37.050 16.222 50.902 1.00 0.00 O +ATOM 477 P31 PC 95 37.805 17.005 52.072 1.00 0.00 P +ATOM 478 O32 PC 95 39.184 17.282 51.342 1.00 0.00 O +ATOM 479 C31 PC 95 39.340 18.377 50.422 1.00 0.00 C +ATOM 480 H1A PC 95 39.281 17.983 49.405 1.00 0.00 H +ATOM 481 H1B PC 95 38.552 19.122 50.568 1.00 0.00 H +ATOM 482 C32 PC 95 40.719 19.020 50.652 1.00 0.00 C +ATOM 483 H2A PC 95 41.481 18.389 50.209 1.00 0.00 H +ATOM 484 H2B PC 95 40.755 19.982 50.135 1.00 0.00 H +ATOM 485 N31 PC 95 41.149 19.276 52.081 1.00 0.00 N +ATOM 486 C33 PC 95 41.510 18.023 52.826 1.00 0.00 C +ATOM 487 H3A PC 95 41.894 18.302 53.803 1.00 0.00 H +ATOM 488 H3B PC 95 40.619 17.408 52.953 1.00 0.00 H +ATOM 489 H3C PC 95 42.260 17.475 52.258 1.00 0.00 H +ATOM 490 C34 PC 95 42.372 20.128 52.068 1.00 0.00 C +ATOM 491 H4A PC 95 43.155 19.602 51.522 1.00 0.00 H +ATOM 492 H4B PC 95 42.130 21.069 51.578 1.00 0.00 H +ATOM 493 H4C PC 95 42.663 20.311 53.102 1.00 0.00 H +ATOM 494 C35 PC 95 40.064 19.991 52.820 1.00 0.00 C +ATOM 495 H5A PC 95 39.759 20.851 52.225 1.00 0.00 H +ATOM 496 H5B PC 95 40.444 20.306 53.793 1.00 0.00 H +ATOM 497 H5C PC 95 39.227 19.304 52.945 1.00 0.00 H +ATOM 498 O33 PC 95 37.985 16.235 53.325 1.00 0.00 O +ATOM 499 O34 PC 95 37.123 18.270 52.449 1.00 0.00 O +ATOM 500 O21 PC 95 35.913 15.121 48.629 1.00 0.00 O +ATOM 501 C21 PC 95 35.385 15.457 47.433 1.00 0.00 C +ATOM 502 O22 PC 95 36.014 15.553 46.397 1.00 0.00 O +ATOM 503 C12 OL2 96 33.907 15.700 47.556 1.00 0.00 C +ATOM 504 H2R OL2 96 33.777 16.713 47.944 1.00 0.00 H +ATOM 505 H2S OL2 96 33.482 15.030 48.296 1.00 0.00 H +ATOM 506 C13 OL2 96 33.150 15.576 46.225 1.00 0.00 C +ATOM 507 H3R OL2 96 33.681 16.159 45.478 1.00 0.00 H +ATOM 508 H3S OL2 96 32.178 16.041 46.346 1.00 0.00 H +ATOM 509 C14 OL2 96 32.921 14.141 45.704 1.00 0.00 C +ATOM 510 H4R OL2 96 32.969 13.417 46.519 1.00 0.00 H +ATOM 511 H4S OL2 96 33.724 13.900 45.005 1.00 0.00 H +ATOM 512 C15 OL2 96 31.539 14.032 45.004 1.00 0.00 C +ATOM 513 H5R OL2 96 31.231 14.998 44.623 1.00 0.00 H +ATOM 514 H5S OL2 96 30.786 13.754 45.740 1.00 0.00 H +ATOM 515 C16 OL2 96 31.543 13.037 43.827 1.00 0.00 C +ATOM 516 H6R OL2 96 31.498 12.035 44.244 1.00 0.00 H +ATOM 517 H6S OL2 96 32.481 13.109 43.275 1.00 0.00 H +ATOM 518 C17 OL2 96 30.365 13.218 42.835 1.00 0.00 C +ATOM 519 H7R OL2 96 29.415 13.111 43.362 1.00 0.00 H +ATOM 520 H7S OL2 96 30.417 12.411 42.107 1.00 0.00 H +ATOM 521 C18 OL2 96 30.385 14.559 42.065 1.00 0.00 C +ATOM 522 H8R OL2 96 31.391 14.752 41.695 1.00 0.00 H +ATOM 523 H8S OL2 96 30.112 15.363 42.749 1.00 0.00 H +ATOM 524 C19 OL2 96 29.429 14.544 40.887 1.00 0.00 C +ATOM 525 H9R OL2 96 28.719 13.720 40.876 1.00 0.00 H +ATOM 526 C110 OL2 96 29.455 15.394 39.863 1.00 0.00 C +ATOM 527 H10R OL2 96 28.753 15.267 39.043 1.00 0.00 H +ATOM 528 C111 OL2 96 30.352 16.610 39.744 1.00 0.00 C +ATOM 529 H11R OL2 96 30.789 16.850 40.712 1.00 0.00 H +ATOM 530 H11S OL2 96 29.758 17.477 39.446 1.00 0.00 H +ATOM 531 C112 OL2 96 31.493 16.402 38.730 1.00 0.00 C +ATOM 532 H12R OL2 96 31.981 15.445 38.929 1.00 0.00 H +ATOM 533 H12S OL2 96 32.233 17.190 38.880 1.00 0.00 H +ATOM 534 C113 OL2 96 31.009 16.432 37.265 1.00 0.00 C +ATOM 535 H13R OL2 96 30.589 17.413 37.033 1.00 0.00 H +ATOM 536 H13S OL2 96 30.209 15.700 37.134 1.00 0.00 H +ATOM 537 C114 OL2 96 32.149 16.092 36.277 1.00 0.00 C +ATOM 538 H14R OL2 96 31.732 16.025 35.270 1.00 0.00 H +ATOM 539 H14S OL2 96 32.544 15.102 36.520 1.00 0.00 H +ATOM 540 C115 OL2 96 33.319 17.106 36.269 1.00 0.00 C +ATOM 541 H15R OL2 96 34.086 16.724 35.592 1.00 0.00 H +ATOM 542 H15S OL2 96 33.778 17.178 37.257 1.00 0.00 H +ATOM 543 C116 OL2 96 32.882 18.506 35.787 1.00 0.00 C +ATOM 544 H16R OL2 96 32.283 19.004 36.553 1.00 0.00 H +ATOM 545 H16S OL2 96 32.254 18.392 34.904 1.00 0.00 H +ATOM 546 C117 OL2 96 34.099 19.381 35.423 1.00 0.00 C +ATOM 547 H17R OL2 96 34.783 18.816 34.786 1.00 0.00 H +ATOM 548 H17S OL2 96 34.641 19.656 36.331 1.00 0.00 H +ATOM 549 C118 OL2 96 33.662 20.648 34.668 1.00 0.00 C +ATOM 550 H18R OL2 96 34.534 21.238 34.384 1.00 0.00 H +ATOM 551 H18S OL2 96 33.128 20.383 33.754 1.00 0.00 H +ATOM 552 H18T OL2 96 33.010 21.265 35.290 1.00 0.00 H +ATOM 553 C12 OL 112 35.230 17.578 17.575 1.00 0.00 C +ATOM 554 H2R OL 112 35.255 17.561 16.484 1.00 0.00 H +ATOM 555 H2S OL 112 34.224 17.880 17.876 1.00 0.00 H +ATOM 556 C13 OL 112 36.252 18.604 18.103 1.00 0.00 C +ATOM 557 H3R OL 112 36.028 19.588 17.691 1.00 0.00 H +ATOM 558 H3S OL 112 37.251 18.339 17.762 1.00 0.00 H +ATOM 559 C14 OL 112 36.235 18.690 19.638 1.00 0.00 C +ATOM 560 H4R OL 112 36.711 17.800 20.056 1.00 0.00 H +ATOM 561 H4S OL 112 35.202 18.717 19.992 1.00 0.00 H +ATOM 562 C15 OL 112 36.968 19.957 20.119 1.00 0.00 C +ATOM 563 H5R OL 112 36.357 20.840 19.915 1.00 0.00 H +ATOM 564 H5S OL 112 37.899 20.070 19.561 1.00 0.00 H +ATOM 565 C16 OL 112 37.309 19.887 21.618 1.00 0.00 C +ATOM 566 H6R OL 112 37.850 20.793 21.894 1.00 0.00 H +ATOM 567 H6S OL 112 37.976 19.040 21.780 1.00 0.00 H +ATOM 568 C17 OL 112 36.063 19.756 22.521 1.00 0.00 C +ATOM 569 H7R OL 112 35.492 18.864 22.259 1.00 0.00 H +ATOM 570 H7S OL 112 35.415 20.621 22.365 1.00 0.00 H +ATOM 571 C18 OL 112 36.450 19.677 24.009 1.00 0.00 C +ATOM 572 H8R OL 112 37.065 20.546 24.251 1.00 0.00 H +ATOM 573 H8S OL 112 35.539 19.757 24.600 1.00 0.00 H +ATOM 574 C19 OL 112 37.222 18.405 24.324 1.00 0.00 C +ATOM 575 H9R OL 112 38.030 18.179 23.632 1.00 0.00 H +ATOM 576 C110 OL 112 37.016 17.567 25.335 1.00 0.00 C +ATOM 577 H10R OL 112 37.657 16.694 25.428 1.00 0.00 H +ATOM 578 C111 OL 112 35.958 17.696 26.409 1.00 0.00 C +ATOM 579 H11R OL 112 35.289 18.517 26.190 1.00 0.00 H +ATOM 580 H11S OL 112 36.439 17.916 27.362 1.00 0.00 H +ATOM 581 C112 OL 112 35.120 16.409 26.530 1.00 0.00 C +ATOM 582 H12R OL 112 34.773 16.128 25.534 1.00 0.00 H +ATOM 583 H12S OL 112 35.742 15.592 26.903 1.00 0.00 H +ATOM 584 C113 OL 112 33.886 16.596 27.442 1.00 0.00 C +ATOM 585 H13R OL 112 33.305 17.457 27.105 1.00 0.00 H +ATOM 586 H13S OL 112 33.241 15.721 27.350 1.00 0.00 H +ATOM 587 C114 OL 112 34.275 16.773 28.921 1.00 0.00 C +ATOM 588 H14R OL 112 34.845 15.904 29.249 1.00 0.00 H +ATOM 589 H14S OL 112 34.919 17.645 29.039 1.00 0.00 H +ATOM 590 C115 OL 112 33.039 16.915 29.829 1.00 0.00 C +ATOM 591 H15R OL 112 32.479 15.979 29.786 1.00 0.00 H +ATOM 592 H15S OL 112 32.383 17.716 29.480 1.00 0.00 H +ATOM 593 C116 OL 112 33.505 17.206 31.270 1.00 0.00 C +ATOM 594 H16R OL 112 34.316 16.524 31.509 1.00 0.00 H +ATOM 595 H16S OL 112 33.948 18.202 31.311 1.00 0.00 H +ATOM 596 C117 OL 112 32.413 17.108 32.362 1.00 0.00 C +ATOM 597 H17R OL 112 32.906 16.896 33.311 1.00 0.00 H +ATOM 598 H17S OL 112 31.941 18.081 32.475 1.00 0.00 H +ATOM 599 C118 OL 112 31.319 16.044 32.127 1.00 0.00 C +ATOM 600 H18R OL 112 30.708 16.302 31.260 1.00 0.00 H +ATOM 601 H18S OL 112 31.749 15.056 31.962 1.00 0.00 H +ATOM 602 H18T OL 112 30.661 15.986 32.996 1.00 0.00 H +ATOM 603 C11 PC 113 35.502 16.178 18.066 1.00 0.00 C +ATOM 604 O12 PC 113 36.590 15.637 17.992 1.00 0.00 O +ATOM 605 O11 PC 113 34.395 15.586 18.568 1.00 0.00 O +ATOM 606 C1 PC 113 34.377 14.143 18.752 1.00 0.00 C +ATOM 607 HR PC 113 35.282 13.818 19.276 1.00 0.00 H +ATOM 608 HS PC 113 33.500 13.880 19.351 1.00 0.00 H +ATOM 609 C2 PC 113 34.274 13.454 17.372 1.00 0.00 C +ATOM 610 HX PC 113 35.212 13.581 16.822 1.00 0.00 H +ATOM 611 C3 PC 113 33.131 14.021 16.511 1.00 0.00 C +ATOM 612 HA PC 113 32.554 13.197 16.078 1.00 0.00 H +ATOM 613 HB PC 113 32.454 14.653 17.094 1.00 0.00 H +ATOM 614 O31 PC 113 33.735 14.793 15.447 1.00 0.00 O +ATOM 615 P31 PC 113 32.915 15.050 14.111 1.00 0.00 P +ATOM 616 O32 PC 113 31.650 15.845 14.694 1.00 0.00 O +ATOM 617 C31 PC 113 31.768 17.171 15.276 1.00 0.00 C +ATOM 618 H1A PC 113 30.813 17.449 15.736 1.00 0.00 H +ATOM 619 H1B PC 113 32.528 17.149 16.065 1.00 0.00 H +ATOM 620 C32 PC 113 32.163 18.216 14.208 1.00 0.00 C +ATOM 621 H2A PC 113 32.325 19.181 14.694 1.00 0.00 H +ATOM 622 H2B PC 113 33.101 17.921 13.743 1.00 0.00 H +ATOM 623 N31 PC 113 31.200 18.484 13.073 1.00 0.00 N +ATOM 624 C33 PC 113 30.845 17.249 12.295 1.00 0.00 C +ATOM 625 H3A PC 113 31.768 16.776 11.957 1.00 0.00 H +ATOM 626 H3B PC 113 30.289 16.574 12.945 1.00 0.00 H +ATOM 627 H3C PC 113 30.239 17.536 11.437 1.00 0.00 H +ATOM 628 C34 PC 113 29.952 19.117 13.597 1.00 0.00 C +ATOM 629 H4A PC 113 30.226 20.057 14.077 1.00 0.00 H +ATOM 630 H4B PC 113 29.272 19.298 12.763 1.00 0.00 H +ATOM 631 H4C PC 113 29.496 18.447 14.325 1.00 0.00 H +ATOM 632 C35 PC 113 31.857 19.447 12.141 1.00 0.00 C +ATOM 633 H5A PC 113 32.751 18.979 11.728 1.00 0.00 H +ATOM 634 H5B PC 113 32.119 20.343 12.704 1.00 0.00 H +ATOM 635 H5C PC 113 31.155 19.693 11.342 1.00 0.00 H +ATOM 636 O33 PC 113 33.696 15.807 13.107 1.00 0.00 O +ATOM 637 O34 PC 113 32.531 13.784 13.445 1.00 0.00 O +ATOM 638 O21 PC 113 34.004 12.042 17.537 1.00 0.00 O +ATOM 639 C21 PC 113 35.026 11.166 17.617 1.00 0.00 C +ATOM 640 O22 PC 113 36.204 11.474 17.625 1.00 0.00 O +ATOM 641 C12 OL2 114 34.555 9.740 17.753 1.00 0.00 C +ATOM 642 H2R OL2 114 35.424 9.079 17.770 1.00 0.00 H +ATOM 643 H2S OL2 114 33.952 9.480 16.881 1.00 0.00 H +ATOM 644 C13 OL2 114 33.722 9.540 19.035 1.00 0.00 C +ATOM 645 H3R OL2 114 33.474 8.482 19.142 1.00 0.00 H +ATOM 646 H3S OL2 114 32.782 10.092 18.952 1.00 0.00 H +ATOM 647 C14 OL2 114 34.496 10.024 20.276 1.00 0.00 C +ATOM 648 H4R OL2 114 34.701 11.094 20.192 1.00 0.00 H +ATOM 649 H4S OL2 114 35.456 9.507 20.337 1.00 0.00 H +ATOM 650 C15 OL2 114 33.701 9.781 21.566 1.00 0.00 C +ATOM 651 H5R OL2 114 33.558 8.709 21.720 1.00 0.00 H +ATOM 652 H5S OL2 114 32.716 10.250 21.489 1.00 0.00 H +ATOM 653 C16 OL2 114 34.468 10.390 22.748 1.00 0.00 C +ATOM 654 H6R OL2 114 34.580 11.463 22.580 1.00 0.00 H +ATOM 655 H6S OL2 114 35.470 9.957 22.799 1.00 0.00 H +ATOM 656 C17 OL2 114 33.736 10.137 24.075 1.00 0.00 C +ATOM 657 H7R OL2 114 33.691 9.063 24.268 1.00 0.00 H +ATOM 658 H7S OL2 114 32.709 10.507 24.015 1.00 0.00 H +ATOM 659 C18 OL2 114 34.462 10.834 25.235 1.00 0.00 C +ATOM 660 H8R OL2 114 35.512 10.534 25.234 1.00 0.00 H +ATOM 661 H8S OL2 114 34.036 10.476 26.171 1.00 0.00 H +ATOM 662 C19 OL2 114 34.365 12.344 25.110 1.00 0.00 C +ATOM 663 H9R OL2 114 34.881 12.774 24.254 1.00 0.00 H +ATOM 664 C110 OL2 114 33.739 13.155 25.956 1.00 0.00 C +ATOM 665 H10R OL2 114 33.744 14.225 25.768 1.00 0.00 H +ATOM 666 C111 OL2 114 32.990 12.719 27.197 1.00 0.00 C +ATOM 667 H11R OL2 114 32.617 11.699 27.097 1.00 0.00 H +ATOM 668 H11S OL2 114 32.110 13.354 27.326 1.00 0.00 H +ATOM 669 C112 OL2 114 33.863 12.826 28.461 1.00 0.00 C +ATOM 670 H12R OL2 114 33.327 12.375 29.300 1.00 0.00 H +ATOM 671 H12S OL2 114 34.007 13.879 28.703 1.00 0.00 H +ATOM 672 C113 OL2 114 35.248 12.156 28.308 1.00 0.00 C +ATOM 673 H13R OL2 114 35.828 12.678 27.545 1.00 0.00 H +ATOM 674 H13S OL2 114 35.146 11.111 28.011 1.00 0.00 H +ATOM 675 C114 OL2 114 35.985 12.233 29.647 1.00 0.00 C +ATOM 676 H14R OL2 114 35.776 13.212 30.085 1.00 0.00 H +ATOM 677 H14S OL2 114 35.580 11.471 30.314 1.00 0.00 H +ATOM 678 C115 OL2 114 37.515 12.056 29.541 1.00 0.00 C +ATOM 679 H15R OL2 114 37.873 12.427 28.578 1.00 0.00 H +ATOM 680 H15S OL2 114 37.769 10.995 29.601 1.00 0.00 H +ATOM 681 C116 OL2 114 38.233 12.841 30.662 1.00 0.00 C +ATOM 682 H16R OL2 114 38.114 13.903 30.476 1.00 0.00 H +ATOM 683 H16S OL2 114 39.304 12.636 30.634 1.00 0.00 H +ATOM 684 C117 OL2 114 37.664 12.528 32.058 1.00 0.00 C +ATOM 685 H17R OL2 114 37.934 11.514 32.326 1.00 0.00 H +ATOM 686 H17S OL2 114 36.586 12.544 32.044 1.00 0.00 H +ATOM 687 C118 OL2 114 38.102 13.554 33.118 1.00 0.00 C +ATOM 688 H18R OL2 114 37.829 14.564 32.805 1.00 0.00 H +ATOM 689 H18S OL2 114 39.176 13.522 33.286 1.00 0.00 H +ATOM 690 H18T OL2 114 37.599 13.350 34.063 1.00 0.00 H +END diff --git a/test/Test_DistBasedMask/RunTest.sh b/test/Test_DistBasedMask/RunTest.sh index aab3a54f67..0798c8ff92 100755 --- a/test/Test_DistBasedMask/RunTest.sh +++ b/test/Test_DistBasedMask/RunTest.sh @@ -3,7 +3,8 @@ . ../MasterTest.sh # Clean -CleanFiles mask.in First.pdb.1 Second.pdb.1 Third.pdb.1 Fourth.pdb.1 +CleanFiles mask.in First.pdb.1 Second.pdb.1 Third.pdb.1 Fourth.pdb.1 \ + Fifth.pdb.1 # NOTE: This also tests activeref TESTNAME='Distance-based atom mask tests' @@ -34,12 +35,26 @@ outtraj Fourth.pdb.1 pdb noter run EOF -RunCpptraj "$TESTNAME" +RunCpptraj "$TESTNAME (atom, residue)" DoTest First.pdb.1.save First.pdb.1 DoTest Second.pdb.1.save Second.pdb.1 DoTest Third.pdb.1.save Third.pdb.1 DoTest Fourth.pdb.1.save Fourth.pdb.1 +cat > mask.in < Date: Tue, 26 Sep 2017 13:23:07 -0400 Subject: [PATCH 17/27] DRR - Cpptraj: Add distance based mask outside molecule selection test --- test/Test_DistBasedMask/RunTest.sh | 7 +- test/Test_DistBasedMask/Sixth.pdb.1.save | 830 +++++++++++++++++++++++ 2 files changed, 836 insertions(+), 1 deletion(-) create mode 100644 test/Test_DistBasedMask/Sixth.pdb.1.save diff --git a/test/Test_DistBasedMask/RunTest.sh b/test/Test_DistBasedMask/RunTest.sh index 0798c8ff92..2730500f17 100755 --- a/test/Test_DistBasedMask/RunTest.sh +++ b/test/Test_DistBasedMask/RunTest.sh @@ -4,7 +4,7 @@ # Clean CleanFiles mask.in First.pdb.1 Second.pdb.1 Third.pdb.1 Fourth.pdb.1 \ - Fifth.pdb.1 + Fifth.pdb.1 Sixth.pdb.1 # NOTE: This also tests activeref TESTNAME='Distance-based atom mask tests' @@ -49,11 +49,16 @@ reference ../DOPC.rst7 # Molecules within 3 Ang of residue 1 strip !(:1<^3.0) outtraj Fifth.pdb.1 pdb noter +unstrip +# Molecules outside 10 Ang of residue 24 +strip (!(:24>^22.0))|:WAT +outtraj Sixth.pdb.1 pdb noter run EOF RunCpptraj "$TESTNAME (molecule)" DoTest Fifth.pdb.1.save Fifth.pdb.1 +DoTest Sixth.pdb.1.save Sixth.pdb.1 EndTest diff --git a/test/Test_DistBasedMask/Sixth.pdb.1.save b/test/Test_DistBasedMask/Sixth.pdb.1.save new file mode 100644 index 0000000000..df86b68ab3 --- /dev/null +++ b/test/Test_DistBasedMask/Sixth.pdb.1.save @@ -0,0 +1,830 @@ +CRYST1 59.446 61.825 66.459 90.00 90.00 90.00 1 +ATOM 1 C12 OL 61 56.758 7.051 46.151 1.00 0.00 C +ATOM 2 H2R OL 61 55.776 6.597 46.290 1.00 0.00 H +ATOM 3 H2S OL 61 56.702 7.675 45.256 1.00 0.00 H +ATOM 4 C13 OL 61 57.829 5.963 45.953 1.00 0.00 C +ATOM 5 H3R OL 61 57.872 5.322 46.836 1.00 0.00 H +ATOM 6 H3S OL 61 58.806 6.439 45.837 1.00 0.00 H +ATOM 7 C14 OL 61 57.528 5.105 44.712 1.00 0.00 C +ATOM 8 H4R OL 61 57.423 5.752 43.837 1.00 0.00 H +ATOM 9 H4S OL 61 56.585 4.572 44.850 1.00 0.00 H +ATOM 10 C15 OL 61 58.670 4.102 44.472 1.00 0.00 C +ATOM 11 H5R OL 61 58.777 3.444 45.339 1.00 0.00 H +ATOM 12 H5S OL 61 59.607 4.652 44.356 1.00 0.00 H +ATOM 13 C16 OL 61 58.414 3.259 43.211 1.00 0.00 C +ATOM 14 H6R OL 61 58.183 3.925 42.376 1.00 0.00 H +ATOM 15 H6S OL 61 57.552 2.605 43.365 1.00 0.00 H +ATOM 16 C17 OL 61 59.658 2.422 42.861 1.00 0.00 C +ATOM 17 H7R OL 61 60.523 3.086 42.799 1.00 0.00 H +ATOM 18 H7S OL 61 59.859 1.693 43.650 1.00 0.00 H +ATOM 19 C18 OL 61 59.481 1.701 41.513 1.00 0.00 C +ATOM 20 H8R OL 61 58.777 0.874 41.629 1.00 0.00 H +ATOM 21 H8S OL 61 59.044 2.386 40.782 1.00 0.00 H +ATOM 22 C19 OL 61 60.808 1.184 41.001 1.00 0.00 C +ATOM 23 H9R OL 61 61.042 0.154 41.266 1.00 0.00 H +ATOM 24 C110 OL 61 61.640 1.867 40.222 1.00 0.00 C +ATOM 25 H10R OL 61 62.554 1.389 39.875 1.00 0.00 H +ATOM 26 C111 OL 61 61.459 3.317 39.812 1.00 0.00 C +ATOM 27 H11R OL 61 61.027 3.362 38.811 1.00 0.00 H +ATOM 28 H11S OL 61 60.758 3.822 40.478 1.00 0.00 H +ATOM 29 C112 OL 61 62.787 4.106 39.827 1.00 0.00 C +ATOM 30 H12R OL 61 62.573 5.148 39.576 1.00 0.00 H +ATOM 31 H12S OL 61 63.196 4.102 40.840 1.00 0.00 H +ATOM 32 C113 OL 61 63.857 3.569 38.848 1.00 0.00 C +ATOM 33 H13R OL 61 64.215 2.592 39.180 1.00 0.00 H +ATOM 34 H13S OL 61 64.712 4.248 38.870 1.00 0.00 H +ATOM 35 C114 OL 61 63.326 3.462 37.404 1.00 0.00 C +ATOM 36 H14R OL 61 62.776 4.371 37.150 1.00 0.00 H +ATOM 37 H14S OL 61 62.634 2.619 37.336 1.00 0.00 H +ATOM 38 C115 OL 61 64.461 3.267 36.384 1.00 0.00 C +ATOM 39 H15R OL 61 65.068 2.403 36.663 1.00 0.00 H +ATOM 40 H15S OL 61 65.105 4.149 36.399 1.00 0.00 H +ATOM 41 C116 OL 61 63.874 3.052 34.973 1.00 0.00 C +ATOM 42 H16R OL 61 63.313 2.115 34.966 1.00 0.00 H +ATOM 43 H16S OL 61 63.170 3.853 34.736 1.00 0.00 H +ATOM 44 C117 OL 61 64.959 2.986 33.878 1.00 0.00 C +ATOM 45 H17R OL 61 65.728 2.262 34.157 1.00 0.00 H +ATOM 46 H17S OL 61 64.501 2.635 32.951 1.00 0.00 H +ATOM 47 C118 OL 61 65.605 4.359 33.616 1.00 0.00 C +ATOM 48 H18R OL 61 66.151 4.710 34.494 1.00 0.00 H +ATOM 49 H18S OL 61 66.308 4.292 32.783 1.00 0.00 H +ATOM 50 H18T OL 61 64.842 5.098 33.360 1.00 0.00 H +ATOM 51 C11 PC 62 57.069 7.933 47.336 1.00 0.00 C +ATOM 52 O12 PC 62 57.867 7.646 48.218 1.00 0.00 O +ATOM 53 O11 PC 62 56.432 9.119 47.252 1.00 0.00 O +ATOM 54 C1 PC 62 56.701 10.151 48.236 1.00 0.00 C +ATOM 55 HR PC 62 55.949 10.933 48.134 1.00 0.00 H +ATOM 56 HS PC 62 56.613 9.722 49.239 1.00 0.00 H +ATOM 57 C2 PC 62 58.117 10.737 48.039 1.00 0.00 C +ATOM 58 HX PC 62 58.857 9.932 48.090 1.00 0.00 H +ATOM 59 C3 PC 62 58.429 11.749 49.159 1.00 0.00 C +ATOM 60 HA PC 62 59.299 12.354 48.898 1.00 0.00 H +ATOM 61 HB PC 62 57.580 12.415 49.348 1.00 0.00 H +ATOM 62 O31 PC 62 58.732 10.986 50.348 1.00 0.00 O +ATOM 63 P31 PC 62 59.260 11.749 51.641 1.00 0.00 P +ATOM 64 O32 PC 62 59.491 10.550 52.673 1.00 0.00 O +ATOM 65 C31 PC 62 60.097 9.294 52.289 1.00 0.00 C +ATOM 66 H1A PC 62 60.922 9.487 51.595 1.00 0.00 H +ATOM 67 H1B PC 62 60.506 8.824 53.190 1.00 0.00 H +ATOM 68 C32 PC 62 59.049 8.353 51.638 1.00 0.00 C +ATOM 69 H2A PC 62 58.697 8.776 50.696 1.00 0.00 H +ATOM 70 H2B PC 62 59.529 7.399 51.415 1.00 0.00 H +ATOM 71 N31 PC 62 57.806 8.010 52.435 1.00 0.00 N +ATOM 72 C33 PC 62 56.939 9.210 52.692 1.00 0.00 C +ATOM 73 H3A PC 62 57.458 9.890 53.367 1.00 0.00 H +ATOM 74 H3B PC 62 56.731 9.699 51.739 1.00 0.00 H +ATOM 75 H3C PC 62 56.014 8.864 53.152 1.00 0.00 H +ATOM 76 C34 PC 62 57.004 7.001 51.665 1.00 0.00 C +ATOM 77 H4A PC 62 57.601 6.097 51.544 1.00 0.00 H +ATOM 78 H4B PC 62 56.092 6.786 52.228 1.00 0.00 H +ATOM 79 H4C PC 62 56.745 7.428 50.693 1.00 0.00 H +ATOM 80 C35 PC 62 58.180 7.409 53.749 1.00 0.00 C +ATOM 81 H5A PC 62 58.738 8.147 54.328 1.00 0.00 H +ATOM 82 H5B PC 62 58.790 6.524 53.568 1.00 0.00 H +ATOM 83 H5C PC 62 57.268 7.128 54.275 1.00 0.00 H +ATOM 84 O33 PC 62 60.495 12.518 51.414 1.00 0.00 O +ATOM 85 O34 PC 62 58.248 12.665 52.185 1.00 0.00 O +ATOM 86 O21 PC 62 58.207 11.372 46.731 1.00 0.00 O +ATOM 87 C21 PC 62 59.426 11.634 46.203 1.00 0.00 C +ATOM 88 O22 PC 62 60.478 11.392 46.765 1.00 0.00 O +ATOM 89 C12 OL2 63 59.365 12.285 44.837 1.00 0.00 C +ATOM 90 H2R OL2 63 60.247 12.920 44.731 1.00 0.00 H +ATOM 91 H2S OL2 63 58.505 12.948 44.783 1.00 0.00 H +ATOM 92 C13 OL2 63 59.336 11.284 43.656 1.00 0.00 C +ATOM 93 H3R OL2 63 60.240 10.672 43.676 1.00 0.00 H +ATOM 94 H3S OL2 63 59.366 11.867 42.734 1.00 0.00 H +ATOM 95 C14 OL2 63 58.091 10.361 43.639 1.00 0.00 C +ATOM 96 H4R OL2 63 57.182 10.957 43.739 1.00 0.00 H +ATOM 97 H4S OL2 63 58.137 9.690 44.500 1.00 0.00 H +ATOM 98 C15 OL2 63 58.001 9.505 42.348 1.00 0.00 C +ATOM 99 H5R OL2 63 57.254 8.721 42.495 1.00 0.00 H +ATOM 100 H5S OL2 63 58.959 9.013 42.163 1.00 0.00 H +ATOM 101 C16 OL2 63 57.598 10.349 41.119 1.00 0.00 C +ATOM 102 H6R OL2 63 58.344 11.129 40.960 1.00 0.00 H +ATOM 103 H6S OL2 63 56.653 10.847 41.332 1.00 0.00 H +ATOM 104 C17 OL2 63 57.489 9.527 39.810 1.00 0.00 C +ATOM 105 H7R OL2 63 58.198 8.697 39.830 1.00 0.00 H +ATOM 106 H7S OL2 63 57.796 10.170 38.980 1.00 0.00 H +ATOM 107 C18 OL2 63 56.063 8.994 39.519 1.00 0.00 C +ATOM 108 H8R OL2 63 55.398 9.221 40.356 1.00 0.00 H +ATOM 109 H8S OL2 63 56.106 7.907 39.439 1.00 0.00 H +ATOM 110 C19 OL2 63 55.496 9.612 38.251 1.00 0.00 C +ATOM 111 H9R OL2 63 55.256 10.667 38.322 1.00 0.00 H +ATOM 112 C110 OL2 63 55.314 9.012 37.080 1.00 0.00 C +ATOM 113 H10R OL2 63 54.926 9.590 36.243 1.00 0.00 H +ATOM 114 C111 OL2 63 55.508 7.541 36.803 1.00 0.00 C +ATOM 115 H11R OL2 63 54.831 7.238 36.003 1.00 0.00 H +ATOM 116 H11S OL2 63 55.236 6.956 37.682 1.00 0.00 H +ATOM 117 C112 OL2 63 56.946 7.197 36.388 1.00 0.00 C +ATOM 118 H12R OL2 63 57.645 7.567 37.141 1.00 0.00 H +ATOM 119 H12S OL2 63 57.188 7.673 35.435 1.00 0.00 H +ATOM 120 C113 OL2 63 57.067 5.667 36.269 1.00 0.00 C +ATOM 121 H13R OL2 63 56.391 5.307 35.489 1.00 0.00 H +ATOM 122 H13S OL2 63 56.751 5.213 37.212 1.00 0.00 H +ATOM 123 C114 OL2 63 58.502 5.215 35.956 1.00 0.00 C +ATOM 124 H14R OL2 63 59.186 5.609 36.711 1.00 0.00 H +ATOM 125 H14S OL2 63 58.811 5.604 34.983 1.00 0.00 H +ATOM 126 C115 OL2 63 58.560 3.676 35.954 1.00 0.00 C +ATOM 127 H15R OL2 63 57.883 3.286 35.190 1.00 0.00 H +ATOM 128 H15S OL2 63 58.214 3.310 36.923 1.00 0.00 H +ATOM 129 C116 OL2 63 59.989 3.166 35.687 1.00 0.00 C +ATOM 130 H16R OL2 63 60.652 3.523 36.476 1.00 0.00 H +ATOM 131 H16S OL2 63 60.348 3.585 34.744 1.00 0.00 H +ATOM 132 C117 OL2 63 60.055 1.625 35.605 1.00 0.00 C +ATOM 133 H17R OL2 63 61.070 1.331 35.330 1.00 0.00 H +ATOM 134 H17S OL2 63 59.390 1.272 34.813 1.00 0.00 H +ATOM 135 C118 OL2 63 59.683 0.936 36.932 1.00 0.00 C +ATOM 136 H18R OL2 63 58.642 1.127 37.197 1.00 0.00 H +ATOM 137 H18S OL2 63 60.321 1.293 37.742 1.00 0.00 H +ATOM 138 H18T OL2 63 59.815 -0.144 36.843 1.00 0.00 H +ATOM 139 C12 OL 82 59.806 51.595 47.224 1.00 0.00 C +ATOM 140 H2R OL 82 58.831 51.161 46.996 1.00 0.00 H +ATOM 141 H2S OL 82 59.928 52.444 46.549 1.00 0.00 H +ATOM 142 C13 OL 82 60.916 50.551 46.931 1.00 0.00 C +ATOM 143 H3R OL 82 61.891 51.039 46.997 1.00 0.00 H +ATOM 144 H3S OL 82 60.805 50.224 45.897 1.00 0.00 H +ATOM 145 C14 OL 82 60.927 49.305 47.857 1.00 0.00 C +ATOM 146 H4R OL 82 61.346 49.582 48.825 1.00 0.00 H +ATOM 147 H4S OL 82 61.599 48.553 47.435 1.00 0.00 H +ATOM 148 C15 OL 82 59.539 48.672 48.090 1.00 0.00 C +ATOM 149 H5R OL 82 58.877 49.424 48.524 1.00 0.00 H +ATOM 150 H5S OL 82 59.616 47.877 48.834 1.00 0.00 H +ATOM 151 C16 OL 82 58.913 48.090 46.805 1.00 0.00 C +ATOM 152 H6R OL 82 59.277 47.075 46.642 1.00 0.00 H +ATOM 153 H6S OL 82 59.185 48.689 45.935 1.00 0.00 H +ATOM 154 C17 OL 82 57.387 48.107 46.949 1.00 0.00 C +ATOM 155 H7R OL 82 57.085 47.529 47.826 1.00 0.00 H +ATOM 156 H7S OL 82 57.095 49.145 47.097 1.00 0.00 H +ATOM 157 C18 OL 82 56.638 47.602 45.715 1.00 0.00 C +ATOM 158 H8R OL 82 57.032 48.080 44.818 1.00 0.00 H +ATOM 159 H8S OL 82 56.803 46.533 45.598 1.00 0.00 H +ATOM 160 C19 OL 82 55.160 47.876 45.906 1.00 0.00 C +ATOM 161 H9R OL 82 54.647 47.162 46.549 1.00 0.00 H +ATOM 162 C110 OL 82 54.459 48.853 45.339 1.00 0.00 C +ATOM 163 H10R OL 82 53.389 48.900 45.526 1.00 0.00 H +ATOM 164 C111 OL 82 55.005 49.908 44.398 1.00 0.00 C +ATOM 165 H11R OL 82 56.087 49.831 44.292 1.00 0.00 H +ATOM 166 H11S OL 82 54.797 50.902 44.796 1.00 0.00 H +ATOM 167 C112 OL 82 54.338 49.775 43.021 1.00 0.00 C +ATOM 168 H12R OL 82 54.182 48.717 42.803 1.00 0.00 H +ATOM 169 H12S OL 82 53.354 50.251 43.043 1.00 0.00 H +ATOM 170 C113 OL 82 55.201 50.385 41.901 1.00 0.00 C +ATOM 171 H13R OL 82 55.372 51.449 42.081 1.00 0.00 H +ATOM 172 H13S OL 82 56.172 49.884 41.884 1.00 0.00 H +ATOM 173 C114 OL 82 54.493 50.184 40.551 1.00 0.00 C +ATOM 174 H14R OL 82 53.636 50.859 40.483 1.00 0.00 H +ATOM 175 H14S OL 82 54.105 49.164 40.501 1.00 0.00 H +ATOM 176 C115 OL 82 55.433 50.408 39.352 1.00 0.00 C +ATOM 177 H15R OL 82 55.702 51.465 39.289 1.00 0.00 H +ATOM 178 H15S OL 82 56.349 49.826 39.473 1.00 0.00 H +ATOM 179 C116 OL 82 54.707 49.960 38.074 1.00 0.00 C +ATOM 180 H16R OL 82 54.527 48.886 38.117 1.00 0.00 H +ATOM 181 H16S OL 82 53.744 50.456 38.051 1.00 0.00 H +ATOM 182 C117 OL 82 55.478 50.306 36.793 1.00 0.00 C +ATOM 183 H17R OL 82 55.717 51.367 36.810 1.00 0.00 H +ATOM 184 H17S OL 82 56.411 49.742 36.763 1.00 0.00 H +ATOM 185 C118 OL 82 54.656 50.005 35.527 1.00 0.00 C +ATOM 186 H18R OL 82 55.223 50.278 34.635 1.00 0.00 H +ATOM 187 H18S OL 82 54.421 48.943 35.462 1.00 0.00 H +ATOM 188 H18T OL 82 53.723 50.573 35.527 1.00 0.00 H +ATOM 189 C11 PC 83 59.786 52.120 48.643 1.00 0.00 C +ATOM 190 O12 PC 83 60.714 52.024 49.429 1.00 0.00 O +ATOM 191 O11 PC 83 58.597 52.682 48.958 1.00 0.00 O +ATOM 192 C1 PC 83 58.384 53.184 50.311 1.00 0.00 C +ATOM 193 HR PC 83 58.165 52.350 50.981 1.00 0.00 H +ATOM 194 HS PC 83 59.302 53.648 50.670 1.00 0.00 H +ATOM 195 C2 PC 83 57.274 54.268 50.365 1.00 0.00 C +ATOM 196 HX PC 83 57.723 55.243 50.138 1.00 0.00 H +ATOM 197 C3 PC 83 56.643 54.359 51.774 1.00 0.00 C +ATOM 198 HA PC 83 57.419 54.533 52.528 1.00 0.00 H +ATOM 199 HB PC 83 55.907 55.168 51.817 1.00 0.00 H +ATOM 200 O31 PC 83 55.987 53.105 52.043 1.00 0.00 O +ATOM 201 P31 PC 83 55.327 52.773 53.452 1.00 0.00 P +ATOM 202 O32 PC 83 54.772 51.315 53.100 1.00 0.00 O +ATOM 203 C31 PC 83 55.663 50.237 52.730 1.00 0.00 C +ATOM 204 H1A PC 83 56.559 50.276 53.363 1.00 0.00 H +ATOM 205 H1B PC 83 55.154 49.289 52.915 1.00 0.00 H +ATOM 206 C32 PC 83 56.058 50.318 51.236 1.00 0.00 C +ATOM 207 H2A PC 83 56.593 51.246 51.048 1.00 0.00 H +ATOM 208 H2B PC 83 56.733 49.492 51.007 1.00 0.00 H +ATOM 209 N31 PC 83 54.964 50.254 50.193 1.00 0.00 N +ATOM 210 C33 PC 83 54.028 51.431 50.258 1.00 0.00 C +ATOM 211 H3A PC 83 53.504 51.413 51.214 1.00 0.00 H +ATOM 212 H3B PC 83 54.615 52.347 50.173 1.00 0.00 H +ATOM 213 H3C PC 83 53.316 51.356 49.435 1.00 0.00 H +ATOM 214 C34 PC 83 55.622 50.258 48.855 1.00 0.00 C +ATOM 215 H4A PC 83 56.297 49.402 48.828 1.00 0.00 H +ATOM 216 H4B PC 83 54.852 50.158 48.087 1.00 0.00 H +ATOM 217 H4C PC 83 56.171 51.193 48.734 1.00 0.00 H +ATOM 218 C35 PC 83 54.188 48.980 50.323 1.00 0.00 C +ATOM 219 H5A PC 83 53.646 49.014 51.269 1.00 0.00 H +ATOM 220 H5B PC 83 54.886 48.139 50.310 1.00 0.00 H +ATOM 221 H5C PC 83 53.493 48.910 49.484 1.00 0.00 H +ATOM 222 O33 PC 83 54.202 53.641 53.832 1.00 0.00 O +ATOM 223 O34 PC 83 56.275 52.727 54.581 1.00 0.00 O +ATOM 224 O21 PC 83 56.211 53.991 49.405 1.00 0.00 O +ATOM 225 C21 PC 83 56.350 54.440 48.137 1.00 0.00 C +ATOM 226 O22 PC 83 57.299 55.103 47.761 1.00 0.00 O +ATOM 227 C12 OL2 84 55.194 54.028 47.250 1.00 0.00 C +ATOM 228 H2R OL2 84 54.520 54.878 47.131 1.00 0.00 H +ATOM 229 H2S OL2 84 54.627 53.249 47.763 1.00 0.00 H +ATOM 230 C13 OL2 84 55.620 53.489 45.863 1.00 0.00 C +ATOM 231 H3R OL2 84 54.734 53.069 45.382 1.00 0.00 H +ATOM 232 H3S OL2 84 56.340 52.676 45.988 1.00 0.00 H +ATOM 233 C14 OL2 84 56.206 54.575 44.934 1.00 0.00 C +ATOM 234 H4R OL2 84 57.163 54.920 45.330 1.00 0.00 H +ATOM 235 H4S OL2 84 55.533 55.435 44.898 1.00 0.00 H +ATOM 236 C15 OL2 84 56.433 54.046 43.503 1.00 0.00 C +ATOM 237 H5R OL2 84 55.474 53.824 43.031 1.00 0.00 H +ATOM 238 H5S OL2 84 57.006 53.116 43.550 1.00 0.00 H +ATOM 239 C16 OL2 84 57.214 55.085 42.669 1.00 0.00 C +ATOM 240 H6R OL2 84 58.140 55.321 43.199 1.00 0.00 H +ATOM 241 H6S OL2 84 56.645 56.014 42.590 1.00 0.00 H +ATOM 242 C17 OL2 84 57.593 54.554 41.269 1.00 0.00 C +ATOM 243 H7R OL2 84 57.875 53.507 41.358 1.00 0.00 H +ATOM 244 H7S OL2 84 58.475 55.091 40.915 1.00 0.00 H +ATOM 245 C18 OL2 84 56.476 54.702 40.212 1.00 0.00 C +ATOM 246 H8R OL2 84 55.581 54.177 40.553 1.00 0.00 H +ATOM 247 H8S OL2 84 56.789 54.207 39.291 1.00 0.00 H +ATOM 248 C19 OL2 84 56.138 56.156 39.941 1.00 0.00 C +ATOM 249 H9R OL2 84 55.317 56.550 40.536 1.00 0.00 H +ATOM 250 C110 OL2 84 56.732 56.957 39.059 1.00 0.00 C +ATOM 251 H10R OL2 84 56.382 57.983 38.965 1.00 0.00 H +ATOM 252 C111 OL2 84 57.902 56.603 38.162 1.00 0.00 C +ATOM 253 H11R OL2 84 58.122 55.535 38.200 1.00 0.00 H +ATOM 254 H11S OL2 84 58.792 57.130 38.516 1.00 0.00 H +ATOM 255 C112 OL2 84 57.641 57.022 36.700 1.00 0.00 C +ATOM 256 H12R OL2 84 57.440 58.094 36.643 1.00 0.00 H +ATOM 257 H12S OL2 84 56.751 56.501 36.343 1.00 0.00 H +ATOM 258 C113 OL2 84 58.854 56.671 35.810 1.00 0.00 C +ATOM 259 H13R OL2 84 59.212 55.679 36.093 1.00 0.00 H +ATOM 260 H13S OL2 84 59.671 57.370 35.999 1.00 0.00 H +ATOM 261 C114 OL2 84 58.508 56.661 34.302 1.00 0.00 C +ATOM 262 H14R OL2 84 58.455 57.683 33.922 1.00 0.00 H +ATOM 263 H14S OL2 84 57.529 56.204 34.148 1.00 0.00 H +ATOM 264 C115 OL2 84 59.573 55.853 33.530 1.00 0.00 C +ATOM 265 H15R OL2 84 59.688 54.866 33.984 1.00 0.00 H +ATOM 266 H15S OL2 84 60.535 56.363 33.624 1.00 0.00 H +ATOM 267 C116 OL2 84 59.254 55.675 32.032 1.00 0.00 C +ATOM 268 H16R OL2 84 60.141 55.247 31.561 1.00 0.00 H +ATOM 269 H16S OL2 84 59.069 56.644 31.567 1.00 0.00 H +ATOM 270 C117 OL2 84 58.065 54.728 31.769 1.00 0.00 C +ATOM 271 H17R OL2 84 57.122 55.233 31.993 1.00 0.00 H +ATOM 272 H17S OL2 84 58.140 53.856 32.419 1.00 0.00 H +ATOM 273 C118 OL2 84 58.063 54.241 30.309 1.00 0.00 C +ATOM 274 H18R OL2 84 59.002 53.732 30.075 1.00 0.00 H +ATOM 275 H18S OL2 84 57.939 55.079 29.620 1.00 0.00 H +ATOM 276 H18T OL2 84 57.249 53.534 30.145 1.00 0.00 H +ATOM 277 C12 OL 100 60.253 39.283 45.399 1.00 0.00 C +ATOM 278 H2R OL 100 59.405 39.407 44.724 1.00 0.00 H +ATOM 279 H2S OL 100 60.141 38.324 45.905 1.00 0.00 H +ATOM 280 C13 OL 100 61.563 39.269 44.608 1.00 0.00 C +ATOM 281 H3R OL 100 62.420 39.218 45.285 1.00 0.00 H +ATOM 282 H3S OL 100 61.648 40.188 44.026 1.00 0.00 H +ATOM 283 C14 OL 100 61.551 38.040 43.687 1.00 0.00 C +ATOM 284 H4R OL 100 61.656 37.133 44.287 1.00 0.00 H +ATOM 285 H4S OL 100 60.589 37.985 43.171 1.00 0.00 H +ATOM 286 C15 OL 100 62.668 38.110 42.639 1.00 0.00 C +ATOM 287 H5R OL 100 63.645 38.197 43.119 1.00 0.00 H +ATOM 288 H5S OL 100 62.517 38.999 42.027 1.00 0.00 H +ATOM 289 C16 OL 100 62.625 36.855 41.755 1.00 0.00 C +ATOM 290 H6R OL 100 63.167 36.043 42.247 1.00 0.00 H +ATOM 291 H6S OL 100 61.589 36.528 41.628 1.00 0.00 H +ATOM 292 C17 OL 100 63.214 37.135 40.365 1.00 0.00 C +ATOM 293 H7R OL 100 64.221 37.550 40.450 1.00 0.00 H +ATOM 294 H7S OL 100 62.589 37.870 39.855 1.00 0.00 H +ATOM 295 C18 OL 100 63.254 35.836 39.550 1.00 0.00 C +ATOM 296 H8R OL 100 64.116 35.248 39.871 1.00 0.00 H +ATOM 297 H8S OL 100 62.355 35.255 39.763 1.00 0.00 H +ATOM 298 C19 OL 100 63.349 36.128 38.071 1.00 0.00 C +ATOM 299 H9R OL 100 63.967 36.981 37.797 1.00 0.00 H +ATOM 300 C110 OL 100 62.702 35.457 37.125 1.00 0.00 C +ATOM 301 H10R OL 100 62.809 35.760 36.088 1.00 0.00 H +ATOM 302 C111 OL 100 61.833 34.237 37.344 1.00 0.00 C +ATOM 303 H11R OL 100 60.999 34.479 38.006 1.00 0.00 H +ATOM 304 H11S OL 100 61.391 33.950 36.387 1.00 0.00 H +ATOM 305 C112 OL 100 62.611 33.025 37.900 1.00 0.00 C +ATOM 306 H12R OL 100 62.889 33.185 38.943 1.00 0.00 H +ATOM 307 H12S OL 100 61.937 32.174 37.881 1.00 0.00 H +ATOM 308 C113 OL 100 63.874 32.712 37.074 1.00 0.00 C +ATOM 309 H13R OL 100 64.650 33.444 37.310 1.00 0.00 H +ATOM 310 H13S OL 100 63.639 32.802 36.012 1.00 0.00 H +ATOM 311 C114 OL 100 64.412 31.293 37.343 1.00 0.00 C +ATOM 312 H14R OL 100 64.592 31.145 38.411 1.00 0.00 H +ATOM 313 H14S OL 100 63.669 30.564 37.021 1.00 0.00 H +ATOM 314 C115 OL 100 65.715 31.066 36.557 1.00 0.00 C +ATOM 315 H15R OL 100 66.536 31.580 37.061 1.00 0.00 H +ATOM 316 H15S OL 100 65.613 31.503 35.563 1.00 0.00 H +ATOM 317 C116 OL 100 66.039 29.570 36.394 1.00 0.00 C +ATOM 318 H16R OL 100 66.325 29.142 37.358 1.00 0.00 H +ATOM 319 H16S OL 100 65.149 29.042 36.044 1.00 0.00 H +ATOM 320 C117 OL 100 67.170 29.374 35.367 1.00 0.00 C +ATOM 321 H17R OL 100 66.902 29.856 34.424 1.00 0.00 H +ATOM 322 H17S OL 100 68.090 29.834 35.727 1.00 0.00 H +ATOM 323 C118 OL 100 67.430 27.887 35.112 1.00 0.00 C +ATOM 324 H18R OL 100 66.535 27.405 34.714 1.00 0.00 H +ATOM 325 H18S OL 100 68.240 27.772 34.389 1.00 0.00 H +ATOM 326 H18T OL 100 67.718 27.383 36.038 1.00 0.00 H +ATOM 327 C11 PC 101 60.220 40.370 46.428 1.00 0.00 C +ATOM 328 O12 PC 101 59.610 41.410 46.271 1.00 0.00 O +ATOM 329 O11 PC 101 60.885 40.008 47.548 1.00 0.00 O +ATOM 330 C1 PC 101 60.747 40.802 48.752 1.00 0.00 C +ATOM 331 HR PC 101 59.711 41.143 48.836 1.00 0.00 H +ATOM 332 HS PC 101 60.954 40.150 49.605 1.00 0.00 H +ATOM 333 C2 PC 101 61.727 42.003 48.805 1.00 0.00 C +ATOM 334 HX PC 101 62.763 41.664 48.689 1.00 0.00 H +ATOM 335 C3 PC 101 61.579 42.737 50.150 1.00 0.00 C +ATOM 336 HA PC 101 61.980 42.134 50.966 1.00 0.00 H +ATOM 337 HB PC 101 62.111 43.693 50.106 1.00 0.00 H +ATOM 338 O31 PC 101 60.169 42.961 50.380 1.00 0.00 O +ATOM 339 P31 PC 101 59.662 44.131 51.322 1.00 0.00 P +ATOM 340 O32 PC 101 58.446 43.436 52.086 1.00 0.00 O +ATOM 341 C31 PC 101 58.084 42.042 51.936 1.00 0.00 C +ATOM 342 H1A PC 101 57.267 41.967 51.219 1.00 0.00 H +ATOM 343 H1B PC 101 58.913 41.435 51.563 1.00 0.00 H +ATOM 344 C32 PC 101 57.645 41.506 53.312 1.00 0.00 C +ATOM 345 H2A PC 101 56.823 42.106 53.708 1.00 0.00 H +ATOM 346 H2B PC 101 57.284 40.482 53.193 1.00 0.00 H +ATOM 347 N31 PC 101 58.717 41.457 54.381 1.00 0.00 N +ATOM 348 C33 PC 101 58.198 40.649 55.534 1.00 0.00 C +ATOM 349 H3A PC 101 57.293 41.129 55.913 1.00 0.00 H +ATOM 350 H3B PC 101 57.966 39.644 55.175 1.00 0.00 H +ATOM 351 H3C PC 101 58.970 40.619 56.305 1.00 0.00 H +ATOM 352 C34 PC 101 59.971 40.810 53.855 1.00 0.00 C +ATOM 353 H4A PC 101 60.676 40.686 54.678 1.00 0.00 H +ATOM 354 H4B PC 101 59.710 39.844 53.417 1.00 0.00 H +ATOM 355 H4C PC 101 60.406 41.465 53.098 1.00 0.00 H +ATOM 356 C35 PC 101 59.048 42.836 54.878 1.00 0.00 C +ATOM 357 H5A PC 101 58.121 43.351 55.134 1.00 0.00 H +ATOM 358 H5B PC 101 59.573 43.380 54.091 1.00 0.00 H +ATOM 359 H5C PC 101 59.689 42.747 55.754 1.00 0.00 H +ATOM 360 O33 PC 101 60.670 44.583 52.298 1.00 0.00 O +ATOM 361 O34 PC 101 59.193 45.261 50.493 1.00 0.00 O +ATOM 362 O21 PC 101 61.402 43.001 47.806 1.00 0.00 O +ATOM 363 C21 PC 101 62.043 43.028 46.620 1.00 0.00 C +ATOM 364 O22 PC 101 62.943 42.266 46.306 1.00 0.00 O +ATOM 365 C12 OL2 102 61.518 44.133 45.738 1.00 0.00 C +ATOM 366 H2R OL2 102 61.319 45.003 46.366 1.00 0.00 H +ATOM 367 H2S OL2 102 60.570 43.806 45.312 1.00 0.00 H +ATOM 368 C13 OL2 102 62.472 44.513 44.590 1.00 0.00 C +ATOM 369 H3R OL2 102 62.576 43.657 43.918 1.00 0.00 H +ATOM 370 H3S OL2 102 63.463 44.744 44.985 1.00 0.00 H +ATOM 371 C14 OL2 102 61.938 45.718 43.787 1.00 0.00 C +ATOM 372 H4R OL2 102 60.930 45.497 43.429 1.00 0.00 H +ATOM 373 H4S OL2 102 62.575 45.850 42.911 1.00 0.00 H +ATOM 374 C15 OL2 102 61.931 47.029 44.610 1.00 0.00 C +ATOM 375 H5R OL2 102 62.851 47.083 45.197 1.00 0.00 H +ATOM 376 H5S OL2 102 61.097 47.029 45.311 1.00 0.00 H +ATOM 377 C16 OL2 102 61.867 48.283 43.712 1.00 0.00 C +ATOM 378 H6R OL2 102 62.694 48.222 43.008 1.00 0.00 H +ATOM 379 H6S OL2 102 62.030 49.179 44.313 1.00 0.00 H +ATOM 380 C17 OL2 102 60.534 48.415 42.940 1.00 0.00 C +ATOM 381 H7R OL2 102 59.761 48.847 43.579 1.00 0.00 H +ATOM 382 H7S OL2 102 60.184 47.426 42.644 1.00 0.00 H +ATOM 383 C18 OL2 102 60.703 49.250 41.655 1.00 0.00 C +ATOM 384 H8R OL2 102 59.939 48.948 40.952 1.00 0.00 H +ATOM 385 H8S OL2 102 61.651 48.995 41.186 1.00 0.00 H +ATOM 386 C19 OL2 102 60.649 50.744 41.890 1.00 0.00 C +ATOM 387 H9R OL2 102 61.252 51.105 42.720 1.00 0.00 H +ATOM 388 C110 OL2 102 59.947 51.617 41.169 1.00 0.00 C +ATOM 389 H10R OL2 102 59.996 52.671 41.435 1.00 0.00 H +ATOM 390 C111 OL2 102 59.047 51.303 39.985 1.00 0.00 C +ATOM 391 H11R OL2 102 58.061 51.731 40.171 1.00 0.00 H +ATOM 392 H11S OL2 102 58.887 50.235 39.848 1.00 0.00 H +ATOM 393 C112 OL2 102 59.601 51.892 38.675 1.00 0.00 C +ATOM 394 H12R OL2 102 60.538 51.395 38.411 1.00 0.00 H +ATOM 395 H12S OL2 102 59.808 52.956 38.809 1.00 0.00 H +ATOM 396 C113 OL2 102 58.568 51.705 37.548 1.00 0.00 C +ATOM 397 H13R OL2 102 57.635 52.170 37.867 1.00 0.00 H +ATOM 398 H13S OL2 102 58.376 50.640 37.405 1.00 0.00 H +ATOM 399 C114 OL2 102 59.034 52.321 36.212 1.00 0.00 C +ATOM 400 H14R OL2 102 59.847 51.714 35.808 1.00 0.00 H +ATOM 401 H14S OL2 102 59.430 53.325 36.380 1.00 0.00 H +ATOM 402 C115 OL2 102 57.887 52.390 35.176 1.00 0.00 C +ATOM 403 H15R OL2 102 57.385 51.424 35.114 1.00 0.00 H +ATOM 404 H15S OL2 102 58.317 52.587 34.194 1.00 0.00 H +ATOM 405 C116 OL2 102 56.877 53.509 35.516 1.00 0.00 C +ATOM 406 H16R OL2 102 57.399 54.458 35.475 1.00 0.00 H +ATOM 407 H16S OL2 102 56.504 53.400 36.535 1.00 0.00 H +ATOM 408 C117 OL2 102 55.676 53.552 34.552 1.00 0.00 C +ATOM 409 H17R OL2 102 55.092 52.636 34.650 1.00 0.00 H +ATOM 410 H17S OL2 102 56.021 53.616 33.518 1.00 0.00 H +ATOM 411 C118 OL2 102 54.778 54.761 34.866 1.00 0.00 C +ATOM 412 H18R OL2 102 55.299 55.696 34.651 1.00 0.00 H +ATOM 413 H18S OL2 102 54.495 54.762 35.921 1.00 0.00 H +ATOM 414 H18T OL2 102 53.868 54.731 34.265 1.00 0.00 H +ATOM 415 C12 OL 109 52.748 12.735 20.859 1.00 0.00 C +ATOM 416 H2R OL 109 53.798 12.521 20.663 1.00 0.00 H +ATOM 417 H2S OL 109 52.373 13.261 19.982 1.00 0.00 H +ATOM 418 C13 OL 109 52.582 13.673 22.085 1.00 0.00 C +ATOM 419 H3R OL 109 51.527 13.924 22.211 1.00 0.00 H +ATOM 420 H3S OL 109 53.094 14.611 21.862 1.00 0.00 H +ATOM 421 C14 OL 109 53.132 13.139 23.429 1.00 0.00 C +ATOM 422 H4R OL 109 53.268 13.982 24.111 1.00 0.00 H +ATOM 423 H4S OL 109 52.384 12.487 23.886 1.00 0.00 H +ATOM 424 C15 OL 109 54.458 12.356 23.310 1.00 0.00 C +ATOM 425 H5R OL 109 54.275 11.451 22.728 1.00 0.00 H +ATOM 426 H5S OL 109 54.769 12.026 24.304 1.00 0.00 H +ATOM 427 C16 OL 109 55.608 13.168 22.671 1.00 0.00 C +ATOM 428 H6R OL 109 56.143 13.679 23.467 1.00 0.00 H +ATOM 429 H6S OL 109 55.236 13.937 21.993 1.00 0.00 H +ATOM 430 C17 OL 109 56.552 12.235 21.885 1.00 0.00 C +ATOM 431 H7R OL 109 56.688 11.307 22.441 1.00 0.00 H +ATOM 432 H7S OL 109 56.084 11.968 20.936 1.00 0.00 H +ATOM 433 C18 OL 109 57.935 12.860 21.614 1.00 0.00 C +ATOM 434 H8R OL 109 58.510 12.192 20.970 1.00 0.00 H +ATOM 435 H8S OL 109 57.809 13.793 21.060 1.00 0.00 H +ATOM 436 C19 OL 109 58.698 13.131 22.895 1.00 0.00 C +ATOM 437 H9R OL 109 58.700 14.168 23.220 1.00 0.00 H +ATOM 438 C110 OL 109 59.349 12.229 23.621 1.00 0.00 C +ATOM 439 H10R OL 109 59.865 12.551 24.523 1.00 0.00 H +ATOM 440 C111 OL 109 59.470 10.748 23.313 1.00 0.00 C +ATOM 441 H11R OL 109 59.222 10.540 22.271 1.00 0.00 H +ATOM 442 H11S OL 109 60.509 10.442 23.454 1.00 0.00 H +ATOM 443 C112 OL 109 58.573 9.879 24.219 1.00 0.00 C +ATOM 444 H12R OL 109 58.784 8.827 24.011 1.00 0.00 H +ATOM 445 H12S OL 109 57.523 10.049 23.977 1.00 0.00 H +ATOM 446 C113 OL 109 58.793 10.161 25.717 1.00 0.00 C +ATOM 447 H13R OL 109 58.456 11.172 25.958 1.00 0.00 H +ATOM 448 H13S OL 109 59.859 10.095 25.946 1.00 0.00 H +ATOM 449 C114 OL 109 58.010 9.144 26.568 1.00 0.00 C +ATOM 450 H14R OL 109 58.418 8.149 26.383 1.00 0.00 H +ATOM 451 H14S OL 109 56.964 9.138 26.252 1.00 0.00 H +ATOM 452 C115 OL 109 58.069 9.454 28.077 1.00 0.00 C +ATOM 453 H15R OL 109 57.399 8.767 28.599 1.00 0.00 H +ATOM 454 H15S OL 109 57.705 10.468 28.261 1.00 0.00 H +ATOM 455 C116 OL 109 59.493 9.294 28.643 1.00 0.00 C +ATOM 456 H16R OL 109 59.873 8.300 28.394 1.00 0.00 H +ATOM 457 H16S OL 109 60.161 10.028 28.188 1.00 0.00 H +ATOM 458 C117 OL 109 59.505 9.476 30.170 1.00 0.00 C +ATOM 459 H17R OL 109 58.819 8.762 30.633 1.00 0.00 H +ATOM 460 H17S OL 109 59.163 10.482 30.426 1.00 0.00 H +ATOM 461 C118 OL 109 60.919 9.254 30.728 1.00 0.00 C +ATOM 462 H18R OL 109 61.281 8.256 30.474 1.00 0.00 H +ATOM 463 H18S OL 109 60.908 9.347 31.814 1.00 0.00 H +ATOM 464 H18T OL 109 61.613 9.993 30.321 1.00 0.00 H +ATOM 465 C11 PC 110 51.987 11.438 20.921 1.00 0.00 C +ATOM 466 O12 PC 110 51.569 10.925 21.939 1.00 0.00 O +ATOM 467 O11 PC 110 51.784 10.950 19.677 1.00 0.00 O +ATOM 468 C1 PC 110 50.695 10.022 19.442 1.00 0.00 C +ATOM 469 HR PC 110 50.295 9.647 20.390 1.00 0.00 H +ATOM 470 HS PC 110 49.899 10.543 18.906 1.00 0.00 H +ATOM 471 C2 PC 110 51.160 8.825 18.603 1.00 0.00 C +ATOM 472 HX PC 110 51.983 8.328 19.130 1.00 0.00 H +ATOM 473 C3 PC 110 51.636 9.205 17.183 1.00 0.00 C +ATOM 474 HA PC 110 52.494 9.882 17.251 1.00 0.00 H +ATOM 475 HB PC 110 51.961 8.299 16.659 1.00 0.00 H +ATOM 476 O31 PC 110 50.590 9.860 16.419 1.00 0.00 O +ATOM 477 P31 PC 110 50.732 9.838 14.828 1.00 0.00 P +ATOM 478 O32 PC 110 50.000 11.190 14.410 1.00 0.00 O +ATOM 479 C31 PC 110 48.586 11.325 14.648 1.00 0.00 C +ATOM 480 H1A PC 110 48.111 10.345 14.761 1.00 0.00 H +ATOM 481 H1B PC 110 48.478 11.870 15.584 1.00 0.00 H +ATOM 482 C32 PC 110 47.953 12.109 13.476 1.00 0.00 C +ATOM 483 H2A PC 110 47.016 12.562 13.807 1.00 0.00 H +ATOM 484 H2B PC 110 48.627 12.909 13.168 1.00 0.00 H +ATOM 485 N31 PC 110 47.610 11.331 12.222 1.00 0.00 N +ATOM 486 C33 PC 110 48.825 10.665 11.640 1.00 0.00 C +ATOM 487 H3A PC 110 48.535 10.155 10.718 1.00 0.00 H +ATOM 488 H3B PC 110 49.577 11.427 11.430 1.00 0.00 H +ATOM 489 H3C PC 110 49.209 9.943 12.362 1.00 0.00 H +ATOM 490 C34 PC 110 46.564 10.298 12.527 1.00 0.00 C +ATOM 491 H4A PC 110 46.980 9.562 13.218 1.00 0.00 H +ATOM 492 H4B PC 110 45.694 10.795 12.959 1.00 0.00 H +ATOM 493 H4C PC 110 46.288 9.813 11.589 1.00 0.00 H +ATOM 494 C35 PC 110 47.051 12.265 11.186 1.00 0.00 C +ATOM 495 H5A PC 110 47.811 13.008 10.941 1.00 0.00 H +ATOM 496 H5B PC 110 46.161 12.752 11.590 1.00 0.00 H +ATOM 497 H5C PC 110 46.791 11.684 10.298 1.00 0.00 H +ATOM 498 O33 PC 110 52.128 9.839 14.343 1.00 0.00 O +ATOM 499 O34 PC 110 50.007 8.689 14.250 1.00 0.00 O +ATOM 500 O21 PC 110 50.015 7.935 18.569 1.00 0.00 O +ATOM 501 C21 PC 110 50.173 6.630 18.276 1.00 0.00 C +ATOM 502 O22 PC 110 51.141 6.153 17.716 1.00 0.00 O +ATOM 503 C12 OL2 111 49.041 5.806 18.833 1.00 0.00 C +ATOM 504 H2R OL2 111 48.557 5.238 18.035 1.00 0.00 H +ATOM 505 H2S OL2 111 48.293 6.472 19.269 1.00 0.00 H +ATOM 506 C13 OL2 111 49.608 4.866 19.913 1.00 0.00 C +ATOM 507 H3R OL2 111 50.487 5.339 20.356 1.00 0.00 H +ATOM 508 H3S OL2 111 49.938 3.933 19.451 1.00 0.00 H +ATOM 509 C14 OL2 111 48.594 4.574 21.036 1.00 0.00 C +ATOM 510 H4R OL2 111 47.685 4.154 20.599 1.00 0.00 H +ATOM 511 H4S OL2 111 48.318 5.504 21.539 1.00 0.00 H +ATOM 512 C15 OL2 111 49.162 3.575 22.067 1.00 0.00 C +ATOM 513 H5R OL2 111 49.426 2.649 21.552 1.00 0.00 H +ATOM 514 H5S OL2 111 48.378 3.330 22.788 1.00 0.00 H +ATOM 515 C16 OL2 111 50.398 4.113 22.829 1.00 0.00 C +ATOM 516 H6R OL2 111 50.124 5.000 23.404 1.00 0.00 H +ATOM 517 H6S OL2 111 51.188 4.393 22.130 1.00 0.00 H +ATOM 518 C17 OL2 111 50.944 3.022 23.765 1.00 0.00 C +ATOM 519 H7R OL2 111 51.184 2.137 23.171 1.00 0.00 H +ATOM 520 H7S OL2 111 50.163 2.754 24.477 1.00 0.00 H +ATOM 521 C18 OL2 111 52.199 3.445 24.546 1.00 0.00 C +ATOM 522 H8R OL2 111 52.912 3.907 23.865 1.00 0.00 H +ATOM 523 H8S OL2 111 52.670 2.540 24.936 1.00 0.00 H +ATOM 524 C19 OL2 111 51.830 4.330 25.719 1.00 0.00 C +ATOM 525 H9R OL2 111 51.065 3.916 26.373 1.00 0.00 H +ATOM 526 C110 OL2 111 52.333 5.525 26.008 1.00 0.00 C +ATOM 527 H10R OL2 111 51.966 6.048 26.888 1.00 0.00 H +ATOM 528 C111 OL2 111 53.414 6.259 25.241 1.00 0.00 C +ATOM 529 H11R OL2 111 52.988 7.176 24.828 1.00 0.00 H +ATOM 530 H11S OL2 111 53.796 5.680 24.401 1.00 0.00 H +ATOM 531 C112 OL2 111 54.591 6.649 26.154 1.00 0.00 C +ATOM 532 H12R OL2 111 54.224 7.279 26.968 1.00 0.00 H +ATOM 533 H12S OL2 111 55.294 7.249 25.572 1.00 0.00 H +ATOM 534 C113 OL2 111 55.332 5.427 26.741 1.00 0.00 C +ATOM 535 H13R OL2 111 55.657 4.767 25.933 1.00 0.00 H +ATOM 536 H13S OL2 111 54.666 4.858 27.395 1.00 0.00 H +ATOM 537 C114 OL2 111 56.555 5.916 27.537 1.00 0.00 C +ATOM 538 H14R OL2 111 56.221 6.578 28.339 1.00 0.00 H +ATOM 539 H14S OL2 111 57.188 6.496 26.868 1.00 0.00 H +ATOM 540 C115 OL2 111 57.402 4.776 28.132 1.00 0.00 C +ATOM 541 H15R OL2 111 57.792 4.154 27.324 1.00 0.00 H +ATOM 542 H15S OL2 111 56.783 4.147 28.776 1.00 0.00 H +ATOM 543 C116 OL2 111 58.565 5.380 28.952 1.00 0.00 C +ATOM 544 H16R OL2 111 58.145 5.969 29.771 1.00 0.00 H +ATOM 545 H16S OL2 111 59.141 6.065 28.326 1.00 0.00 H +ATOM 546 C117 OL2 111 59.508 4.314 29.544 1.00 0.00 C +ATOM 547 H17R OL2 111 58.926 3.520 30.016 1.00 0.00 H +ATOM 548 H17S OL2 111 60.115 4.778 30.325 1.00 0.00 H +ATOM 549 C118 OL2 111 60.455 3.723 28.482 1.00 0.00 C +ATOM 550 H18R OL2 111 61.075 4.509 28.044 1.00 0.00 H +ATOM 551 H18S OL2 111 59.894 3.238 27.681 1.00 0.00 H +ATOM 552 H18T OL2 111 61.114 2.982 28.939 1.00 0.00 H +ATOM 553 C12 OL 166 48.689 58.990 20.676 1.00 0.00 C +ATOM 554 H2R OL 166 47.775 58.923 21.268 1.00 0.00 H +ATOM 555 H2S OL 166 49.455 58.421 21.203 1.00 0.00 H +ATOM 556 C13 OL 166 49.145 60.460 20.550 1.00 0.00 C +ATOM 557 H3R OL 166 48.289 61.079 20.267 1.00 0.00 H +ATOM 558 H3S OL 166 49.885 60.546 19.751 1.00 0.00 H +ATOM 559 C14 OL 166 49.777 61.006 21.851 1.00 0.00 C +ATOM 560 H4R OL 166 50.005 62.063 21.697 1.00 0.00 H +ATOM 561 H4S OL 166 50.722 60.495 22.048 1.00 0.00 H +ATOM 562 C15 OL 166 48.847 60.856 23.073 1.00 0.00 C +ATOM 563 H5R OL 166 48.854 59.824 23.431 1.00 0.00 H +ATOM 564 H5S OL 166 47.823 61.085 22.768 1.00 0.00 H +ATOM 565 C16 OL 166 49.220 61.818 24.219 1.00 0.00 C +ATOM 566 H6R OL 166 49.206 62.837 23.840 1.00 0.00 H +ATOM 567 H6S OL 166 48.438 61.763 24.964 1.00 0.00 H +ATOM 568 C17 OL 166 50.558 61.502 24.923 1.00 0.00 C +ATOM 569 H7R OL 166 50.631 60.429 25.084 1.00 0.00 H +ATOM 570 H7S OL 166 51.398 61.802 24.294 1.00 0.00 H +ATOM 571 C18 OL 166 50.638 62.200 26.300 1.00 0.00 C +ATOM 572 H8R OL 166 49.758 61.922 26.884 1.00 0.00 H +ATOM 573 H8S OL 166 50.616 63.282 26.167 1.00 0.00 H +ATOM 574 C19 OL 166 51.881 61.795 27.064 1.00 0.00 C +ATOM 575 H9R OL 166 52.444 60.971 26.631 1.00 0.00 H +ATOM 576 C110 OL 166 52.301 62.339 28.203 1.00 0.00 C +ATOM 577 H10R OL 166 53.206 61.956 28.671 1.00 0.00 H +ATOM 578 C111 OL 166 51.645 63.498 28.929 1.00 0.00 C +ATOM 579 H11R OL 166 52.402 64.245 29.179 1.00 0.00 H +ATOM 580 H11S OL 166 50.918 63.995 28.284 1.00 0.00 H +ATOM 581 C112 OL 166 50.927 63.060 30.223 1.00 0.00 C +ATOM 582 H12R OL 166 50.164 62.320 29.976 1.00 0.00 H +ATOM 583 H12S OL 166 50.415 63.926 30.642 1.00 0.00 H +ATOM 584 C113 OL 166 51.878 62.495 31.299 1.00 0.00 C +ATOM 585 H13R OL 166 52.301 61.545 30.965 1.00 0.00 H +ATOM 586 H13S OL 166 52.704 63.193 31.458 1.00 0.00 H +ATOM 587 C114 OL 166 51.118 62.296 32.628 1.00 0.00 C +ATOM 588 H14R OL 166 50.694 63.251 32.949 1.00 0.00 H +ATOM 589 H14S OL 166 50.288 61.605 32.472 1.00 0.00 H +ATOM 590 C115 OL 166 52.034 61.750 33.741 1.00 0.00 C +ATOM 591 H15R OL 166 52.872 62.433 33.899 1.00 0.00 H +ATOM 592 H15S OL 166 52.443 60.785 33.433 1.00 0.00 H +ATOM 593 C116 OL 166 51.251 61.583 35.061 1.00 0.00 C +ATOM 594 H16R OL 166 50.373 60.959 34.886 1.00 0.00 H +ATOM 595 H16S OL 166 50.896 62.557 35.405 1.00 0.00 H +ATOM 596 C117 OL 166 52.123 60.936 36.155 1.00 0.00 C +ATOM 597 H17R OL 166 52.559 60.007 35.779 1.00 0.00 H +ATOM 598 H17S OL 166 52.946 61.607 36.414 1.00 0.00 H +ATOM 599 C118 OL 166 51.294 60.627 37.414 1.00 0.00 C +ATOM 600 H18R OL 166 50.493 59.921 37.182 1.00 0.00 H +ATOM 601 H18S OL 166 50.849 61.540 37.815 1.00 0.00 H +ATOM 602 H18T OL 166 51.929 60.185 38.185 1.00 0.00 H +ATOM 603 C11 PC 167 48.457 58.327 19.335 1.00 0.00 C +ATOM 604 O12 PC 167 48.377 58.910 18.267 1.00 0.00 O +ATOM 605 O11 PC 167 48.372 56.986 19.459 1.00 0.00 O +ATOM 606 C1 PC 167 48.473 56.152 18.271 1.00 0.00 C +ATOM 607 HR PC 167 48.153 55.139 18.532 1.00 0.00 H +ATOM 608 HS PC 167 47.814 56.534 17.484 1.00 0.00 H +ATOM 609 C2 PC 167 49.941 56.113 17.786 1.00 0.00 C +ATOM 610 HX PC 167 50.328 57.125 17.617 1.00 0.00 H +ATOM 611 C3 PC 167 50.061 55.303 16.487 1.00 0.00 C +ATOM 612 HA PC 167 49.573 54.345 16.653 1.00 0.00 H +ATOM 613 HB PC 167 49.571 55.813 15.650 1.00 0.00 H +ATOM 614 O31 PC 167 51.470 55.105 16.188 1.00 0.00 O +ATOM 615 P31 PC 167 52.002 53.845 15.354 1.00 0.00 P +ATOM 616 O32 PC 167 50.716 52.903 15.248 1.00 0.00 O +ATOM 617 C31 PC 167 50.835 51.463 15.270 1.00 0.00 C +ATOM 618 H1A PC 167 51.413 51.164 16.150 1.00 0.00 H +ATOM 619 H1B PC 167 49.836 51.024 15.353 1.00 0.00 H +ATOM 620 C32 PC 167 51.558 50.965 14.002 1.00 0.00 C +ATOM 621 H2A PC 167 52.476 51.541 13.859 1.00 0.00 H +ATOM 622 H2B PC 167 51.833 49.921 14.151 1.00 0.00 H +ATOM 623 N31 PC 167 50.811 51.010 12.694 1.00 0.00 N +ATOM 624 C33 PC 167 49.579 50.163 12.780 1.00 0.00 C +ATOM 625 H3A PC 167 49.105 50.138 11.796 1.00 0.00 H +ATOM 626 H3B PC 167 49.865 49.162 13.102 1.00 0.00 H +ATOM 627 H3C PC 167 48.904 50.621 13.503 1.00 0.00 H +ATOM 628 C34 PC 167 50.436 52.412 12.317 1.00 0.00 C +ATOM 629 H4A PC 167 49.741 52.802 13.064 1.00 0.00 H +ATOM 630 H4B PC 167 51.342 53.021 12.297 1.00 0.00 H +ATOM 631 H4C PC 167 49.961 52.400 11.334 1.00 0.00 H +ATOM 632 C35 PC 167 51.707 50.453 11.629 1.00 0.00 C +ATOM 633 H5A PC 167 51.948 49.423 11.895 1.00 0.00 H +ATOM 634 H5B PC 167 52.616 51.057 11.587 1.00 0.00 H +ATOM 635 H5C PC 167 51.178 50.484 10.675 1.00 0.00 H +ATOM 636 O33 PC 167 52.529 54.212 14.028 1.00 0.00 O +ATOM 637 O34 PC 167 53.076 53.197 16.149 1.00 0.00 O +ATOM 638 O21 PC 167 50.716 55.394 18.785 1.00 0.00 O +ATOM 639 C21 PC 167 51.370 56.076 19.746 1.00 0.00 C +ATOM 640 O22 PC 167 51.457 57.292 19.791 1.00 0.00 O +ATOM 641 C12 OL2 168 52.006 55.133 20.740 1.00 0.00 C +ATOM 642 H2R OL2 168 52.765 54.552 20.213 1.00 0.00 H +ATOM 643 H2S OL2 168 51.256 54.420 21.085 1.00 0.00 H +ATOM 644 C13 OL2 168 52.672 55.832 21.946 1.00 0.00 C +ATOM 645 H3R OL2 168 53.445 56.507 21.576 1.00 0.00 H +ATOM 646 H3S OL2 168 53.166 55.076 22.554 1.00 0.00 H +ATOM 647 C14 OL2 168 51.710 56.632 22.849 1.00 0.00 C +ATOM 648 H4R OL2 168 51.141 57.347 22.254 1.00 0.00 H +ATOM 649 H4S OL2 168 52.314 57.214 23.549 1.00 0.00 H +ATOM 650 C15 OL2 168 50.744 55.732 23.650 1.00 0.00 C +ATOM 651 H5R OL2 168 51.300 55.191 24.419 1.00 0.00 H +ATOM 652 H5S OL2 168 50.298 54.985 22.992 1.00 0.00 H +ATOM 653 C16 OL2 168 49.595 56.544 24.291 1.00 0.00 C +ATOM 654 H6R OL2 168 48.955 55.871 24.864 1.00 0.00 H +ATOM 655 H6S OL2 168 48.980 56.965 23.492 1.00 0.00 H +ATOM 656 C17 OL2 168 50.071 57.698 25.200 1.00 0.00 C +ATOM 657 H7R OL2 168 49.204 58.306 25.466 1.00 0.00 H +ATOM 658 H7S OL2 168 50.753 58.346 24.650 1.00 0.00 H +ATOM 659 C18 OL2 168 50.753 57.202 26.491 1.00 0.00 C +ATOM 660 H8R OL2 168 51.633 56.606 26.239 1.00 0.00 H +ATOM 661 H8S OL2 168 50.070 56.547 27.036 1.00 0.00 H +ATOM 662 C19 OL2 168 51.182 58.363 27.368 1.00 0.00 C +ATOM 663 H9R OL2 168 52.212 58.690 27.239 1.00 0.00 H +ATOM 664 C110 OL2 168 50.430 58.936 28.303 1.00 0.00 C +ATOM 665 H10R OL2 168 50.844 59.743 28.906 1.00 0.00 H +ATOM 666 C111 OL2 168 48.968 58.622 28.535 1.00 0.00 C +ATOM 667 H11R OL2 168 48.868 57.850 29.301 1.00 0.00 H +ATOM 668 H11S OL2 168 48.527 58.231 27.619 1.00 0.00 H +ATOM 669 C112 OL2 168 48.161 59.864 28.957 1.00 0.00 C +ATOM 670 H12R OL2 168 47.113 59.679 28.710 1.00 0.00 H +ATOM 671 H12S OL2 168 48.478 60.739 28.386 1.00 0.00 H +ATOM 672 C113 OL2 168 48.270 60.138 30.471 1.00 0.00 C +ATOM 673 H13R OL2 168 49.294 60.401 30.742 1.00 0.00 H +ATOM 674 H13S OL2 168 48.030 59.214 31.000 1.00 0.00 H +ATOM 675 C114 OL2 168 47.293 61.254 30.906 1.00 0.00 C +ATOM 676 H14R OL2 168 46.492 61.328 30.168 1.00 0.00 H +ATOM 677 H14S OL2 168 47.802 62.220 30.921 1.00 0.00 H +ATOM 678 C115 OL2 168 46.665 60.961 32.286 1.00 0.00 C +ATOM 679 H15R OL2 168 47.351 61.244 33.087 1.00 0.00 H +ATOM 680 H15S OL2 168 46.497 59.889 32.373 1.00 0.00 H +ATOM 681 C116 OL2 168 45.307 61.675 32.456 1.00 0.00 C +ATOM 682 H16R OL2 168 44.727 61.564 31.537 1.00 0.00 H +ATOM 683 H16S OL2 168 45.459 62.744 32.615 1.00 0.00 H +ATOM 684 C117 OL2 168 44.499 61.070 33.625 1.00 0.00 C +ATOM 685 H17R OL2 168 44.939 61.374 34.577 1.00 0.00 H +ATOM 686 H17S OL2 168 44.535 59.981 33.578 1.00 0.00 H +ATOM 687 C118 OL2 168 43.024 61.498 33.564 1.00 0.00 C +ATOM 688 H18R OL2 168 42.940 62.585 33.595 1.00 0.00 H +ATOM 689 H18S OL2 168 42.475 61.079 34.410 1.00 0.00 H +ATOM 690 H18T OL2 168 42.555 61.139 32.645 1.00 0.00 H +ATOM 691 C12 OL 181 59.552 44.500 21.860 1.00 0.00 C +ATOM 692 H2R OL 181 58.609 44.019 21.597 1.00 0.00 H +ATOM 693 H2S OL 181 59.322 45.296 22.571 1.00 0.00 H +ATOM 694 C13 OL 181 60.464 43.445 22.532 1.00 0.00 C +ATOM 695 H3R OL 181 60.720 42.657 21.820 1.00 0.00 H +ATOM 696 H3S OL 181 59.915 42.973 23.350 1.00 0.00 H +ATOM 697 C14 OL 181 61.748 44.085 23.096 1.00 0.00 C +ATOM 698 H4R OL 181 61.478 44.845 23.833 1.00 0.00 H +ATOM 699 H4S OL 181 62.289 44.586 22.289 1.00 0.00 H +ATOM 700 C15 OL 181 62.678 43.044 23.753 1.00 0.00 C +ATOM 701 H5R OL 181 62.982 42.308 23.005 1.00 0.00 H +ATOM 702 H5S OL 181 62.153 42.513 24.552 1.00 0.00 H +ATOM 703 C16 OL 181 63.921 43.753 24.325 1.00 0.00 C +ATOM 704 H6R OL 181 63.635 44.340 25.201 1.00 0.00 H +ATOM 705 H6S OL 181 64.290 44.450 23.572 1.00 0.00 H +ATOM 706 C17 OL 181 65.046 42.765 24.705 1.00 0.00 C +ATOM 707 H7R OL 181 64.681 42.081 25.475 1.00 0.00 H +ATOM 708 H7S OL 181 65.320 42.163 23.835 1.00 0.00 H +ATOM 709 C18 OL 181 66.301 43.498 25.234 1.00 0.00 C +ATOM 710 H8R OL 181 66.011 44.079 26.113 1.00 0.00 H +ATOM 711 H8S OL 181 67.025 42.752 25.560 1.00 0.00 H +ATOM 712 C19 OL 181 66.909 44.429 24.198 1.00 0.00 C +ATOM 713 H9R OL 181 66.203 44.865 23.497 1.00 0.00 H +ATOM 714 C110 OL 181 68.192 44.748 24.065 1.00 0.00 C +ATOM 715 H10R OL 181 68.482 45.426 23.265 1.00 0.00 H +ATOM 716 C111 OL 181 69.339 44.260 24.922 1.00 0.00 C +ATOM 717 H11R OL 181 70.160 43.961 24.271 1.00 0.00 H +ATOM 718 H11S OL 181 69.055 43.385 25.507 1.00 0.00 H +ATOM 719 C112 OL 181 69.835 45.363 25.874 1.00 0.00 C +ATOM 720 H12R OL 181 69.039 45.586 26.588 1.00 0.00 H +ATOM 721 H12S OL 181 70.051 46.279 25.318 1.00 0.00 H +ATOM 722 C113 OL 181 71.101 44.898 26.619 1.00 0.00 C +ATOM 723 H13R OL 181 71.983 45.032 25.988 1.00 0.00 H +ATOM 724 H13S OL 181 71.006 43.832 26.820 1.00 0.00 H +ATOM 725 C114 OL 181 71.280 45.626 27.965 1.00 0.00 C +ATOM 726 H14R OL 181 70.327 45.602 28.498 1.00 0.00 H +ATOM 727 H14S OL 181 71.542 46.675 27.805 1.00 0.00 H +ATOM 728 C115 OL 181 72.361 44.926 28.818 1.00 0.00 C +ATOM 729 H15R OL 181 73.344 45.361 28.626 1.00 0.00 H +ATOM 730 H15S OL 181 72.416 43.874 28.526 1.00 0.00 H +ATOM 731 C116 OL 181 72.025 44.958 30.321 1.00 0.00 C +ATOM 732 H16R OL 181 70.965 44.750 30.465 1.00 0.00 H +ATOM 733 H16S OL 181 72.575 44.160 30.819 1.00 0.00 H +ATOM 734 C117 OL 181 72.385 46.287 31.005 1.00 0.00 C +ATOM 735 H17R OL 181 73.457 46.473 30.906 1.00 0.00 H +ATOM 736 H17S OL 181 71.852 47.115 30.533 1.00 0.00 H +ATOM 737 C118 OL 181 72.010 46.204 32.495 1.00 0.00 C +ATOM 738 H18R OL 181 72.454 45.318 32.950 1.00 0.00 H +ATOM 739 H18S OL 181 72.373 47.075 33.037 1.00 0.00 H +ATOM 740 H18T OL 181 70.926 46.146 32.613 1.00 0.00 H +ATOM 741 C11 PC 182 60.131 45.113 20.598 1.00 0.00 C +ATOM 742 O12 PC 182 60.089 46.306 20.349 1.00 0.00 O +ATOM 743 O11 PC 182 60.675 44.196 19.767 1.00 0.00 O +ATOM 744 C1 PC 182 61.056 44.598 18.420 1.00 0.00 C +ATOM 745 HR PC 182 60.182 45.014 17.908 1.00 0.00 H +ATOM 746 HS PC 182 61.825 45.371 18.483 1.00 0.00 H +ATOM 747 C2 PC 182 61.606 43.373 17.642 1.00 0.00 C +ATOM 748 HX PC 182 62.650 43.222 17.932 1.00 0.00 H +ATOM 749 C3 PC 182 61.557 43.562 16.104 1.00 0.00 C +ATOM 750 HA PC 182 60.520 43.591 15.759 1.00 0.00 H +ATOM 751 HB PC 182 62.055 44.491 15.810 1.00 0.00 H +ATOM 752 O31 PC 182 62.259 42.444 15.498 1.00 0.00 O +ATOM 753 P31 PC 182 61.770 41.792 14.123 1.00 0.00 P +ATOM 754 O32 PC 182 60.331 41.266 14.546 1.00 0.00 O +ATOM 755 C31 PC 182 60.142 39.891 14.927 1.00 0.00 C +ATOM 756 H1A PC 182 60.907 39.242 14.492 1.00 0.00 H +ATOM 757 H1B PC 182 60.225 39.817 16.012 1.00 0.00 H +ATOM 758 C32 PC 182 58.745 39.453 14.446 1.00 0.00 C +ATOM 759 H2A PC 182 58.568 38.434 14.791 1.00 0.00 H +ATOM 760 H2B PC 182 57.989 40.101 14.889 1.00 0.00 H +ATOM 761 N31 PC 182 58.494 39.444 12.950 1.00 0.00 N +ATOM 762 C33 PC 182 59.616 38.760 12.226 1.00 0.00 C +ATOM 763 H3A PC 182 60.534 39.322 12.403 1.00 0.00 H +ATOM 764 H3B PC 182 59.715 37.740 12.599 1.00 0.00 H +ATOM 765 H3C PC 182 59.387 38.756 11.160 1.00 0.00 H +ATOM 766 C34 PC 182 57.233 38.684 12.672 1.00 0.00 C +ATOM 767 H4A PC 182 57.093 38.635 11.589 1.00 0.00 H +ATOM 768 H4B PC 182 57.328 37.683 13.092 1.00 0.00 H +ATOM 769 H4C PC 182 56.402 39.221 13.130 1.00 0.00 H +ATOM 770 C35 PC 182 58.330 40.837 12.403 1.00 0.00 C +ATOM 771 H5A PC 182 57.547 41.344 12.969 1.00 0.00 H +ATOM 772 H5B PC 182 58.053 40.767 11.349 1.00 0.00 H +ATOM 773 H5C PC 182 59.279 41.367 12.507 1.00 0.00 H +ATOM 774 O33 PC 182 61.631 42.701 12.964 1.00 0.00 O +ATOM 775 O34 PC 182 62.626 40.674 13.669 1.00 0.00 O +ATOM 776 O21 PC 182 60.877 42.164 18.001 1.00 0.00 O +ATOM 777 C21 PC 182 59.537 42.059 17.870 1.00 0.00 C +ATOM 778 O22 PC 182 58.794 42.936 17.468 1.00 0.00 O +ATOM 779 C12 OL2 183 59.053 40.702 18.294 1.00 0.00 C +ATOM 780 H2R OL2 183 59.886 40.003 18.205 1.00 0.00 H +ATOM 781 H2S OL2 183 58.265 40.371 17.617 1.00 0.00 H +ATOM 782 C13 OL2 183 58.550 40.679 19.746 1.00 0.00 C +ATOM 783 H3R OL2 183 57.693 41.347 19.865 1.00 0.00 H +ATOM 784 H3S OL2 183 59.346 41.025 20.410 1.00 0.00 H +ATOM 785 C14 OL2 183 58.157 39.234 20.105 1.00 0.00 C +ATOM 786 H4R OL2 183 58.937 38.556 19.753 1.00 0.00 H +ATOM 787 H4S OL2 183 57.233 38.960 19.590 1.00 0.00 H +ATOM 788 C15 OL2 183 58.007 39.008 21.615 1.00 0.00 C +ATOM 789 H5R OL2 183 58.944 39.257 22.121 1.00 0.00 H +ATOM 790 H5S OL2 183 57.828 37.944 21.773 1.00 0.00 H +ATOM 791 C16 OL2 183 56.844 39.798 22.246 1.00 0.00 C +ATOM 792 H6R OL2 183 56.009 39.851 21.543 1.00 0.00 H +ATOM 793 H6S OL2 183 57.161 40.821 22.461 1.00 0.00 H +ATOM 794 C17 OL2 183 56.352 39.107 23.534 1.00 0.00 C +ATOM 795 H7R OL2 183 55.909 38.146 23.267 1.00 0.00 H +ATOM 796 H7S OL2 183 55.572 39.718 23.994 1.00 0.00 H +ATOM 797 C18 OL2 183 57.479 38.871 24.556 1.00 0.00 C +ATOM 798 H8R OL2 183 57.912 39.828 24.848 1.00 0.00 H +ATOM 799 H8S OL2 183 58.281 38.284 24.107 1.00 0.00 H +ATOM 800 C19 OL2 183 56.971 38.104 25.754 1.00 0.00 C +ATOM 801 H9R OL2 183 56.953 37.022 25.637 1.00 0.00 H +ATOM 802 C110 OL2 183 56.616 38.636 26.916 1.00 0.00 C +ATOM 803 H10R OL2 183 56.297 37.973 27.717 1.00 0.00 H +ATOM 804 C111 OL2 183 56.526 40.115 27.230 1.00 0.00 C +ATOM 805 H11R OL2 183 55.504 40.346 27.525 1.00 0.00 H +ATOM 806 H11S OL2 183 56.739 40.735 26.360 1.00 0.00 H +ATOM 807 C112 OL2 183 57.458 40.510 28.386 1.00 0.00 C +ATOM 808 H12R OL2 183 58.492 40.498 28.036 1.00 0.00 H +ATOM 809 H12S OL2 183 57.372 39.790 29.204 1.00 0.00 H +ATOM 810 C113 OL2 183 57.082 41.911 28.901 1.00 0.00 C +ATOM 811 H13R OL2 183 56.123 41.859 29.422 1.00 0.00 H +ATOM 812 H13S OL2 183 56.961 42.591 28.054 1.00 0.00 H +ATOM 813 C114 OL2 183 58.160 42.478 29.841 1.00 0.00 C +ATOM 814 H14R OL2 183 59.087 42.614 29.280 1.00 0.00 H +ATOM 815 H14S OL2 183 58.360 41.776 30.655 1.00 0.00 H +ATOM 816 C115 OL2 183 57.696 43.825 30.426 1.00 0.00 C +ATOM 817 H15R OL2 183 57.226 44.428 29.645 1.00 0.00 H +ATOM 818 H15S OL2 183 56.948 43.634 31.198 1.00 0.00 H +ATOM 819 C116 OL2 183 58.871 44.621 31.017 1.00 0.00 C +ATOM 820 H16R OL2 183 59.499 44.998 30.206 1.00 0.00 H +ATOM 821 H16S OL2 183 59.491 43.965 31.630 1.00 0.00 H +ATOM 822 C117 OL2 183 58.352 45.795 31.869 1.00 0.00 C +ATOM 823 H17R OL2 183 57.754 45.411 32.698 1.00 0.00 H +ATOM 824 H17S OL2 183 57.705 46.434 31.264 1.00 0.00 H +ATOM 825 C118 OL2 183 59.517 46.629 32.425 1.00 0.00 C +ATOM 826 H18R OL2 183 60.181 46.006 33.029 1.00 0.00 H +ATOM 827 H18S OL2 183 59.135 47.437 33.053 1.00 0.00 H +ATOM 828 H18T OL2 183 60.097 47.068 31.611 1.00 0.00 H +END From 25d56161e3193c7e0e6e83a2797dbc1530bd710b Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 13:54:26 -0400 Subject: [PATCH 18/27] DRR - Cpptraj: Add function to select by original residue number --- src/MaskToken.cpp | 9 +++++++++ src/MaskToken.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 422c633bfd..4f19a2a6a2 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -943,6 +943,15 @@ void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues, int res1, int std::fill(mask + residues[res1-1].FirstAtom(), mask + endatom, SelectedChar_); } +/** Select by original residue number. */ +void MaskTokenArray::SelectOriginalResNum(ResArrayT const& residues, int res1, int res2, + char* mask) const +{ + for (ResArrayT::const_iterator res = residues.begin(); res != residues.end(); ++res) + if ( res->OriginalResNum() >= res1 && res->OriginalResNum() <= res2 ) + std::fill(mask + res->FirstAtom(), mask + res->LastAtom(), SelectedChar_); +} + /** Select residues by chain ID. */ void MaskTokenArray::MaskSelectChainID(ResArrayT const& residues, NameType const& name, char* mask) const diff --git a/src/MaskToken.h b/src/MaskToken.h index b00d906d6c..1dc7747eac 100644 --- a/src/MaskToken.h +++ b/src/MaskToken.h @@ -110,6 +110,7 @@ class MaskTokenArray { void MaskSelectResidues(ResArrayT const&, NameType const&, char*) const; void MaskSelectResidues(ResArrayT const&, int, int, char*) const; void MaskSelectChainID(ResArrayT const&, NameType const&, char*) const; + void SelectOriginalResNum(ResArrayT const&, int, int, char*) const; void MaskSelectMolecules(MolArrayT const&, int, int, char*) const; void MaskSelectElements(AtomArrayT const&, NameType const&, char*) const; void MaskSelectTypes(AtomArrayT const&, NameType const&, char*) const; From a53a92c6a1e5dcaaa58891be1658ddb5fd96b577 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 14:08:26 -0400 Subject: [PATCH 19/27] DRR - Cpptraj: Clean up function names. --- src/MaskToken.cpp | 79 ++++++++++++++++++++++++----------------------- src/MaskToken.h | 20 ++++++------ 2 files changed, 50 insertions(+), 49 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 4f19a2a6a2..38f2bed6b5 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -631,28 +631,28 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, } switch ( token->Type() ) { case MaskToken::ResNum : - MaskSelectResidues( residues, token->Res1(), token->Res2(), pMask ); + SelectResNum( residues, token->Res1(), token->Res2(), pMask ); break; case MaskToken::ResName : - MaskSelectResidues( residues, token->Name(), pMask ); + SelectResName( residues, token->Name(), pMask ); break; case MaskToken::ResChain : - MaskSelectChainID( residues, token->Name(), pMask ); + SelectChainID( residues, token->Name(), pMask ); break; case MaskToken::AtomNum : - MaskSelectAtoms( atoms, token->Res1(), token->Res2(), pMask ); + SelectAtomNum( atoms, token->Res1(), token->Res2(), pMask ); break; case MaskToken::AtomName : - MaskSelectAtoms( atoms, token->Name(), pMask ); + SelectAtomName( atoms, token->Name(), pMask ); break; case MaskToken::AtomType : - MaskSelectTypes( atoms, token->Name(), pMask ); + SelectAtomType( atoms, token->Name(), pMask ); break; case MaskToken::AtomElement : - MaskSelectElements( atoms, token->Name(), pMask ); + SelectElement( atoms, token->Name(), pMask ); break; case MaskToken::MolNum : - MaskSelectMolecules( molecules, token->Res1(), token->Res2(), pMask ); + SelectMolNum( molecules, token->Res1(), token->Res2(), pMask ); break; case MaskToken::SelectAll : std::fill(pMask, pMask + atoms.size(), SelectedChar_); @@ -673,7 +673,7 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, Mask_NEG( Stack.top(), atoms.size() ); break; case MaskToken::OP_DIST : - err = Mask_SelectDistance( XYZ, Stack.top(), *token, atoms, residues, molecules); + err = SelectDistance( XYZ, Stack.top(), *token, atoms, residues, molecules); break; default: mprinterr("Error: Invalid mask token (Mask [%s], type [%s]).\n", @@ -713,7 +713,6 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, return pMask; } -// Topology::Mask_SelectDistance() /** \param REF reference coordinates. * \param mask Initial atom selection; will be set with final output mask. * \param token Describe how atoms are to be selected. @@ -721,11 +720,11 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, * \param residues Residue array. * \return 0 if successful, 1 if an error occurs. */ -int MaskTokenArray::Mask_SelectDistance(const double* REF, char *mask, - MaskToken const& token, - AtomArrayT const& atoms, - ResArrayT const& residues, - MolArrayT const& molecules) const +int MaskTokenArray::SelectDistance(const double* REF, char *mask, + MaskToken const& token, + AtomArrayT const& atoms, + ResArrayT const& residues, + MolArrayT const& molecules) const { if (REF == 0) { mprinterr("Error: No reference set, cannot select by distance.\n"); @@ -908,9 +907,9 @@ void MaskTokenArray::Mask_NEG(char *mask1, unsigned int N) const { } } -// MaskTokenArray::MaskSelectResidues() -void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues, NameType const& name, - char *mask) const +/** Select by residue name. */ +void MaskTokenArray::SelectResName(ResArrayT const& residues, NameType const& name, + char *mask) const { //mprintf("\t\t\tSelecting residues named [%s]\n",*name); for (ResArrayT::const_iterator res = residues.begin(); res != residues.end(); ++res) @@ -921,15 +920,15 @@ void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues, NameType cons } } -// MaskTokenArray::MaskSelectResidues() -// Mask args expected to start from 1 -void MaskTokenArray::MaskSelectResidues(ResArrayT const& residues, int res1, int res2, - char *mask) const +/** Select by residue number. */ +void MaskTokenArray::SelectResNum(ResArrayT const& residues, int res1, int res2, + char *mask) const { int endatom; int nres = (int) residues.size(); //mprintf("\t\t\tSelecting residues %i to %i\n",res1,res2); // Check start atom. res1 and res2 are checked by MaskToken + // Mask args expected to start from 1 if (res1 > nres) { mprintf("Warning: Select residues: res 1 out of range (%i > %i)\n",res1, nres); return; @@ -953,8 +952,8 @@ void MaskTokenArray::SelectOriginalResNum(ResArrayT const& residues, int res1, i } /** Select residues by chain ID. */ -void MaskTokenArray::MaskSelectChainID(ResArrayT const& residues, NameType const& name, - char* mask) const +void MaskTokenArray::SelectChainID(ResArrayT const& residues, NameType const& name, + char* mask) const { for (ResArrayT::const_iterator res = residues.begin(); res != residues.end(); ++res) @@ -962,9 +961,9 @@ void MaskTokenArray::MaskSelectChainID(ResArrayT const& residues, NameType const std::fill(mask + res->FirstAtom(), mask + res->LastAtom(), SelectedChar_); } -// Mask args expected to start from 1 -void MaskTokenArray::MaskSelectMolecules(MolArrayT const& molecules, int mol1, int mol2, - char* mask) const +/** Select by molecule number. */ +void MaskTokenArray::SelectMolNum(MolArrayT const& molecules, int mol1, int mol2, + char* mask) const { if (molecules.empty()) { mprintf("Warning: No molecule information, cannot select by molecule.\n"); @@ -972,6 +971,7 @@ void MaskTokenArray::MaskSelectMolecules(MolArrayT const& molecules, int mol1, i } int endatom; int nmol = (int)molecules.size(); + // Mask args expected to start from 1 if (mol1 > nmol) { mprintf("Warning: Select molecules: mol 1 out of range (%i > %i)\n", mol1, nmol); return; @@ -985,9 +985,9 @@ void MaskTokenArray::MaskSelectMolecules(MolArrayT const& molecules, int mol1, i std::fill(mask + molecules[mol1-1].BeginAtom(), mask + endatom, SelectedChar_); } -// MaskTokenArray::MaskSelectElements() -void MaskTokenArray::MaskSelectElements(AtomArrayT const& atoms, NameType const& element, - char* mask ) const +/** Select by atomic element. */ +void MaskTokenArray::SelectElement(AtomArrayT const& atoms, NameType const& element, + char* mask ) const { unsigned int m = 0; for (AtomArrayT::const_iterator atom = atoms.begin(); atom != atoms.end(); ++atom, ++m) @@ -998,9 +998,9 @@ void MaskTokenArray::MaskSelectElements(AtomArrayT const& atoms, NameType const& } } -// MaskTokenArray::MaskSelectTypes() -void MaskTokenArray::MaskSelectTypes(AtomArrayT const& atoms, NameType const& type, - char* mask ) const +/** Select by atom type. */ +void MaskTokenArray::SelectAtomType(AtomArrayT const& atoms, NameType const& type, + char* mask ) const { unsigned int m = 0; for (AtomArrayT::const_iterator atom = atoms.begin(); atom != atoms.end(); ++atom, ++m) @@ -1010,9 +1010,9 @@ void MaskTokenArray::MaskSelectTypes(AtomArrayT const& atoms, NameType const& ty } } -// MaskTokenArray::MaskSelectAtoms() -void MaskTokenArray::MaskSelectAtoms(AtomArrayT const& atoms, NameType const& name, - char *mask) const +/** Select by atom name. */ +void MaskTokenArray::SelectAtomName(AtomArrayT const& atoms, NameType const& name, + char *mask) const { //mprintf("\t\t\tSelecting atoms named [%s]\n",*name); unsigned int m = 0; @@ -1025,12 +1025,13 @@ void MaskTokenArray::MaskSelectAtoms(AtomArrayT const& atoms, NameType const& na } } -// Mask args expected to start from 1 -void MaskTokenArray::MaskSelectAtoms(AtomArrayT const& atoms, int atom1, int atom2, - char *mask) const +/** Select by atom number. */ +void MaskTokenArray::SelectAtomNum(AtomArrayT const& atoms, int atom1, int atom2, + char *mask) const { int startatom, endatom; //mprintf("\t\t\tSelecting atoms %i to %i\n",atom1,atom2); + // Mask args expected to start from 1 if (atom1 > (int)atoms.size()) { mprintf("Warning: Select atoms: atom 1 out of range (%i > %zu)\n",atom1, atoms.size()); return; diff --git a/src/MaskToken.h b/src/MaskToken.h index 1dc7747eac..a956ada20d 100644 --- a/src/MaskToken.h +++ b/src/MaskToken.h @@ -102,20 +102,20 @@ class MaskTokenArray { int Tokenize(); // Mask selection routines. - int Mask_SelectDistance(const double*, char *, MaskToken const&, - AtomArrayT const&, ResArrayT const&, MolArrayT const&) const; + int SelectDistance(const double*, char *, MaskToken const&, + AtomArrayT const&, ResArrayT const&, MolArrayT const&) const; void Mask_AND(char*, char*, unsigned int) const; void Mask_OR(char*, char*, unsigned int) const; void Mask_NEG(char *, unsigned int) const; - void MaskSelectResidues(ResArrayT const&, NameType const&, char*) const; - void MaskSelectResidues(ResArrayT const&, int, int, char*) const; - void MaskSelectChainID(ResArrayT const&, NameType const&, char*) const; + void SelectResName(ResArrayT const&, NameType const&, char*) const; + void SelectResNum(ResArrayT const&, int, int, char*) const; + void SelectChainID(ResArrayT const&, NameType const&, char*) const; void SelectOriginalResNum(ResArrayT const&, int, int, char*) const; - void MaskSelectMolecules(MolArrayT const&, int, int, char*) const; - void MaskSelectElements(AtomArrayT const&, NameType const&, char*) const; - void MaskSelectTypes(AtomArrayT const&, NameType const&, char*) const; - void MaskSelectAtoms(AtomArrayT const&, NameType const&, char*) const; - void MaskSelectAtoms(AtomArrayT const&, int, int, char*) const; + void SelectMolNum(MolArrayT const&, int, int, char*) const; + void SelectElement(AtomArrayT const&, NameType const&, char*) const; + void SelectAtomType(AtomArrayT const&, NameType const&, char*) const; + void SelectAtomName(AtomArrayT const&, NameType const&, char*) const; + void SelectAtomNum(AtomArrayT const&, int, int, char*) const; MTarray maskTokens_; std::string maskExpression_; ///< String specifying atom mask selection. From 586ae3591fe050e45954eb6fa96dc89a7a4202ea Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 14:24:07 -0400 Subject: [PATCH 20/27] DRR - Cpptraj: Enable original residue number selection. --- src/MaskToken.cpp | 39 ++++++++++++++++++++++++--------------- src/MaskToken.h | 2 +- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 38f2bed6b5..6e56b295e1 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -19,7 +19,7 @@ MaskToken::MaskToken() : const char* MaskToken::MaskTypeString[] = { "OP_NONE", - "ResNum", "ResName", "ResChain", + "ResNum", "ResName", "ResChain", "OriginalResNum", "AtomNum", "AtomName", "AtomType", "AtomElement", "MolNum", "SelectAll", "OP_AND", "OP_OR", "OP_NEG", "OP_DIST" @@ -35,6 +35,7 @@ void MaskToken::Print() const { case AtomName: mprintf(" Name=[%s]",*name_); break; case MolNum: case ResNum: + case OresNum: case AtomNum: mprintf(" First=%i Second=%i",res1_,res2_); break; case OP_DIST: mprintf(" within=%i distOp=%i distance^2=%f", @@ -61,6 +62,9 @@ int MaskToken::MakeNameType() { else if (type_ == MolNum) { mprinterr("Internal Error: Molecule name not yet supported.\n"); return 1; + } else if (type_ == OresNum) { + mprinterr("Internal Error: Only digits supported for original residue number.\n"); + return 1; } return 0; } @@ -84,7 +88,7 @@ int MaskToken::SetToken( MaskTokenType typeIn, std::string const& tokenString ) } } // Check that all chars are digits or - for number range - if (type_ == ResNum || type_ == AtomNum || type_ == MolNum) { + if (type_ == ResNum || type_ == AtomNum || type_ == MolNum || type_ == OresNum) { for (std::string::const_iterator p = tokenString.begin(); p != tokenString.end(); ++p) { if (*p != '-' && isalpha(*p, loc)) { //mprintf("DEBUG: making name type because of %c\n",*p); @@ -93,7 +97,7 @@ int MaskToken::SetToken( MaskTokenType typeIn, std::string const& tokenString ) } } } - if (type_ == ResNum || type_ == AtomNum || type_ == MolNum) { + if (type_ == ResNum || type_ == AtomNum || type_ == MolNum || type_ == OresNum) { // Does this token argument have a dash? Only valid for number ranges. size_t dashPosition = tokenString.find_first_of("-"); if (dashPosition != std::string::npos) { @@ -176,7 +180,7 @@ int MaskToken::SetDistance(std::string const& distop) { // ============================================================================= // Class: MaskTokenArray -MaskTokenArray::MaskTokenArray() : debug_(0) {} +MaskTokenArray::MaskTokenArray() : debug_(10) {} // TODO include parentheses? bool MaskTokenArray::IsOperator(char op) { @@ -190,17 +194,18 @@ bool MaskTokenArray::IsOperator(char op) { bool MaskTokenArray::IsOperand(char op) { std::locale loc; - if (op=='*') return true; - if (op=='/') return true; - if (op=='\\') return true; - if (op=='%') return true; - if (op=='-') return true; - if (op=='?') return true; - if (op==',') return true; + if (op=='*' ) return true; // Wildcard + if (op=='/' ) return true; // Atom element, res chain ID + if (op=='\\') return true; + if (op=='%' ) return true; // Atom type + if (op==';' ) return true; // Original res number + if (op=='-' ) return true; + if (op=='?' ) return true; // Wildcard single char + if (op==',' ) return true; if (op=='\'') return true; - if (op=='.') return true; - if (op=='=') return true; - if (op=='+') return true; + if (op=='.' ) return true; + if (op=='=' ) return true; // Wildcard + if (op=='+' ) return true; if (isalnum(op, loc)) return true; return false; } @@ -473,7 +478,8 @@ int MaskTokenArray::Tokenize() { if (buffer[0]==':') { // Residue tokenType = MaskToken::ResNum; - if (buffer[1] =='/') tokenType = MaskToken::ResChain; + if (buffer[1] =='/') tokenType = MaskToken::ResChain; + else if (buffer[1] == ';') tokenType = MaskToken::OresNum; } else if (buffer[0]=='@') { // Atom tokenType = MaskToken::AtomNum; @@ -633,6 +639,9 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, case MaskToken::ResNum : SelectResNum( residues, token->Res1(), token->Res2(), pMask ); break; + case MaskToken::OresNum : + SelectOriginalResNum( residues, token->Res1(), token->Res2(), pMask ); + break; case MaskToken::ResName : SelectResName( residues, token->Name(), pMask ); break; diff --git a/src/MaskToken.h b/src/MaskToken.h index a956ada20d..b60745653a 100644 --- a/src/MaskToken.h +++ b/src/MaskToken.h @@ -8,7 +8,7 @@ class MaskToken { public: enum MaskTokenType { OP_NONE=0, - ResNum, ResName, ResChain, + ResNum, ResName, ResChain, OresNum, AtomNum, AtomName, AtomType, AtomElement, MolNum, SelectAll, OP_AND, OP_OR, OP_NEG, OP_DIST From 2bbededdb309565eff0676decfb2627e9f679bc7 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 14:24:32 -0400 Subject: [PATCH 21/27] DRR - Cpptraj: Add original residue number selection test --- test/Test_PDB/RunTest.sh | 4 +++- test/Test_PDB/oresnum.dat.save | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 test/Test_PDB/oresnum.dat.save diff --git a/test/Test_PDB/RunTest.sh b/test/Test_PDB/RunTest.sh index 664dff09de..f495feb535 100755 --- a/test/Test_PDB/RunTest.sh +++ b/test/Test_PDB/RunTest.sh @@ -3,7 +3,7 @@ . ../MasterTest.sh CleanFiles pdb.in test.pdb tz2.pqr.gb.pdb tz2.pqr.parse.pdb \ - tz2.pqr.vdw.pdb chainA.dat + tz2.pqr.vdw.pdb chainA.dat oresnum.dat INPUT="-i pdb.in" @@ -15,12 +15,14 @@ UNITNAME='PDB format read/write test' cat >> pdb.in < Date: Tue, 26 Sep 2017 14:28:44 -0400 Subject: [PATCH 22/27] DRR - Cpptraj: Some cleanup. --- src/MaskToken.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 6e56b295e1..a9096a8192 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -133,14 +133,14 @@ int MaskToken::SetToken( MaskTokenType typeIn, std::string const& tokenString ) } } else { // This is a string arg. - // Use AssignNoFormat so that * not converte to ' + // Use AssignNoFormat so that * not convert to ' //name_.AssignNoFormat( tokenString.c_str() ); // TODO: Convert directly from string name_ = tokenString; } return 0; } -/** [<|>][@|:|^] */ +/** Distance by distance. [<|>][@|:|^] */ int MaskToken::SetDistance(std::string const& distop) { if (distop.empty()) return 1; type_ = OP_DIST; @@ -180,7 +180,7 @@ int MaskToken::SetDistance(std::string const& distop) { // ============================================================================= // Class: MaskTokenArray -MaskTokenArray::MaskTokenArray() : debug_(10) {} +MaskTokenArray::MaskTokenArray() : debug_(0) {} // TODO include parentheses? bool MaskTokenArray::IsOperator(char op) { From 5560e7b8afb94012381ab077eda8a5ba17aa29ea Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Tue, 26 Sep 2017 14:45:13 -0400 Subject: [PATCH 23/27] DRR - Cpptraj: resX_ -> idxX_; more descriptive. --- src/MaskToken.cpp | 32 ++++++++++++++++---------------- src/MaskToken.h | 8 ++++---- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index a9096a8192..7ca458fbaf 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -11,8 +11,8 @@ MaskToken::MaskToken() : name_(""), type_(OP_NONE), distOp_(BY_ATOM), - res1_(-1), - res2_(-1), + idx1_(-1), + idx2_(-1), onStack_(false), d_within_(false) { } @@ -36,7 +36,7 @@ void MaskToken::Print() const { case MolNum: case ResNum: case OresNum: - case AtomNum: mprintf(" First=%i Second=%i",res1_,res2_); break; + case AtomNum: mprintf(" First=%i Second=%i",idx1_,idx2_); break; case OP_DIST: mprintf(" within=%i distOp=%i distance^2=%f", (int)d_within_, (int)distOp_, distance2_); @@ -46,7 +46,7 @@ void MaskToken::Print() const { mprintf(" OnStack=%i\n",(int)onStack_); /* mprintf("TOKEN: [%s] Res1=%i Res2=%i Name=[%s] OnStack=%i\n", - MaskTypeString[type_], res1_, res2_, *name_, (int)onStack_); + MaskTypeString[type_], idx1_, idx2_, *name_, (int)onStack_); mprintf(" within=%i distOp=%i distance^2=%f\n", (int)d_within_, (int)distOp_, distance2_);*/ } @@ -113,22 +113,22 @@ int MaskToken::SetToken( MaskTokenType typeIn, std::string const& tokenString ) mprinterr("Error: Incomplete number range given (%s).\n", tokenString.c_str()); return 1; } - res1_ = convertToInteger( arg1 ); - res2_ = convertToInteger( arg2 ); + idx1_ = convertToInteger( arg1 ); + idx2_ = convertToInteger( arg2 ); } else { // Get the number arg - res1_ = convertToInteger( tokenString ); - res2_ = res1_; + idx1_ = convertToInteger( tokenString ); + idx2_ = idx1_; } // Ensure that res1 and res2 are valid - if (res2_ < res1_) { - mprinterr("Error: Mask range, second num (%i) less than first (%i).\n",res2_,res1_); + if (idx2_ < idx1_) { + mprinterr("Error: Mask range, second num (%i) less than first (%i).\n",idx2_,idx1_); return 1; } // It is expected that number args will start from 1 - if (res1_ < 1 || res2_ < 1) { + if (idx1_ < 1 || idx2_ < 1) { mprinterr("Error: One or both numbers of mask arg (%s) < 1 (%i, %i)\n", - tokenString.c_str(), res1_,res2_); + tokenString.c_str(), idx1_,idx2_); return 1; } } else { @@ -637,10 +637,10 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, } switch ( token->Type() ) { case MaskToken::ResNum : - SelectResNum( residues, token->Res1(), token->Res2(), pMask ); + SelectResNum( residues, token->Idx1(), token->Idx2(), pMask ); break; case MaskToken::OresNum : - SelectOriginalResNum( residues, token->Res1(), token->Res2(), pMask ); + SelectOriginalResNum( residues, token->Idx1(), token->Idx2(), pMask ); break; case MaskToken::ResName : SelectResName( residues, token->Name(), pMask ); @@ -649,7 +649,7 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, SelectChainID( residues, token->Name(), pMask ); break; case MaskToken::AtomNum : - SelectAtomNum( atoms, token->Res1(), token->Res2(), pMask ); + SelectAtomNum( atoms, token->Idx1(), token->Idx2(), pMask ); break; case MaskToken::AtomName : SelectAtomName( atoms, token->Name(), pMask ); @@ -661,7 +661,7 @@ char* MaskTokenArray::ParseMask(AtomArrayT const& atoms, SelectElement( atoms, token->Name(), pMask ); break; case MaskToken::MolNum : - SelectMolNum( molecules, token->Res1(), token->Res2(), pMask ); + SelectMolNum( molecules, token->Idx1(), token->Idx2(), pMask ); break; case MaskToken::SelectAll : std::fill(pMask, pMask + atoms.size(), SelectedChar_); diff --git a/src/MaskToken.h b/src/MaskToken.h index b60745653a..828e3af3db 100644 --- a/src/MaskToken.h +++ b/src/MaskToken.h @@ -23,8 +23,8 @@ class MaskToken { void SetOnStack() { onStack_ = true; } inline MaskTokenType Type() const { return type_; } - inline int Res1() const { return res1_; } - inline int Res2() const { return res2_; } + inline int Idx1() const { return idx1_; } + inline int Idx2() const { return idx2_; } inline const NameType& Name() const { return name_; } inline bool OnStack() const { return onStack_; } inline bool Within() const { return d_within_; } @@ -39,8 +39,8 @@ class MaskToken { NameType name_; ///< Atom name/type/element, residue name, chain ID MaskTokenType type_; ///< Mask token type DistOpType distOp_; ///< Distance selection type - int res1_; ///< Begin atom/residue/molecule index - int res2_; ///< End atom/residue/molecule index + int idx1_; ///< Begin atom/residue/molecule index + int idx2_; ///< End atom/residue/molecule index bool onStack_; ///< True if resulting mask needs to go on stack bool d_within_; ///< True if distance selection is within }; From 0311ab9d1d999d997ca164845575b21bbb6e6427 Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 27 Sep 2017 08:21:24 -0400 Subject: [PATCH 24/27] DRR - Cpptraj: Add mol+res+atom selection test --- test/Test_TopInfo/RunTest.sh | 5 +++- test/Test_TopInfo/molselect2.dat.save | 37 +++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 test/Test_TopInfo/molselect2.dat.save diff --git a/test/Test_TopInfo/RunTest.sh b/test/Test_TopInfo/RunTest.sh index 66aeb564c7..766b5a50f0 100755 --- a/test/Test_TopInfo/RunTest.sh +++ b/test/Test_TopInfo/RunTest.sh @@ -3,7 +3,8 @@ . ../MasterTest.sh CleanFiles info.in atoms.dat residues.dat bonds.dat angles.dat dihedrals.dat \ - molecules.dat masscharge.dat values.dat molshort.dat molselect.dat + molecules.dat masscharge.dat values.dat molshort.dat molselect.dat \ + molselect2.dat INPUT="-i info.in" cat > info.in < Date: Wed, 27 Sep 2017 09:22:43 -0400 Subject: [PATCH 25/27] DRR - Cpptraj: Add missing flag set. --- src/MaskToken.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 7ca458fbaf..30e0c22951 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -180,7 +180,7 @@ int MaskToken::SetDistance(std::string const& distop) { // ============================================================================= // Class: MaskTokenArray -MaskTokenArray::MaskTokenArray() : debug_(0) {} +MaskTokenArray::MaskTokenArray() : debug_(10) {} // TODO include parentheses? bool MaskTokenArray::IsOperator(char op) { @@ -325,6 +325,7 @@ int MaskTokenArray::Tokenize() { } else if (flag == 4) { // Molecule AND residue buffer += ("]&[:"); + flag = 1; } else { buffer += "])|([:"; flag = 1; From 90d7036c5398e5c9f4ee7ba4154c51ff095f13cc Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 27 Sep 2017 09:31:01 -0400 Subject: [PATCH 26/27] DRR - Cpptraj: Test modifying the tokenizer to recognize '::' as a legit operator. --- src/MaskToken.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index 30e0c22951..e4fac5ee6f 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -269,13 +269,14 @@ int MaskTokenArray::Tokenize() { // 2 means operand with "@" read. // 3 means '<' or '>' read, waiting for numbers. // 4 means operand with "^" read. + // 5 means operand with ":" just read; check for additional ":". int flag = 0; for (std::string::iterator p = maskExpression_.begin(); p != maskExpression_.end(); p++) { // Skip spaces and newlines if ( isspace(*p, loc) ) continue; - + if ( flag == 5 && *p != ':' ) flag = 1; if ( IsOperator(*p) || *p == '(' || *p == ')' ) { //mprintf("DEBUG: Operator or parentheses: %c\n", *p); if (flag > 0) { @@ -321,14 +322,18 @@ int MaskTokenArray::Tokenize() { // Residue character if (flag == 0) { buffer.assign("([:"); - flag = 1; + flag = 5; } else if (flag == 4) { // Molecule AND residue buffer += ("]&[:"); + flag = 5; + } else if (flag == 5) { + // Second of two ':', just append. + buffer += *p; flag = 1; } else { buffer += "])|([:"; - flag = 1; + flag = 5; } } else if ( *p == '@' ) { // Atom character From c1bd0753e4139a557327520581e7f380ff6e03fc Mon Sep 17 00:00:00 2001 From: "Daniel R. Roe" Date: Wed, 27 Sep 2017 10:20:22 -0400 Subject: [PATCH 27/27] DRR - Cpptraj: Use '::' instead of ':/' for chain ID selection. --- src/MaskToken.cpp | 2 +- test/Test_PDB/RunTest.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MaskToken.cpp b/src/MaskToken.cpp index e4fac5ee6f..618bba922a 100644 --- a/src/MaskToken.cpp +++ b/src/MaskToken.cpp @@ -484,7 +484,7 @@ int MaskTokenArray::Tokenize() { if (buffer[0]==':') { // Residue tokenType = MaskToken::ResNum; - if (buffer[1] =='/') tokenType = MaskToken::ResChain; + if (buffer[1] ==':') tokenType = MaskToken::ResChain; else if (buffer[1] == ';') tokenType = MaskToken::OresNum; } else if (buffer[0]=='@') { // Atom diff --git a/test/Test_PDB/RunTest.sh b/test/Test_PDB/RunTest.sh index f495feb535..2517a9428b 100755 --- a/test/Test_PDB/RunTest.sh +++ b/test/Test_PDB/RunTest.sh @@ -14,7 +14,7 @@ Requires maxthreads 1 UNITNAME='PDB format read/write test' cat >> pdb.in <