| 0 | 1 <html> | 
|  | 2 <head> | 
|  | 3 <title>MayaChemTools:Code:Atom.pm</title> | 
|  | 4 <meta http-equiv="content-type" content="text/html;charset=utf-8"> | 
|  | 5 <link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css"> | 
|  | 6 </head> | 
|  | 7 <body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10"> | 
|  | 8 <br/> | 
|  | 9 <center> | 
|  | 10 <a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a> | 
|  | 11 </center> | 
|  | 12 <br/> | 
|  | 13 <pre> | 
|  | 14 <a name="package-Atom-"></a>   1 <span class="k">package </span><span class="i">Atom</span><span class="sc">;</span> | 
|  | 15    2 <span class="c">#</span> | 
|  | 16    3 <span class="c"># $RCSfile: Atom.pm,v $</span> | 
|  | 17    4 <span class="c"># $Date: 2015/02/28 20:47:02 $</span> | 
|  | 18    5 <span class="c"># $Revision: 1.62 $</span> | 
|  | 19    6 <span class="c">#</span> | 
|  | 20    7 <span class="c"># Author: Manish Sud <msud@san.rr.com></span> | 
|  | 21    8 <span class="c">#</span> | 
|  | 22    9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span> | 
|  | 23   10 <span class="c">#</span> | 
|  | 24   11 <span class="c"># This file is part of MayaChemTools.</span> | 
|  | 25   12 <span class="c">#</span> | 
|  | 26   13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span> | 
|  | 27   14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span> | 
|  | 28   15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span> | 
|  | 29   16 <span class="c"># later version.</span> | 
|  | 30   17 <span class="c">#</span> | 
|  | 31   18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span> | 
|  | 32   19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span> | 
|  | 33   20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span> | 
|  | 34   21 <span class="c"># details.</span> | 
|  | 35   22 <span class="c">#</span> | 
|  | 36   23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span> | 
|  | 37   24 <span class="c"># along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or</span> | 
|  | 38   25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span> | 
|  | 39   26 <span class="c"># Boston, MA, 02111-1307, USA.</span> | 
|  | 40   27 <span class="c">#</span> | 
|  | 41   28 | 
|  | 42   29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span> | 
|  | 43   30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span> | 
|  | 44   31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span> | 
|  | 45   32 <span class="k">use</span> <span class="w">Storable</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 46   33 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 47   34 <span class="k">use</span> <span class="w">ObjectProperty</span><span class="sc">;</span> | 
|  | 48   35 <span class="k">use</span> <span class="w">PeriodicTable</span><span class="sc">;</span> | 
|  | 49   36 <span class="k">use</span> <span class="w">Vector</span><span class="sc">;</span> | 
|  | 50   37 <span class="k">use</span> <span class="w">MathUtil</span><span class="sc">;</span> | 
|  | 51   38 <span class="k">use</span> <span class="w">Text::ParseWords</span><span class="sc">;</span> | 
|  | 52   39 <span class="k">use</span> <span class="w">TextUtil</span><span class="sc">;</span> | 
|  | 53   40 <span class="k">use</span> <span class="w">FileUtil</span><span class="sc">;</span> | 
|  | 54   41 | 
|  | 55   42 <span class="k">use</span> <span class="w">vars</span> <span class="q">qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)</span><span class="sc">;</span> | 
|  | 56   43 | 
|  | 57   44 <span class="i">@ISA</span> = <span class="q">qw(ObjectProperty Exporter)</span><span class="sc">;</span> | 
|  | 58   45 <span class="i">@EXPORT</span> = <span class="q">qw()</span><span class="sc">;</span> | 
|  | 59   46 <span class="i">@EXPORT_OK</span> = <span class="q">qw()</span><span class="sc">;</span> | 
|  | 60   47 | 
|  | 61   48 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span><span class="w">all</span>  <span class="cm">=></span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span><span class="s">)</span><span class="sc">;</span> | 
|  | 62   49 | 
|  | 63   50 <span class="c"># Setup class variables...</span> | 
|  | 64   51 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="cm">,</span> <span class="i">$ObjectID</span><span class="cm">,</span> <span class="i">%MDLValenceModelDataMap</span><span class="cm">,</span> <span class="i">%DaylightValenceModelDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 65   52 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 66   53 | 
|  | 67   54 <span class="c"># Overload Perl functions...</span> | 
|  | 68   55 <span class="k">use</span> <span class="w">overload</span> <span class="q">'""'</span> <span class="cm">=></span> <span class="q">'StringifyAtom'</span><span class="sc">;</span> | 
|  | 69   56 | 
|  | 70   57 <span class="c"># Class constructor...</span> | 
|  | 71 <a name="new-"></a>  58 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span> | 
|  | 72   59   <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 73   60 | 
|  | 74   61   <span class="c"># Initialize object...</span> | 
|  | 75   62   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span> | 
|  | 76   63   <span class="k">bless</span> <span class="i">$This</span><span class="cm">,</span> <span class="k">ref</span><span class="s">(</span><span class="i">$Class</span><span class="s">)</span> || <span class="i">$Class</span><span class="sc">;</span> | 
|  | 77   64   <span class="i">$This</span><span class="i">->_InitializeAtom</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 78   65 | 
|  | 79   66   <span class="i">$This</span><span class="i">->_InitializeAtomProperties</span><span class="s">(</span><span class="i">%NamesAndValues</span><span class="s">)</span><span class="sc">;</span> | 
|  | 80   67 | 
|  | 81   68   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 82   69 <span class="s">}</span> | 
|  | 83   70 | 
|  | 84   71 <span class="c"># Initialize object data...</span> | 
|  | 85 <a name="_InitializeAtom-"></a>  72 <span class="k">sub </span><span class="m">_InitializeAtom</span> <span class="s">{</span> | 
|  | 86   73   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 87   74   <span class="k">my</span><span class="s">(</span><span class="i">$ObjectID</span><span class="s">)</span> = <span class="i">_GetNewObjectID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 88   75 | 
|  | 89   76   <span class="c"># All other property names and values along with all Set/Get<PropertyName> methods</span> | 
|  | 90   77   <span class="c"># are implemented on-demand using ObjectProperty class.</span> | 
|  | 91   78   <span class="i">$This</span>->{<span class="w">ID</span>} = <span class="i">$ObjectID</span><span class="sc">;</span> | 
|  | 92   79   <span class="i">$This</span>->{<span class="w">Name</span>} = <span class="q">"Atom ${ObjectID}"</span><span class="sc">;</span> | 
|  | 93   80   <span class="i">$This</span>->{<span class="w">AtomSymbol</span>} = <span class="q">''</span><span class="sc">;</span> | 
|  | 94   81   <span class="i">$This</span>->{<span class="w">AtomicNumber</span>} = <span class="n">0</span><span class="sc">;</span> | 
|  | 95   82   <span class="i">$This</span>->{<span class="w">XYZ</span>} = <span class="w">Vector::ZeroVector</span><span class="sc">;</span> | 
|  | 96   83 <span class="s">}</span> | 
|  | 97   84 | 
|  | 98   85 <span class="c"># Initialize atom properties...</span> | 
|  | 99 <a name="_InitializeAtomProperties-"></a>  86 <span class="k">sub </span><span class="m">_InitializeAtomProperties</span> <span class="s">{</span> | 
|  | 100   87   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 101   88 | 
|  | 102   89   <span class="k">my</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$MethodName</span><span class="s">)</span><span class="sc">;</span> | 
|  | 103   90   <span class="k">while</span> <span class="s">(</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="k">each</span>  <span class="i">%NamesAndValues</span><span class="s">)</span> <span class="s">{</span> | 
|  | 104   91     <span class="i">$MethodName</span> = <span class="q">"Set${Name}"</span><span class="sc">;</span> | 
|  | 105   92     <span class="i">$This</span><span class="i">->$MethodName</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 106   93   <span class="s">}</span> | 
|  | 107   94   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$NamesAndValues</span>{<span class="q">'AtomSymbol'</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 108   95     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->new: Atom object instantiated without setting atom symbol..."</span><span class="sc">;</span> | 
|  | 109   96   <span class="s">}</span> | 
|  | 110   97 | 
|  | 111   98   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 112   99 <span class="s">}</span> | 
|  | 113  100 | 
|  | 114  101 <span class="c"># Initialize class ...</span> | 
|  | 115 <a name="_InitializeClass-"></a> 102 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span> | 
|  | 116  103   <span class="c">#Class name...</span> | 
|  | 117  104   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span> | 
|  | 118  105 | 
|  | 119  106   <span class="c"># ID to keep track of objects...</span> | 
|  | 120  107   <span class="i">$ObjectID</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 121  108 | 
|  | 122  109   <span class="c"># Load atom class data...</span> | 
|  | 123  110   <span class="i">_LoadAtomClassData</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 124  111 <span class="s">}</span> | 
|  | 125  112 | 
|  | 126  113 <span class="c"># Setup an explicit SetID method to block setting of ID by AUTOLOAD function...</span> | 
|  | 127 <a name="SetID-"></a> 114 <span class="k">sub </span><span class="m">SetID</span> <span class="s">{</span> | 
|  | 128  115   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 129  116 | 
|  | 130  117   <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetID: Object ID can't be changed: it's used for internal tracking..."</span><span class="sc">;</span> | 
|  | 131  118 | 
|  | 132  119   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 133  120 <span class="s">}</span> | 
|  | 134  121 | 
|  | 135  122 <span class="c"># Setup an explicit SetMolecule method to block setting of ID by AUTOLOAD function...</span> | 
|  | 136 <a name="SetMolecule-"></a> 123 <span class="k">sub </span><span class="m">SetMolecule</span> <span class="s">{</span> | 
|  | 137  124   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 138  125 | 
|  | 139  126   <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetMolecule: Molecule property can't be changed: it's used for internal tracking..."</span><span class="sc">;</span> | 
|  | 140  127 | 
|  | 141  128   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 142  129 <span class="s">}</span> | 
|  | 143  130 | 
|  | 144  131 <span class="c"># Assign atom to  molecule...</span> | 
|  | 145 <a name="_SetMolecule-"></a> 132 <span class="k">sub </span><span class="m">_SetMolecule</span> <span class="s">{</span> | 
|  | 146  133   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Molecule</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 147  134 | 
|  | 148  135   <span class="i">$This</span>->{<span class="w">Molecule</span>} = <span class="i">$Molecule</span><span class="sc">;</span> | 
|  | 149  136 | 
|  | 150  137   <span class="c"># Weaken the reference to disable increment of reference count; otherwise,</span> | 
|  | 151  138   <span class="c"># it it becomes a circular reference and destruction of Molecule object doesn't</span> | 
|  | 152  139   <span class="c"># get initiated which in turn disables destruction of atom object.</span> | 
|  | 153  140   <span class="c">#</span> | 
|  | 154  141   <span class="i">Scalar::Util::weaken</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">Molecule</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 155  142 | 
|  | 156  143   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 157  144 <span class="s">}</span> | 
|  | 158  145 | 
|  | 159  146 <span class="c"># Setup atom symbol and atomic number for the element...</span> | 
|  | 160  147 <span class="c">#</span> | 
|  | 161  148 <span class="c"># Possible atom symbol values:</span> | 
|  | 162  149 <span class="c">#    . An element symbol or some other type of atom: L - Atom list; LP - Lone pair; R# - R group;</span> | 
|  | 163  150 <span class="c">#       A, Q, * - unknown atom; or something else?</span> | 
|  | 164  151 <span class="c">#</span> | 
|  | 165  152 <span class="c"># Default mass number corresponds to the most abundant natural isotope unless it's explicity</span> | 
|  | 166  153 <span class="c"># set using "MassNumber" property.</span> | 
|  | 167  154 <span class="c">#</span> | 
|  | 168 <a name="SetAtomSymbol-"></a> 155 <span class="k">sub </span><span class="m">SetAtomSymbol</span> <span class="s">{</span> | 
|  | 169  156   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomSymbol</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 170  157   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 171  158 | 
|  | 172  159   <span class="i">$This</span>->{<span class="w">AtomSymbol</span>} = <span class="i">$AtomSymbol</span><span class="sc">;</span> | 
|  | 173  160 | 
|  | 174  161   <span class="i">$AtomicNumber</span> = <span class="i">PeriodicTable::GetElementAtomicNumber</span><span class="s">(</span><span class="i">$AtomSymbol</span><span class="s">)</span><span class="sc">;</span> | 
|  | 175  162   <span class="i">$This</span>->{<span class="w">AtomicNumber</span>} = <span class="s">(</span><span class="k">defined</span> <span class="i">$AtomicNumber</span><span class="s">)</span> ? <span class="i">$AtomicNumber</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 176  163 | 
|  | 177  164   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 178  165 <span class="s">}</span> | 
|  | 179  166 | 
|  | 180  167 <span class="c"># Setup atom symbol and atomic number for the element...</span> | 
|  | 181 <a name="SetAtomicNumber-"></a> 168 <span class="k">sub </span><span class="m">SetAtomicNumber</span> <span class="s">{</span> | 
|  | 182  169   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomicNumber</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 183  170   <span class="k">my</span><span class="s">(</span><span class="i">$AtomSymbol</span><span class="s">)</span><span class="sc">;</span> | 
|  | 184  171 | 
|  | 185  172   <span class="i">$AtomSymbol</span> = <span class="i">PeriodicTable::GetElementAtomSymbol</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 186  173   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$AtomSymbol</span><span class="s">)</span> <span class="s">{</span> | 
|  | 187  174     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetAtomicNumber: Didn't set atomic number: Invalid atomic number, $AtomicNumber, specified..."</span><span class="sc">;</span> | 
|  | 188  175     <span class="k">return</span><span class="sc">;</span> | 
|  | 189  176   <span class="s">}</span> | 
|  | 190  177   <span class="i">$This</span>->{<span class="w">AtomicNumber</span>} = <span class="i">$AtomicNumber</span><span class="sc">;</span> | 
|  | 191  178   <span class="i">$This</span>->{<span class="w">AtomSymbol</span>} = <span class="i">$AtomSymbol</span><span class="sc">;</span> | 
|  | 192  179 | 
|  | 193  180   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 194  181 <span class="s">}</span> | 
|  | 195  182 | 
|  | 196  183 <span class="c"># Set atom as stereo center...</span> | 
|  | 197  184 <span class="c">#</span> | 
|  | 198 <a name="SetStereoCenter-"></a> 185 <span class="k">sub </span><span class="m">SetStereoCenter</span> <span class="s">{</span> | 
|  | 199  186   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StereoCenter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 200  187 | 
|  | 201  188   <span class="i">$This</span><span class="i">->SetProperty</span><span class="s">(</span><span class="q">'StereoCenter'</span><span class="cm">,</span> <span class="i">$StereoCenter</span><span class="s">)</span><span class="sc">;</span> | 
|  | 202  189 | 
|  | 203  190   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 204  191 <span class="s">}</span> | 
|  | 205  192 | 
|  | 206  193 <span class="c"># Is it a stereo center?</span> | 
|  | 207  194 <span class="c">#</span> | 
|  | 208 <a name="IsStereoCenter-"></a> 195 <span class="k">sub </span><span class="m">IsStereoCenter</span> <span class="s">{</span> | 
|  | 209  196   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 210  197   <span class="k">my</span><span class="s">(</span><span class="i">$StereoCenter</span><span class="s">)</span><span class="sc">;</span> | 
|  | 211  198 | 
|  | 212  199   <span class="i">$StereoCenter</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'StereoCenter'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 213  200 | 
|  | 214  201   <span class="k">return</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$StereoCenter</span><span class="s">)</span> && <span class="i">$StereoCenter</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 215  202 <span class="s">}</span> | 
|  | 216  203 | 
|  | 217  204 <span class="c"># Set atom stereochemistry.</span> | 
|  | 218  205 <span class="c">#</span> | 
|  | 219  206 <span class="c"># Supported values are: R, S.</span> | 
|  | 220  207 <span class="c">#</span> | 
|  | 221  208 <span class="c"># Notes:</span> | 
|  | 222  209 <span class="c">#</span> | 
|  | 223  210 <span class="c"># . After the ligands around a central stereocenter has been ranked using CIP priority scheme and</span> | 
|  | 224  211 <span class="c"># the lowest ranked ligand lies behind the center atom, then R and S values correspond to:</span> | 
|  | 225  212 <span class="c">#</span> | 
|  | 226  213 <span class="c"># R: Clockwise arrangement of remaining ligands around the central atom going from highest to lowest ranked ligand</span> | 
|  | 227  214 <span class="c"># S: CounterClockwise arrangement of remaining ligands around the central atom going from highest to lowest ranked ligand</span> | 
|  | 228  215 <span class="c">#</span> | 
|  | 229  216 <span class="c"># . Assignment of any other arbitray values besides R and S is also allowed; however, a warning is printed.</span> | 
|  | 230  217 <span class="c">#</span> | 
|  | 231 <a name="SetStereochemistry-"></a> 218 <span class="k">sub </span><span class="m">SetStereochemistry</span> <span class="s">{</span> | 
|  | 232  219   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Stereochemistry</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 233  220 | 
|  | 234  221   <span class="k">if</span> <span class="s">(</span><span class="i">$Stereochemistry</span> !~ <span class="q">/^(R|S)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 235  222     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetStereochemistry: Assigning non-supported Stereochemistry value of $Stereochemistry. Supported values: R, S..."</span><span class="sc">;</span> | 
|  | 236  223   <span class="s">}</span> | 
|  | 237  224 | 
|  | 238  225   <span class="i">$This</span><span class="i">->SetProperty</span><span class="s">(</span><span class="q">'StereoCenter'</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 239  226   <span class="i">$This</span><span class="i">->SetProperty</span><span class="s">(</span><span class="q">'Stereochemistry'</span><span class="cm">,</span> <span class="i">$Stereochemistry</span><span class="s">)</span><span class="sc">;</span> | 
|  | 240  227 | 
|  | 241  228   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 242  229 <span class="s">}</span> | 
|  | 243  230 | 
|  | 244  231 <span class="c"># Setup mass number for atom...</span> | 
|  | 245 <a name="SetMassNumber-"></a> 232 <span class="k">sub </span><span class="m">SetMassNumber</span> <span class="s">{</span> | 
|  | 246  233   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$MassNumber</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 247  234   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$AtomSymbol</span><span class="s">)</span><span class="sc">;</span> | 
|  | 248  235 | 
|  | 249  236   <span class="i">$AtomicNumber</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 250  237   <span class="i">$AtomSymbol</span> = <span class="i">$This</span>->{<span class="w">AtomSymbol</span>}<span class="sc">;</span> | 
|  | 251  238   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 252  239     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetMassNumber: Didn't set mass number: Non standard atom with atomic number, $AtomicNumber, and atomic symbol, $AtomSymbol..."</span><span class="sc">;</span> | 
|  | 253  240     <span class="k">return</span><span class="sc">;</span> | 
|  | 254  241   <span class="s">}</span> | 
|  | 255  242   <span class="k">if</span> <span class="s">(</span>!<span class="i">PeriodicTable::IsElementNaturalIsotopeMassNumber</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$MassNumber</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 256  243     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetMassNumber: Unknown mass number, $MassNumber, specified for atom with atomic number, $AtomicNumber, and atomic symbol, $AtomSymbol. Don't forget to Set ExactMass property explicitly; otherwise, GetExactMass method would return mass of most abundant isotope..."</span><span class="sc">;</span> | 
|  | 257  244   <span class="s">}</span> | 
|  | 258  245   <span class="i">$This</span><span class="i">->SetProperty</span><span class="s">(</span><span class="q">'MassNumber'</span><span class="cm">,</span> <span class="i">$MassNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 259  246 | 
|  | 260  247   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 261  248 <span class="s">}</span> | 
|  | 262  249 | 
|  | 263  250 <span class="c"># Get mass number...</span> | 
|  | 264  251 <span class="c">#</span> | 
|  | 265 <a name="GetMassNumber-"></a> 252 <span class="k">sub </span><span class="m">GetMassNumber</span> <span class="s">{</span> | 
|  | 266  253   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 267  254 | 
|  | 268  255   <span class="c"># Is mass number explicity set?</span> | 
|  | 269  256   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'MassNumber'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 270  257     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'MassNumber'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 271  258   <span class="s">}</span> | 
|  | 272  259 | 
|  | 273  260   <span class="c"># Is it an element symbol?</span> | 
|  | 274  261   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 275  262   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 276  263     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 277  264   <span class="s">}</span> | 
|  | 278  265 | 
|  | 279  266   <span class="c"># Return most abundant mass number...</span> | 
|  | 280  267   <span class="k">return</span> <span class="i">PeriodicTable::GetElementMostAbundantNaturalIsotopeMassNumber</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 281  268 <span class="s">}</span> | 
|  | 282  269 | 
|  | 283  270 <span class="c"># Get atomic weight:</span> | 
|  | 284  271 <span class="c">#   . Explicitly set by the caller</span> | 
|  | 285  272 <span class="c">#   . Using atomic number</span> | 
|  | 286  273 <span class="c">#</span> | 
|  | 287 <a name="GetAtomicWeight-"></a> 274 <span class="k">sub </span><span class="m">GetAtomicWeight</span> <span class="s">{</span> | 
|  | 288  275   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 289  276 | 
|  | 290  277   <span class="c"># Is atomic weight explicity set?</span> | 
|  | 291  278   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'AtomicWeight'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 292  279     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'AtomicWeight'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 293  280   <span class="s">}</span> | 
|  | 294  281 | 
|  | 295  282   <span class="c"># Is it an element symbol?</span> | 
|  | 296  283   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 297  284   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 298  285     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 299  286   <span class="s">}</span> | 
|  | 300  287 | 
|  | 301  288   <span class="c"># Return its atomic weight...</span> | 
|  | 302  289   <span class="k">return</span> <span class="i">PeriodicTable::GetElementAtomicWeight</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 303  290 <span class="s">}</span> | 
|  | 304  291 | 
|  | 305  292 <span class="c"># Get exact mass weight:</span> | 
|  | 306  293 <span class="c">#   . Explicitly set by the caller</span> | 
|  | 307  294 <span class="c">#   . Using atomic number and mass number explicity set by the caller</span> | 
|  | 308  295 <span class="c">#   . Using atomic number and most abundant isotope</span> | 
|  | 309  296 <span class="c">#</span> | 
|  | 310 <a name="GetExactMass-"></a> 297 <span class="k">sub </span><span class="m">GetExactMass</span> <span class="s">{</span> | 
|  | 311  298   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 312  299 | 
|  | 313  300   <span class="c"># Is exact mass explicity set?</span> | 
|  | 314  301   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'ExactMass'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 315  302     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'ExactMass'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 316  303   <span class="s">}</span> | 
|  | 317  304 | 
|  | 318  305   <span class="c"># Is it an element symbol?</span> | 
|  | 319  306   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 320  307   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 321  308     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 322  309   <span class="s">}</span> | 
|  | 323  310 | 
|  | 324  311   <span class="c"># Is mass number explicitly set?</span> | 
|  | 325  312   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'MassNumber'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 326  313     <span class="k">my</span><span class="s">(</span><span class="i">$MassNumber</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'MassNumber'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 327  314     <span class="k">if</span> <span class="s">(</span><span class="i">PeriodicTable::IsElementNaturalIsotopeMassNumber</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$MassNumber</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 328  315       <span class="k">return</span> <span class="i">PeriodicTable::GetElementNaturalIsotopeMass</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$MassNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 329  316     <span class="s">}</span> | 
|  | 330  317   <span class="s">}</span> | 
|  | 331  318 | 
|  | 332  319   <span class="c"># Return most abundant isotope mass...</span> | 
|  | 333  320   <span class="k">return</span> <span class="i">PeriodicTable::GetElementMostAbundantNaturalIsotopeMass</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 334  321 <span class="s">}</span> | 
|  | 335  322 | 
|  | 336  323 <span class="c"># Get formal charge:</span> | 
|  | 337  324 <span class="c">#   . Explicitly set by the caller</span> | 
|  | 338  325 <span class="c">#   . Or return zero insetad of undef</span> | 
|  | 339  326 <span class="c">#</span> | 
|  | 340 <a name="GetFormalCharge-"></a> 327 <span class="k">sub </span><span class="m">GetFormalCharge</span> <span class="s">{</span> | 
|  | 341  328   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 342  329   <span class="k">my</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 343  330 | 
|  | 344  331   <span class="i">$FormalCharge</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 345  332   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'FormalCharge'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 346  333     <span class="i">$FormalCharge</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'FormalCharge'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 347  334   <span class="s">}</span> | 
|  | 348  335 | 
|  | 349  336   <span class="k">return</span> <span class="k">defined</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span> ? <span class="i">$FormalCharge</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 350  337 <span class="s">}</span> | 
|  | 351  338 | 
|  | 352  339 <span class="c"># Get spin multiplicity:</span> | 
|  | 353  340 <span class="c">#   . Explicitly set by the caller</span> | 
|  | 354  341 <span class="c">#   . From FreeRadicalElectrons value explicitly set by the caller</span> | 
|  | 355  342 <span class="c">#   . Or return zero insetad of undef</span> | 
|  | 356  343 <span class="c">#</span> | 
|  | 357 <a name="GetSpinMultiplicity-"></a> 344 <span class="k">sub </span><span class="m">GetSpinMultiplicity</span> <span class="s">{</span> | 
|  | 358  345   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 359  346   <span class="k">my</span><span class="s">(</span><span class="i">$SpinMultiplicity</span><span class="s">)</span><span class="sc">;</span> | 
|  | 360  347 | 
|  | 361  348   <span class="i">$SpinMultiplicity</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 362  349   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'SpinMultiplicity'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 363  350     <span class="i">$SpinMultiplicity</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'SpinMultiplicity'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 364  351     <span class="k">return</span> <span class="k">defined</span><span class="s">(</span><span class="i">$SpinMultiplicity</span><span class="s">)</span> ? <span class="i">$SpinMultiplicity</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 365  352   <span class="s">}</span> | 
|  | 366  353 | 
|  | 367  354   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'FreeRadicalElectrons'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 368  355     <span class="k">my</span><span class="s">(</span><span class="i">$FreeRadicalElectrons</span><span class="s">)</span><span class="sc">;</span> | 
|  | 369  356     <span class="i">$FreeRadicalElectrons</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'FreeRadicalElectrons'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 370  357 | 
|  | 371  358     <span class="j">SPINMULTIPLICITY:</span> <span class="s">{</span> | 
|  | 372  359       <span class="k">if</span> <span class="s">(</span><span class="i">$FreeRadicalElectrons</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span> <span class="i">$SpinMultiplicity</span> = <span class="n">2</span><span class="sc">;</span> <span class="k">last</span> <span class="j">SPINMULTIPLICITY</span><span class="sc">;</span><span class="s">}</span> | 
|  | 373  360       <span class="k">if</span> <span class="s">(</span><span class="i">$FreeRadicalElectrons</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span> <span class="i">$SpinMultiplicity</span> = <span class="n">1</span><span class="sc">;</span> <span class="k">last</span> <span class="j">SPINMULTIPLICITY</span><span class="sc">;</span><span class="s">}</span> | 
|  | 374  361       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->GetSpinMultiplicity: It's not possible to determine spin multiplicity from the specified free radical electrons value, $FreeRadicalElectrons. It has been set to 0..."</span><span class="sc">;</span> | 
|  | 375  362       <span class="i">$SpinMultiplicity</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 376  363     <span class="s">}</span> | 
|  | 377  364   <span class="s">}</span> | 
|  | 378  365 | 
|  | 379  366   <span class="k">return</span> <span class="i">$SpinMultiplicity</span><span class="sc">;</span> | 
|  | 380  367 <span class="s">}</span> | 
|  | 381  368 | 
|  | 382  369 <span class="c"># Get number of free radical electrons:</span> | 
|  | 383  370 <span class="c">#   . Explicitly set by the caller</span> | 
|  | 384  371 <span class="c">#   . From SpinMultiplicity value explicitly set by the caller</span> | 
|  | 385  372 <span class="c">#   . Or return zero insetad of undef</span> | 
|  | 386  373 <span class="c">#</span> | 
|  | 387  374 <span class="c"># Notes:</span> | 
|  | 388  375 <span class="c">#  . For atoms with explicit assignment of SpinMultiplicity property values corresponding to</span> | 
|  | 389  376 <span class="c">#    Singlet (two unpaired electrons corresponding to one spin state), Doublet (free radical; an unpaired</span> | 
|  | 390  377 <span class="c">#    electron corresponding to two spin states), and Triplet (two unparied electrons corresponding to</span> | 
|  | 391  378 <span class="c">#    three spin states; divalent carbon atoms (carbenes)), FreeRadicalElectrons are calculated as follows:</span> | 
|  | 392  379 <span class="c">#</span> | 
|  | 393  380 <span class="c">#       SpinMultiplicity: Doublet(2); FreeRadicalElectrons: 1</span> | 
|  | 394  381 <span class="c">#       SpinMultiplicity: Singlet(1)/Triplet(3); FreeRadicalElectrons: 2</span> | 
|  | 395  382 <span class="c">#</span> | 
|  | 396 <a name="GetFreeRadicalElectrons-"></a> 383 <span class="k">sub </span><span class="m">GetFreeRadicalElectrons</span> <span class="s">{</span> | 
|  | 397  384   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 398  385   <span class="k">my</span><span class="s">(</span><span class="i">$FreeRadicalElectrons</span><span class="s">)</span><span class="sc">;</span> | 
|  | 399  386 | 
|  | 400  387   <span class="i">$FreeRadicalElectrons</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 401  388 | 
|  | 402  389   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'FreeRadicalElectrons'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 403  390     <span class="i">$FreeRadicalElectrons</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'FreeRadicalElectrons'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 404  391     <span class="k">return</span> <span class="k">defined</span><span class="s">(</span><span class="i">$FreeRadicalElectrons</span><span class="s">)</span> ? <span class="i">$FreeRadicalElectrons</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 405  392   <span class="s">}</span> | 
|  | 406  393 | 
|  | 407  394   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'SpinMultiplicity'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 408  395     <span class="k">my</span><span class="s">(</span><span class="i">$SpinMultiplicity</span><span class="s">)</span><span class="sc">;</span> | 
|  | 409  396     <span class="i">$SpinMultiplicity</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'SpinMultiplicity'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 410  397 | 
|  | 411  398     <span class="j">SPINMULTIPLICITY:</span> <span class="s">{</span> | 
|  | 412  399       <span class="k">if</span> <span class="s">(</span><span class="i">$SpinMultiplicity</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span> <span class="i">$FreeRadicalElectrons</span> = <span class="n">2</span><span class="sc">;</span> <span class="k">last</span> <span class="j">SPINMULTIPLICITY</span><span class="sc">;</span><span class="s">}</span> | 
|  | 413  400       <span class="k">if</span> <span class="s">(</span><span class="i">$SpinMultiplicity</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span> <span class="i">$FreeRadicalElectrons</span> = <span class="n">1</span><span class="sc">;</span> <span class="k">last</span> <span class="j">SPINMULTIPLICITY</span><span class="sc">;</span><span class="s">}</span> | 
|  | 414  401       <span class="k">if</span> <span class="s">(</span><span class="i">$SpinMultiplicity</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span> <span class="i">$FreeRadicalElectrons</span> = <span class="n">2</span><span class="sc">;</span> <span class="k">last</span> <span class="j">SPINMULTIPLICITY</span><span class="sc">;</span><span class="s">}</span> | 
|  | 415  402       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->GetFreeRadicalElectrons: It's not possible to determine free radical electrons from the specified spin multiplicity value, $FreeRadicalElectrons. It has been set to 0..."</span><span class="sc">;</span> | 
|  | 416  403       <span class="i">$FreeRadicalElectrons</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 417  404     <span class="s">}</span> | 
|  | 418  405   <span class="s">}</span> | 
|  | 419  406 | 
|  | 420  407   <span class="k">return</span> <span class="i">$FreeRadicalElectrons</span><span class="sc">;</span> | 
|  | 421  408 <span class="s">}</span> | 
|  | 422  409 | 
|  | 423  410 <span class="c"># Set atom coordinates using:</span> | 
|  | 424  411 <span class="c"># . An array reference with three values</span> | 
|  | 425  412 <span class="c"># . An array containg three values</span> | 
|  | 426  413 <span class="c"># . A 3D vector</span> | 
|  | 427  414 <span class="c">#</span> | 
|  | 428 <a name="SetXYZ-"></a> 415 <span class="k">sub </span><span class="m">SetXYZ</span> <span class="s">{</span> | 
|  | 429  416   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 430  417 | 
|  | 431  418   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Values</span><span class="s">)</span> <span class="s">{</span> | 
|  | 432  419     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetXYZ: No values specified..."</span><span class="sc">;</span> | 
|  | 433  420     <span class="k">return</span><span class="sc">;</span> | 
|  | 434  421   <span class="s">}</span> | 
|  | 435  422 | 
|  | 436  423   <span class="i">$This</span>->{<span class="w">XYZ</span>}<span class="i">->SetXYZ</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span> | 
|  | 437  424   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 438  425 <span class="s">}</span> | 
|  | 439  426 | 
|  | 440  427 <span class="c"># Set X value...</span> | 
|  | 441 <a name="SetX-"></a> 428 <span class="k">sub </span><span class="m">SetX</span> <span class="s">{</span> | 
|  | 442  429   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 443  430 | 
|  | 444  431   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Value</span><span class="s">)</span> <span class="s">{</span> | 
|  | 445  432     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetX: Undefined X value..."</span><span class="sc">;</span> | 
|  | 446  433     <span class="k">return</span><span class="sc">;</span> | 
|  | 447  434   <span class="s">}</span> | 
|  | 448  435   <span class="i">$This</span>->{<span class="w">XYZ</span>}<span class="i">->SetX</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 449  436   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 450  437 <span class="s">}</span> | 
|  | 451  438 | 
|  | 452  439 <span class="c"># Set Y value...</span> | 
|  | 453 <a name="SetY-"></a> 440 <span class="k">sub </span><span class="m">SetY</span> <span class="s">{</span> | 
|  | 454  441   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 455  442 | 
|  | 456  443   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Value</span><span class="s">)</span> <span class="s">{</span> | 
|  | 457  444     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetY: Undefined Y value..."</span><span class="sc">;</span> | 
|  | 458  445     <span class="k">return</span><span class="sc">;</span> | 
|  | 459  446   <span class="s">}</span> | 
|  | 460  447   <span class="i">$This</span>->{<span class="w">XYZ</span>}<span class="i">->SetY</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 461  448   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 462  449 <span class="s">}</span> | 
|  | 463  450 | 
|  | 464  451 <span class="c"># Set Z value...</span> | 
|  | 465 <a name="SetZ-"></a> 452 <span class="k">sub </span><span class="m">SetZ</span> <span class="s">{</span> | 
|  | 466  453   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 467  454 | 
|  | 468  455   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Value</span><span class="s">)</span> <span class="s">{</span> | 
|  | 469  456     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetZ: Undefined Z value..."</span><span class="sc">;</span> | 
|  | 470  457     <span class="k">return</span><span class="sc">;</span> | 
|  | 471  458   <span class="s">}</span> | 
|  | 472  459   <span class="i">$This</span>->{<span class="w">XYZ</span>}<span class="i">->SetZ</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 473  460   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 474  461 <span class="s">}</span> | 
|  | 475  462 | 
|  | 476  463 <span class="c"># Return XYZ as:</span> | 
|  | 477  464 <span class="c"># . Reference to an array</span> | 
|  | 478  465 <span class="c"># . An array</span> | 
|  | 479  466 <span class="c">#</span> | 
|  | 480 <a name="GetXYZ-"></a> 467 <span class="k">sub </span><span class="m">GetXYZ</span> <span class="s">{</span> | 
|  | 481  468   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 482  469 | 
|  | 483  470   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">XYZ</span>}<span class="i">->GetXYZ</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 484  471 <span class="s">}</span> | 
|  | 485  472 | 
|  | 486  473 <span class="c"># Return XYZ as a vector object...</span> | 
|  | 487  474 <span class="c">#</span> | 
|  | 488 <a name="GetXYZVector-"></a> 475 <span class="k">sub </span><span class="m">GetXYZVector</span> <span class="s">{</span> | 
|  | 489  476   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 490  477 | 
|  | 491  478   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">XYZ</span>}<span class="sc">;</span> | 
|  | 492  479 <span class="s">}</span> | 
|  | 493  480 | 
|  | 494  481 <span class="c"># Get X value...</span> | 
|  | 495 <a name="GetX-"></a> 482 <span class="k">sub </span><span class="m">GetX</span> <span class="s">{</span> | 
|  | 496  483   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 497  484 | 
|  | 498  485   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">XYZ</span>}<span class="i">->GetX</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 499  486 <span class="s">}</span> | 
|  | 500  487 | 
|  | 501  488 <span class="c"># Get Y value...</span> | 
|  | 502 <a name="GetY-"></a> 489 <span class="k">sub </span><span class="m">GetY</span> <span class="s">{</span> | 
|  | 503  490   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 504  491 | 
|  | 505  492   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">XYZ</span>}<span class="i">->GetY</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 506  493 <span class="s">}</span> | 
|  | 507  494 | 
|  | 508  495 <span class="c"># Get Z value...</span> | 
|  | 509 <a name="GetZ-"></a> 496 <span class="k">sub </span><span class="m">GetZ</span> <span class="s">{</span> | 
|  | 510  497   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 511  498 | 
|  | 512  499   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">XYZ</span>}<span class="i">->GetZ</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 513  500 <span class="s">}</span> | 
|  | 514  501 | 
|  | 515  502 <span class="c"># Delete atom...</span> | 
|  | 516 <a name="DeleteAtom-"></a> 503 <span class="k">sub </span><span class="m">DeleteAtom</span> <span class="s">{</span> | 
|  | 517  504   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 518  505 | 
|  | 519  506   <span class="c"># Is this atom in a molecule?</span> | 
|  | 520  507   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 521  508     <span class="c"># Nothing to do...</span> | 
|  | 522  509     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 523  510   <span class="s">}</span> | 
|  | 524  511   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 525  512 | 
|  | 526  513   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_DeleteAtom</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 527  514 <span class="s">}</span> | 
|  | 528  515 | 
|  | 529  516 <span class="c"># Get atom neighbor objects as array. In scalar conetxt, return number of neighbors...</span> | 
|  | 530 <a name="GetNeighbors-"></a> 517 <span class="k">sub </span><span class="m">GetNeighbors</span> <span class="s">{</span> | 
|  | 531  518   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@ExcludeNeighbors</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 532  519 | 
|  | 533  520   <span class="c"># Is this atom in a molecule?</span> | 
|  | 534  521   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 535  522     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 536  523   <span class="s">}</span> | 
|  | 537  524   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 538  525 | 
|  | 539  526   <span class="k">if</span> <span class="s">(</span><span class="i">@ExcludeNeighbors</span><span class="s">)</span> <span class="s">{</span> | 
|  | 540  527     <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomNeighbors</span><span class="s">(</span><span class="i">@ExcludeNeighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 541  528   <span class="s">}</span> | 
|  | 542  529   <span class="k">else</span> <span class="s">{</span> | 
|  | 543  530     <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 544  531   <span class="s">}</span> | 
|  | 545  532 <span class="s">}</span> | 
|  | 546  533 | 
|  | 547  534 <span class="c"># Get atom neighbor objects as array. In scalar conetxt, return number of neighbors...</span> | 
|  | 548 <a name="_GetAtomNeighbors-"></a> 535 <span class="k">sub </span><span class="m">_GetAtomNeighbors</span> <span class="s">{</span> | 
|  | 549  536   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@ExcludeNeighbors</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 550  537   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 551  538 | 
|  | 552  539   <span class="k">if</span> <span class="s">(</span>!<span class="i">@ExcludeNeighbors</span><span class="s">)</span> <span class="s">{</span> | 
|  | 553  540     <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetAtomNeighbors</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 554  541   <span class="s">}</span> | 
|  | 555  542 | 
|  | 556  543   <span class="c"># Setup a map for neigbhors to exclude...</span> | 
|  | 557  544   <span class="k">my</span><span class="s">(</span><span class="i">$ExcludeNeighbor</span><span class="cm">,</span> <span class="i">$ExcludeNeighborID</span><span class="cm">,</span> <span class="i">%ExcludeNeighborsIDsMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 558  545 | 
|  | 559  546   <span class="i">%ExcludeNeighborsIDsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 560  547   <span class="k">for</span> <span class="i">$ExcludeNeighbor</span> <span class="s">(</span><span class="i">@ExcludeNeighbors</span><span class="s">)</span> <span class="s">{</span> | 
|  | 561  548     <span class="i">$ExcludeNeighborID</span> = <span class="i">$ExcludeNeighbor</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 562  549     <span class="i">$ExcludeNeighborsIDsMap</span>{<span class="i">$ExcludeNeighborID</span>} = <span class="i">$ExcludeNeighborID</span><span class="sc">;</span> | 
|  | 563  550   <span class="s">}</span> | 
|  | 564  551 | 
|  | 565  552   <span class="c"># Generate a filtered neighbors list...</span> | 
|  | 566  553   <span class="k">my</span><span class="s">(</span><span class="i">$Neighbor</span><span class="cm">,</span> <span class="i">$NeighborID</span><span class="cm">,</span> <span class="i">@FilteredAtomNeighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 567  554   <span class="i">@FilteredAtomNeighbors</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 568  555   <span class="j">NEIGHBOR:</span> <span class="k">for</span> <span class="i">$Neighbor</span> <span class="s">(</span><span class="i">$Molecule</span><span class="i">->_GetAtomNeighbors</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 569  556       <span class="i">$NeighborID</span> = <span class="i">$Neighbor</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 570  557       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ExcludeNeighborsIDsMap</span>{<span class="i">$NeighborID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 571  558         <span class="k">next</span> <span class="j">NEIGHBOR</span><span class="sc">;</span> | 
|  | 572  559       <span class="s">}</span> | 
|  | 573  560     <span class="k">push</span> <span class="i">@FilteredAtomNeighbors</span><span class="cm">,</span> <span class="i">$Neighbor</span><span class="sc">;</span> | 
|  | 574  561   <span class="s">}</span> | 
|  | 575  562 | 
|  | 576  563   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@FilteredAtomNeighbors</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@FilteredAtomNeighbors</span><span class="sc">;</span> | 
|  | 577  564 <span class="s">}</span> | 
|  | 578  565 | 
|  | 579  566 <span class="c"># Get specific atom neighbor objects as array. In scalar conetxt, return number of neighbors.</span> | 
|  | 580  567 <span class="c">#</span> | 
|  | 581  568 <span class="c"># Notes:</span> | 
|  | 582  569 <span class="c">#   . AtomSpecification correspond to any valid AtomicInvariant based atomic specifications</span> | 
|  | 583  570 <span class="c">#     as implemented in DoesAtomNeighborhoodMatch method.</span> | 
|  | 584  571 <span class="c">#   . Multiple atom specifications can be used in a string delimited by comma.</span> | 
|  | 585  572 <span class="c">#</span> | 
|  | 586 <a name="GetNeighborsUsingAtomSpecification-"></a> 573 <span class="k">sub </span><span class="m">GetNeighborsUsingAtomSpecification</span> <span class="s">{</span> | 
|  | 587  574   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomSpecification</span><span class="cm">,</span> <span class="i">@ExcludeNeighbors</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 588  575   <span class="k">my</span><span class="s">(</span><span class="i">@AtomNeighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 589  576 | 
|  | 590  577   <span class="i">@AtomNeighbors</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 591  578   <span class="i">@AtomNeighbors</span> = <span class="i">$This</span><span class="i">->GetNeighbors</span><span class="s">(</span><span class="i">@ExcludeNeighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 592  579 | 
|  | 593  580   <span class="c"># Does atom has any neighbors and do they need to be filtered?</span> | 
|  | 594  581   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">@AtomNeighbors</span> && <span class="k">defined</span><span class="s">(</span><span class="i">$AtomSpecification</span><span class="s">)</span> && <span class="i">$AtomSpecification</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 595  582     <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@AtomNeighbors</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@AtomNeighbors</span><span class="sc">;</span> | 
|  | 596  583   <span class="s">}</span> | 
|  | 597  584 | 
|  | 598  585   <span class="c"># Filter neighbors using atom specification...</span> | 
|  | 599  586   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNeighbor</span><span class="cm">,</span> <span class="i">@FilteredAtomNeighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 600  587 | 
|  | 601  588   <span class="i">@FilteredAtomNeighbors</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 602  589   <span class="j">NEIGHBOR:</span> <span class="k">for</span> <span class="i">$AtomNeighbor</span> <span class="s">(</span><span class="i">@AtomNeighbors</span><span class="s">)</span> <span class="s">{</span> | 
|  | 603  590     <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomNeighbor</span><span class="i">->_DoesAtomSpecificationMatch</span><span class="s">(</span><span class="i">$AtomSpecification</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 604  591       <span class="k">next</span> <span class="j">NEIGHBOR</span><span class="sc">;</span> | 
|  | 605  592     <span class="s">}</span> | 
|  | 606  593     <span class="k">push</span> <span class="i">@FilteredAtomNeighbors</span><span class="cm">,</span> <span class="i">$AtomNeighbor</span><span class="sc">;</span> | 
|  | 607  594   <span class="s">}</span> | 
|  | 608  595 | 
|  | 609  596   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@FilteredAtomNeighbors</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@FilteredAtomNeighbors</span><span class="sc">;</span> | 
|  | 610  597 <span class="s">}</span> | 
|  | 611  598 | 
|  | 612  599 | 
|  | 613  600 <span class="c"># Get non-hydrogen atom neighbor objects as array. In scalar context, return number of neighbors...</span> | 
|  | 614 <a name="GetHeavyAtomNeighbors-"></a> 601 <span class="k">sub </span><span class="m">GetHeavyAtomNeighbors</span> <span class="s">{</span> | 
|  | 615  602   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 616  603 | 
|  | 617  604   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 618  605 <span class="s">}</span> | 
|  | 619  606 | 
|  | 620  607 <span class="c"># Get non-hydrogen atom neighbor objects as array. In scalar context, return number of neighbors...</span> | 
|  | 621 <a name="GetNonHydrogenAtomNeighbors-"></a> 608 <span class="k">sub </span><span class="m">GetNonHydrogenAtomNeighbors</span> <span class="s">{</span> | 
|  | 622  609   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 623  610 | 
|  | 624  611   <span class="c"># Is this atom in a molecule?</span> | 
|  | 625  612   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 626  613     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 627  614   <span class="s">}</span> | 
|  | 628  615   <span class="k">my</span><span class="s">(</span><span class="i">$NonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$HydrogenAtomsOnly</span><span class="s">)</span> = <span class="s">(</span><span class="n">1</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 629  616 | 
|  | 630  617   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetFilteredAtomNeighbors</span><span class="s">(</span><span class="i">$NonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$HydrogenAtomsOnly</span><span class="s">)</span><span class="sc">;</span> | 
|  | 631  618 <span class="s">}</span> | 
|  | 632  619 | 
|  | 633  620 <span class="c"># Get hydrogen atom neighbor objects as array. In scalar context, return numbe of neighbors...</span> | 
|  | 634 <a name="GetHydrogenAtomNeighbors-"></a> 621 <span class="k">sub </span><span class="m">GetHydrogenAtomNeighbors</span> <span class="s">{</span> | 
|  | 635  622   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 636  623 | 
|  | 637  624   <span class="c"># Is this atom in a molecule?</span> | 
|  | 638  625   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 639  626     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 640  627   <span class="s">}</span> | 
|  | 641  628   <span class="k">my</span><span class="s">(</span><span class="i">$NonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$HydrogenAtomsOnly</span><span class="s">)</span> = <span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 642  629 | 
|  | 643  630   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetFilteredAtomNeighbors</span><span class="s">(</span><span class="i">$NonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$HydrogenAtomsOnly</span><span class="s">)</span><span class="sc">;</span> | 
|  | 644  631 <span class="s">}</span> | 
|  | 645  632 | 
|  | 646  633 <span class="c"># Get non-hydrogen neighbor of hydrogen atom...</span> | 
|  | 647  634 <span class="c">#</span> | 
|  | 648 <a name="GetNonHydrogenNeighborOfHydrogenAtom-"></a> 635 <span class="k">sub </span><span class="m">GetNonHydrogenNeighborOfHydrogenAtom</span> <span class="s">{</span> | 
|  | 649  636   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 650  637 | 
|  | 651  638   <span class="c"># Is it Hydrogen?</span> | 
|  | 652  639   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 653  640     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 654  641   <span class="s">}</span> | 
|  | 655  642   <span class="k">my</span><span class="s">(</span><span class="i">@Neighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 656  643 | 
|  | 657  644   <span class="i">@Neighbors</span> = <span class="i">$This</span><span class="i">->GetNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 658  645 | 
|  | 659  646   <span class="k">return</span> <span class="s">(</span><span class="i">@Neighbors</span> == <span class="n">1</span><span class="s">)</span> ? <span class="i">$Neighbors</span>[<span class="n">0</span>] <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 660  647 <span class="s">}</span> | 
|  | 661  648 | 
|  | 662  649 <span class="c"># Get filtered atom atom neighbors</span> | 
|  | 663 <a name="_GetFilteredAtomNeighbors-"></a> 650 <span class="k">sub </span><span class="m">_GetFilteredAtomNeighbors</span> <span class="s">{</span> | 
|  | 664  651   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$HydrogenAtomsOnly</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 665  652 | 
|  | 666  653   <span class="c"># Check flags...</span> | 
|  | 667  654   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$NonHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 668  655     <span class="i">$NonHydrogenAtomsOnly</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 669  656   <span class="s">}</span> | 
|  | 670  657   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$HydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 671  658     <span class="i">$HydrogenAtomsOnly</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 672  659   <span class="s">}</span> | 
|  | 673  660   <span class="k">my</span><span class="s">(</span><span class="i">$Neighbor</span><span class="cm">,</span> <span class="i">@FilteredAtomNeighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 674  661 | 
|  | 675  662   <span class="i">@FilteredAtomNeighbors</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 676  663   <span class="j">NEIGHBOR:</span> <span class="k">for</span> <span class="i">$Neighbor</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetNeighbors</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 677  664     <span class="k">if</span> <span class="s">(</span><span class="i">$NonHydrogenAtomsOnly</span> && <span class="i">$Neighbor</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 678  665       <span class="k">next</span> <span class="j">NEIGHBOR</span><span class="sc">;</span> | 
|  | 679  666     <span class="s">}</span> | 
|  | 680  667     <span class="k">if</span> <span class="s">(</span><span class="i">$HydrogenAtomsOnly</span> && <span class="s">(</span>!<span class="i">$Neighbor</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 681  668       <span class="k">next</span> <span class="j">NEIGHBOR</span><span class="sc">;</span> | 
|  | 682  669     <span class="s">}</span> | 
|  | 683  670     <span class="k">push</span> <span class="i">@FilteredAtomNeighbors</span><span class="cm">,</span> <span class="i">$Neighbor</span><span class="sc">;</span> | 
|  | 684  671   <span class="s">}</span> | 
|  | 685  672 | 
|  | 686  673   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@FilteredAtomNeighbors</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@FilteredAtomNeighbors</span><span class="sc">;</span> | 
|  | 687  674 <span class="s">}</span> | 
|  | 688  675 | 
|  | 689  676 <span class="c"># Get number of neighbors...</span> | 
|  | 690  677 <span class="c">#</span> | 
|  | 691 <a name="GetNumOfNeighbors-"></a> 678 <span class="k">sub </span><span class="m">GetNumOfNeighbors</span> <span class="s">{</span> | 
|  | 692  679   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 693  680   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfNeighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 694  681 | 
|  | 695  682   <span class="i">$NumOfNeighbors</span> = <span class="i">$This</span><span class="i">->GetNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 696  683 | 
|  | 697  684   <span class="k">return</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$NumOfNeighbors</span><span class="s">)</span> ? <span class="i">$NumOfNeighbors</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 698  685 <span class="s">}</span> | 
|  | 699  686 | 
|  | 700  687 <span class="c"># Get number of neighbors which are non-hydrogen atoms...</span> | 
|  | 701 <a name="GetNumOfHeavyAtomNeighbors-"></a> 688 <span class="k">sub </span><span class="m">GetNumOfHeavyAtomNeighbors</span> <span class="s">{</span> | 
|  | 702  689   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 703  690 | 
|  | 704  691   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 705  692 <span class="s">}</span> | 
|  | 706  693 | 
|  | 707  694 <span class="c"># Get number of neighbors which are non-hydrogen atoms...</span> | 
|  | 708 <a name="GetNumOfNonHydrogenAtomNeighbors-"></a> 695 <span class="k">sub </span><span class="m">GetNumOfNonHydrogenAtomNeighbors</span> <span class="s">{</span> | 
|  | 709  696   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 710  697   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfNeighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 711  698 | 
|  | 712  699   <span class="i">$NumOfNeighbors</span> = <span class="i">$This</span><span class="i">->GetNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 713  700 | 
|  | 714  701   <span class="k">return</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$NumOfNeighbors</span><span class="s">)</span> ? <span class="i">$NumOfNeighbors</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 715  702 <span class="s">}</span> | 
|  | 716  703 | 
|  | 717  704 <span class="c"># Get number of neighbors which are hydrogen atoms...</span> | 
|  | 718 <a name="GetNumOfHydrogenAtomNeighbors-"></a> 705 <span class="k">sub </span><span class="m">GetNumOfHydrogenAtomNeighbors</span> <span class="s">{</span> | 
|  | 719  706   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 720  707   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfNeighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 721  708 | 
|  | 722  709   <span class="i">$NumOfNeighbors</span> = <span class="i">$This</span><span class="i">->GetHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 723  710 | 
|  | 724  711   <span class="k">return</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$NumOfNeighbors</span><span class="s">)</span> ? <span class="i">$NumOfNeighbors</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 725  712 <span class="s">}</span> | 
|  | 726  713 | 
|  | 727  714 <span class="c"># Get bond objects as array. In scalar context, return number of bonds...</span> | 
|  | 728 <a name="GetBonds-"></a> 715 <span class="k">sub </span><span class="m">GetBonds</span> <span class="s">{</span> | 
|  | 729  716   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 730  717 | 
|  | 731  718   <span class="c"># Is this atom in a molecule?</span> | 
|  | 732  719   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 733  720     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 734  721   <span class="s">}</span> | 
|  | 735  722   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 736  723 | 
|  | 737  724   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetAtomBonds</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 738  725 <span class="s">}</span> | 
|  | 739  726 | 
|  | 740  727 <span class="c"># Get bond to specified atom...</span> | 
|  | 741 <a name="GetBondToAtom-"></a> 728 <span class="k">sub </span><span class="m">GetBondToAtom</span> <span class="s">{</span> | 
|  | 742  729   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 743  730 | 
|  | 744  731   <span class="c"># Is this atom in a molecule?</span> | 
|  | 745  732   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 746  733     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 747  734   <span class="s">}</span> | 
|  | 748  735   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 749  736 | 
|  | 750  737   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetBondToAtom</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span><span class="sc">;</span> | 
|  | 751  738 <span class="s">}</span> | 
|  | 752  739 | 
|  | 753  740 <span class="c"># It it bonded to a specified atom?</span> | 
|  | 754 <a name="IsBondedToAtom-"></a> 741 <span class="k">sub </span><span class="m">IsBondedToAtom</span> <span class="s">{</span> | 
|  | 755  742   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 756  743 | 
|  | 757  744   <span class="c"># Is this atom in a molecule?</span> | 
|  | 758  745   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 759  746     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 760  747   <span class="s">}</span> | 
|  | 761  748   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 762  749 | 
|  | 763  750   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_IsBondedToAtom</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span><span class="sc">;</span> | 
|  | 764  751 <span class="s">}</span> | 
|  | 765  752 | 
|  | 766  753 <span class="c"># Get bond objects to non-hydrogen atoms as array. In scalar context, return number of bonds...</span> | 
|  | 767 <a name="GetBondsToHeavyAtoms-"></a> 754 <span class="k">sub </span><span class="m">GetBondsToHeavyAtoms</span> <span class="s">{</span> | 
|  | 768  755   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 769  756 | 
|  | 770  757   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 771  758 <span class="s">}</span> | 
|  | 772  759 | 
|  | 773  760 <span class="c"># Get bond objects to non-hydrogen atoms as array. In scalar context, return number of bonds...</span> | 
|  | 774 <a name="GetBondsToNonHydrogenAtoms-"></a> 761 <span class="k">sub </span><span class="m">GetBondsToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 775  762   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 776  763 | 
|  | 777  764   <span class="c"># Is this atom in a molecule?</span> | 
|  | 778  765   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 779  766     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 780  767   <span class="s">}</span> | 
|  | 781  768   <span class="k">my</span><span class="s">(</span><span class="i">$BondsToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$BondsToHydrogenAtomsOnly</span><span class="s">)</span> = <span class="s">(</span><span class="n">1</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 782  769 | 
|  | 783  770   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetFilteredBonds</span><span class="s">(</span><span class="i">$BondsToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$BondsToHydrogenAtomsOnly</span><span class="s">)</span><span class="sc">;</span> | 
|  | 784  771 <span class="s">}</span> | 
|  | 785  772 | 
|  | 786  773 <span class="c"># Get bond objects to hydrogen atoms as array. In scalar context, return number of bonds...</span> | 
|  | 787 <a name="GetBondsToHydrogenAtoms-"></a> 774 <span class="k">sub </span><span class="m">GetBondsToHydrogenAtoms</span> <span class="s">{</span> | 
|  | 788  775   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 789  776 | 
|  | 790  777   <span class="c"># Is this atom in a molecule?</span> | 
|  | 791  778   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 792  779     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 793  780   <span class="s">}</span> | 
|  | 794  781   <span class="k">my</span><span class="s">(</span><span class="i">$BondsToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$BondsToHydrogenAtomsOnly</span><span class="s">)</span> = <span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 795  782 | 
|  | 796  783   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetFilteredBonds</span><span class="s">(</span><span class="i">$BondsToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$BondsToHydrogenAtomsOnly</span><span class="s">)</span><span class="sc">;</span> | 
|  | 797  784 <span class="s">}</span> | 
|  | 798  785 | 
|  | 799  786 <span class="c"># Get filtered bonds...</span> | 
|  | 800 <a name="_GetFilteredBonds-"></a> 787 <span class="k">sub </span><span class="m">_GetFilteredBonds</span> <span class="s">{</span> | 
|  | 801  788   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$BondsToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$BondsToHydrogenAtomsOnly</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 802  789 | 
|  | 803  790   <span class="c"># Check flags...</span> | 
|  | 804  791   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$BondsToNonHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 805  792     <span class="i">$BondsToNonHydrogenAtomsOnly</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 806  793   <span class="s">}</span> | 
|  | 807  794   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$BondsToHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 808  795     <span class="i">$BondsToHydrogenAtomsOnly</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 809  796   <span class="s">}</span> | 
|  | 810  797 | 
|  | 811  798   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="cm">,</span> <span class="i">$BondedAtom</span><span class="cm">,</span> <span class="i">@FilteredBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 812  799 | 
|  | 813  800   <span class="i">@FilteredBonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 814  801   <span class="j">BOND:</span> <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetBonds</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 815  802     <span class="i">$BondedAtom</span> = <span class="i">$Bond</span><span class="i">->GetBondedAtom</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 816  803     <span class="k">if</span> <span class="s">(</span><span class="i">$BondsToNonHydrogenAtomsOnly</span> && <span class="i">$BondedAtom</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 817  804       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 818  805     <span class="s">}</span> | 
|  | 819  806     <span class="k">if</span> <span class="s">(</span><span class="i">$BondsToHydrogenAtomsOnly</span> && <span class="s">(</span>!<span class="i">$BondedAtom</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 820  807       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 821  808     <span class="s">}</span> | 
|  | 822  809     <span class="k">push</span> <span class="i">@FilteredBonds</span><span class="cm">,</span> <span class="i">$Bond</span><span class="sc">;</span> | 
|  | 823  810   <span class="s">}</span> | 
|  | 824  811 | 
|  | 825  812   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@FilteredBonds</span> <span class="co">:</span> <span class="s">(</span><span class="k">scalar</span> <span class="i">@FilteredBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 826  813 <span class="s">}</span> | 
|  | 827  814 | 
|  | 828  815 <span class="c"># Get number of bonds...</span> | 
|  | 829  816 <span class="c">#</span> | 
|  | 830 <a name="GetNumOfBonds-"></a> 817 <span class="k">sub </span><span class="m">GetNumOfBonds</span> <span class="s">{</span> | 
|  | 831  818   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 832  819   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 833  820 | 
|  | 834  821   <span class="i">$NumOfBonds</span> = <span class="i">$This</span><span class="i">->GetBonds</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 835  822 | 
|  | 836  823   <span class="k">return</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$NumOfBonds</span><span class="s">)</span> ? <span class="s">(</span><span class="i">$NumOfBonds</span><span class="s">)</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 837  824 <span class="s">}</span> | 
|  | 838  825 | 
|  | 839  826 <span class="c"># Get number of bonds to non-hydrogen atoms...</span> | 
|  | 840 <a name="GetNumOfBondsToHeavyAtoms-"></a> 827 <span class="k">sub </span><span class="m">GetNumOfBondsToHeavyAtoms</span> <span class="s">{</span> | 
|  | 841  828   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 842  829 | 
|  | 843  830   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 844  831 <span class="s">}</span> | 
|  | 845  832 | 
|  | 846  833 <span class="c"># Get number of bonds to non-hydrogen atoms...</span> | 
|  | 847 <a name="GetNumOfBondsToNonHydrogenAtoms-"></a> 834 <span class="k">sub </span><span class="m">GetNumOfBondsToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 848  835   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 849  836   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 850  837 | 
|  | 851  838   <span class="i">$NumOfBonds</span> = <span class="i">$This</span><span class="i">->GetBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 852  839 | 
|  | 853  840   <span class="k">return</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$NumOfBonds</span><span class="s">)</span> ? <span class="s">(</span><span class="i">$NumOfBonds</span><span class="s">)</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 854  841 <span class="s">}</span> | 
|  | 855  842 | 
|  | 856  843 <span class="c"># Get number of single bonds to heavy atoms...</span> | 
|  | 857 <a name="GetNumOfSingleBondsToHeavyAtoms-"></a> 844 <span class="k">sub </span><span class="m">GetNumOfSingleBondsToHeavyAtoms</span> <span class="s">{</span> | 
|  | 858  845   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 859  846 | 
|  | 860  847   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfSingleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 861  848 <span class="s">}</span> | 
|  | 862  849 | 
|  | 863  850 <span class="c"># Get number of single bonds to non-hydrogen atoms...</span> | 
|  | 864 <a name="GetNumOfSingleBondsToNonHydrogenAtoms-"></a> 851 <span class="k">sub </span><span class="m">GetNumOfSingleBondsToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 865  852   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 866  853 | 
|  | 867  854   <span class="c"># Is this atom in a molecule?</span> | 
|  | 868  855   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 869  856     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 870  857   <span class="s">}</span> | 
|  | 871  858   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfBondsWithSpecifiedBondOrderToNonHydrogenAtoms</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 872  859 <span class="s">}</span> | 
|  | 873  860 | 
|  | 874  861 <span class="c"># Get number of double bonds to heavy atoms...</span> | 
|  | 875 <a name="GetNumOfDoubleBondsToHeavyAtoms-"></a> 862 <span class="k">sub </span><span class="m">GetNumOfDoubleBondsToHeavyAtoms</span> <span class="s">{</span> | 
|  | 876  863   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 877  864 | 
|  | 878  865   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfDoubleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 879  866 <span class="s">}</span> | 
|  | 880  867 | 
|  | 881  868 <span class="c"># Get number of double bonds to non-hydrogen atoms...</span> | 
|  | 882 <a name="GetNumOfDoubleBondsToNonHydrogenAtoms-"></a> 869 <span class="k">sub </span><span class="m">GetNumOfDoubleBondsToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 883  870   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 884  871 | 
|  | 885  872   <span class="c"># Is this atom in a molecule?</span> | 
|  | 886  873   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 887  874     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 888  875   <span class="s">}</span> | 
|  | 889  876   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfBondsWithSpecifiedBondOrderToNonHydrogenAtoms</span><span class="s">(</span><span class="n">2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 890  877 <span class="s">}</span> | 
|  | 891  878 | 
|  | 892  879 <span class="c"># Get number of triple bonds to heavy atoms...</span> | 
|  | 893 <a name="GetNumOfTripleBondsToHeavyAtoms-"></a> 880 <span class="k">sub </span><span class="m">GetNumOfTripleBondsToHeavyAtoms</span> <span class="s">{</span> | 
|  | 894  881   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 895  882 | 
|  | 896  883   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfTripleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 897  884 <span class="s">}</span> | 
|  | 898  885 | 
|  | 899  886 <span class="c"># Get number of triple bonds to non-hydrogen atoms...</span> | 
|  | 900 <a name="GetNumOfTripleBondsToNonHydrogenAtoms-"></a> 887 <span class="k">sub </span><span class="m">GetNumOfTripleBondsToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 901  888   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 902  889 | 
|  | 903  890   <span class="c"># Is this atom in a molecule?</span> | 
|  | 904  891   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 905  892     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 906  893   <span class="s">}</span> | 
|  | 907  894   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfBondsWithSpecifiedBondOrderToNonHydrogenAtoms</span><span class="s">(</span><span class="n">3</span><span class="s">)</span><span class="sc">;</span> | 
|  | 908  895 <span class="s">}</span> | 
|  | 909  896 | 
|  | 910  897 <span class="c"># Get number of bonds of specified bond order to non-hydrogen atoms...</span> | 
|  | 911 <a name="_GetNumOfBondsWithSpecifiedBondOrderToNonHydrogenAtoms-"></a> 898 <span class="k">sub </span><span class="m">_GetNumOfBondsWithSpecifiedBondOrderToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 912  899   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$SpecifiedBondOrder</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 913  900   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfBonds</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$BondOrder</span><span class="cm">,</span> <span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 914  901 | 
|  | 915  902   <span class="i">$NumOfBonds</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 916  903   <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 917  904   <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span> <span class="s">{</span> | 
|  | 918  905     <span class="i">$BondOrder</span> = <span class="i">$Bond</span><span class="i">->GetBondOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 919  906     <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedBondOrder</span> == <span class="i">$BondOrder</span><span class="s">)</span> <span class="s">{</span> | 
|  | 920  907       <span class="i">$NumOfBonds</span>++<span class="sc">;</span> | 
|  | 921  908     <span class="s">}</span> | 
|  | 922  909   <span class="s">}</span> | 
|  | 923  910   <span class="k">return</span> <span class="i">$NumOfBonds</span><span class="sc">;</span> | 
|  | 924  911 <span class="s">}</span> | 
|  | 925  912 | 
|  | 926  913 <span class="c"># Get number of aromatic bonds to heavy atoms...</span> | 
|  | 927 <a name="GetNumOfAromaticBondsToHeavyAtoms-"></a> 914 <span class="k">sub </span><span class="m">GetNumOfAromaticBondsToHeavyAtoms</span> <span class="s">{</span> | 
|  | 928  915   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 929  916 | 
|  | 930  917   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfAromaticBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 931  918 <span class="s">}</span> | 
|  | 932  919 | 
|  | 933  920 <span class="c"># Get number of aromatic bonds to non-hydrogen atoms...</span> | 
|  | 934 <a name="GetNumOfAromaticBondsToNonHydrogenAtoms-"></a> 921 <span class="k">sub </span><span class="m">GetNumOfAromaticBondsToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 935  922   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 936  923   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfBonds</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 937  924 | 
|  | 938  925   <span class="c"># Is this atom in a molecule?</span> | 
|  | 939  926   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 940  927     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 941  928   <span class="s">}</span> | 
|  | 942  929 | 
|  | 943  930   <span class="i">$NumOfBonds</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 944  931   <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 945  932   <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span> <span class="s">{</span> | 
|  | 946  933     <span class="k">if</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> <span class="i">$NumOfBonds</span>++<span class="sc">;</span> <span class="s">}</span> | 
|  | 947  934   <span class="s">}</span> | 
|  | 948  935   <span class="k">return</span> <span class="i">$NumOfBonds</span><span class="sc">;</span> | 
|  | 949  936 <span class="s">}</span> | 
|  | 950  937 | 
|  | 951  938 <span class="c"># Get number of different bond types to non-hydrogen atoms...</span> | 
|  | 952  939 <span class="c">#</span> | 
|  | 953 <a name="GetNumOfBondTypesToHeavyAtoms-"></a> 940 <span class="k">sub </span><span class="m">GetNumOfBondTypesToHeavyAtoms</span> <span class="s">{</span> | 
|  | 954  941   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$CountAromaticBonds</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 955  942 | 
|  | 956  943   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfBondTypesToNonHydrogenAtoms</span><span class="s">(</span><span class="i">$CountAromaticBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 957  944 <span class="s">}</span> | 
|  | 958  945 | 
|  | 959  946 <span class="c"># Get number of single, double, triple, and aromatic bonds from an atom to all other</span> | 
|  | 960  947 <span class="c"># non-hydrogen atoms. Value of CountAtomaticBonds parameter controls whether</span> | 
|  | 961  948 <span class="c"># number of aromatic bonds is returned; default is not to count aromatic bonds. During</span> | 
|  | 962  949 <span class="c"># counting of aromatic bonds, the bond marked aromatic is not included in the count</span> | 
|  | 963  950 <span class="c"># of other bond types.</span> | 
|  | 964  951 <span class="c">#</span> | 
|  | 965 <a name="GetNumOfBondTypesToNonHydrogenAtoms-"></a> 952 <span class="k">sub </span><span class="m">GetNumOfBondTypesToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 966  953   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$CountAromaticBonds</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 967  954   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfSingleBonds</span><span class="cm">,</span> <span class="i">$NumOfDoubleBonds</span><span class="cm">,</span> <span class="i">$NumOfTripleBonds</span><span class="cm">,</span> <span class="i">$NumOfAromaticBonds</span><span class="cm">,</span> <span class="i">$None</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 968  955 | 
|  | 969  956   <span class="i">$CountAromaticBonds</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$CountAromaticBonds</span><span class="s">)</span> ? <span class="i">$CountAromaticBonds</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 970  957 | 
|  | 971  958   <span class="s">(</span><span class="i">$NumOfSingleBonds</span><span class="cm">,</span> <span class="i">$NumOfDoubleBonds</span><span class="cm">,</span> <span class="i">$NumOfTripleBonds</span><span class="s">)</span> = <span class="s">(</span><span class="q">'0'</span><span class="s">)</span> x <span class="n">3</span><span class="sc">;</span> | 
|  | 972  959   <span class="i">$NumOfAromaticBonds</span> = <span class="i">$CountAromaticBonds</span> ? <span class="n">0</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 973  960 | 
|  | 974  961   <span class="c"># Is this atom in a molecule?</span> | 
|  | 975  962   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 976  963     <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfSingleBonds</span><span class="cm">,</span> <span class="i">$NumOfDoubleBonds</span><span class="cm">,</span> <span class="i">$NumOfTripleBonds</span><span class="cm">,</span> <span class="i">$NumOfAromaticBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 977  964   <span class="s">}</span> | 
|  | 978  965 | 
|  | 979  966   <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 980  967 | 
|  | 981  968   <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span> <span class="s">{</span> | 
|  | 982  969     <span class="j">BONDTYPE:</span> <span class="s">{</span> | 
|  | 983  970       <span class="k">if</span> <span class="s">(</span><span class="i">$CountAromaticBonds</span><span class="s">)</span> <span class="s">{</span> | 
|  | 984  971         <span class="k">if</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> <span class="i">$NumOfAromaticBonds</span>++<span class="sc">;</span> <span class="k">last</span> <span class="j">BONDTYPE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 985  972       <span class="s">}</span> | 
|  | 986  973       <span class="k">if</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">->IsSingle</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> <span class="i">$NumOfSingleBonds</span>++<span class="sc">;</span> <span class="k">last</span> <span class="j">BONDTYPE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 987  974       <span class="k">if</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">->IsDouble</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> <span class="i">$NumOfDoubleBonds</span>++<span class="sc">;</span> <span class="k">last</span> <span class="j">BONDTYPE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 988  975       <span class="k">if</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">->IsTriple</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> <span class="i">$NumOfTripleBonds</span>++<span class="sc">;</span> <span class="k">last</span> <span class="j">BONDTYPE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 989  976       <span class="i">$None</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 990  977     <span class="s">}</span> | 
|  | 991  978   <span class="s">}</span> | 
|  | 992  979   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfSingleBonds</span><span class="cm">,</span> <span class="i">$NumOfDoubleBonds</span><span class="cm">,</span> <span class="i">$NumOfTripleBonds</span><span class="cm">,</span> <span class="i">$NumOfAromaticBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 993  980 <span class="s">}</span> | 
|  | 994  981 | 
|  | 995  982 <span class="c"># Get number of sigma and pi bonds to heavy atoms...</span> | 
|  | 996  983 <span class="c">#</span> | 
|  | 997 <a name="GetNumOfSigmaAndPiBondsToHeavyAtoms-"></a> 984 <span class="k">sub </span><span class="m">GetNumOfSigmaAndPiBondsToHeavyAtoms</span> <span class="s">{</span> | 
|  | 998  985   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 999  986 | 
|  | 1000  987   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfSigmaAndPiBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1001  988 <span class="s">}</span> | 
|  | 1002  989 | 
|  | 1003  990 <span class="c"># Get number of sigma and pi bonds from an atom to all other non-hydrogen atoms.</span> | 
|  | 1004  991 <span class="c"># Sigma and pi bonds are counted using the following methodology: a single bond</span> | 
|  | 1005  992 <span class="c"># correspond to one sigma bond; a double bond contributes one to sigma bond count</span> | 
|  | 1006  993 <span class="c"># and one to pi bond count; a triple bond contributes one to sigma bond count and</span> | 
|  | 1007  994 <span class="c"># two to pi bond count.</span> | 
|  | 1008  995 <span class="c">#</span> | 
|  | 1009 <a name="GetNumOfSigmaAndPiBondsToNonHydrogenAtoms-"></a> 996 <span class="k">sub </span><span class="m">GetNumOfSigmaAndPiBondsToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 1010  997   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1011  998   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfSingleBonds</span><span class="cm">,</span> <span class="i">$NumOfDoubleBonds</span><span class="cm">,</span> <span class="i">$NumOfTripleBonds</span><span class="cm">,</span> <span class="i">$NumOfSigmaBonds</span><span class="cm">,</span> <span class="i">$NumOfPiBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1012  999 | 
|  | 1013 1000   <span class="s">(</span><span class="i">$NumOfSingleBonds</span><span class="cm">,</span> <span class="i">$NumOfDoubleBonds</span><span class="cm">,</span> <span class="i">$NumOfTripleBonds</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetNumOfBondTypesToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1014 1001 | 
|  | 1015 1002   <span class="i">$NumOfSigmaBonds</span> = <span class="i">$NumOfSingleBonds</span> + <span class="i">$NumOfDoubleBonds</span> + <span class="i">$NumOfTripleBonds</span><span class="sc">;</span> | 
|  | 1016 1003   <span class="i">$NumOfPiBonds</span> = <span class="i">$NumOfDoubleBonds</span> + <span class="n">2</span>*<span class="i">$NumOfTripleBonds</span><span class="sc">;</span> | 
|  | 1017 1004 | 
|  | 1018 1005   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfSigmaBonds</span><span class="cm">,</span> <span class="i">$NumOfPiBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1019 1006 <span class="s">}</span> | 
|  | 1020 1007 | 
|  | 1021 1008 <span class="c"># Get information related to atoms for all heavy atoms attached to an atom..</span> | 
|  | 1022 1009 <span class="c">#</span> | 
|  | 1023 <a name="GetHeavyAtomNeighborsAtomInformation-"></a>1010 <span class="k">sub </span><span class="m">GetHeavyAtomNeighborsAtomInformation</span> <span class="s">{</span> | 
|  | 1024 1011   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1025 1012 | 
|  | 1026 1013   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNonHydrogenAtomNeighborsAtomInformation</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1027 1014 <span class="s">}</span> | 
|  | 1028 1015 | 
|  | 1029 1016 <span class="c"># Get information related to atoms for all non-hydrogen atoms attached to an atom..</span> | 
|  | 1030 1017 <span class="c">#</span> | 
|  | 1031 1018 <span class="c"># The following values are returned:</span> | 
|  | 1032 1019 <span class="c">#   . Number of non-hydrogen atom neighbors</span> | 
|  | 1033 1020 <span class="c">#   . A reference to an array containing atom objects correpsonding to non-hydrogen</span> | 
|  | 1034 1021 <span class="c">#     atom neighbors</span> | 
|  | 1035 1022 <span class="c">#   . Number of different types of non-hydrogen atom neighbors</span> | 
|  | 1036 1023 <span class="c">#   . A reference to a hash containing atom symbol as key with value corresponding</span> | 
|  | 1037 1024 <span class="c">#     to its count for non-hydrogen atom neighbors</span> | 
|  | 1038 1025 <span class="c">#</span> | 
|  | 1039 <a name="GetNonHydrogenAtomNeighborsAtomInformation-"></a>1026 <span class="k">sub </span><span class="m">GetNonHydrogenAtomNeighborsAtomInformation</span> <span class="s">{</span> | 
|  | 1040 1027   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1041 1028 | 
|  | 1042 1029   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1043 1030   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1044 1031     <span class="k">return</span> <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1045 1032   <span class="s">}</span> | 
|  | 1046 1033   <span class="k">my</span><span class="s">(</span><span class="i">$AtomSymbol</span><span class="cm">,</span> <span class="i">$AtomNeighbor</span><span class="cm">,</span> <span class="i">$NumOfAtomNeighbors</span><span class="cm">,</span> <span class="i">$NumOfAtomNeighborsType</span><span class="cm">,</span> <span class="i">@AtomNeighbors</span><span class="cm">,</span> <span class="i">%AtomNeighborsTypeMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1047 1034 | 
|  | 1048 1035   <span class="i">$NumOfAtomNeighbors</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">@AtomNeighbors</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1049 1036   <span class="i">$NumOfAtomNeighborsType</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">%AtomNeighborsTypeMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1050 1037 | 
|  | 1051 1038   <span class="i">@AtomNeighbors</span> = <span class="i">$This</span><span class="i">->GetNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1052 1039   <span class="i">$NumOfAtomNeighbors</span> = <span class="k">scalar</span> <span class="i">@AtomNeighbors</span><span class="sc">;</span> | 
|  | 1053 1040 | 
|  | 1054 1041   <span class="k">for</span> <span class="i">$AtomNeighbor</span> <span class="s">(</span><span class="i">@AtomNeighbors</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1055 1042     <span class="i">$AtomSymbol</span> = <span class="i">$AtomNeighbor</span>->{<span class="w">AtomSymbol</span>}<span class="sc">;</span> | 
|  | 1056 1043     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$AtomNeighborsTypeMap</span>{<span class="i">$AtomSymbol</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1057 1044       <span class="i">$AtomNeighborsTypeMap</span>{<span class="i">$AtomSymbol</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 1058 1045     <span class="s">}</span> | 
|  | 1059 1046     <span class="k">else</span> <span class="s">{</span> | 
|  | 1060 1047       <span class="i">$AtomNeighborsTypeMap</span>{<span class="i">$AtomSymbol</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 1061 1048       <span class="i">$NumOfAtomNeighborsType</span>++<span class="sc">;</span> | 
|  | 1062 1049     <span class="s">}</span> | 
|  | 1063 1050   <span class="s">}</span> | 
|  | 1064 1051 | 
|  | 1065 1052   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfAtomNeighbors</span><span class="cm">,</span> \<span class="i">@AtomNeighbors</span><span class="cm">,</span> <span class="i">$NumOfAtomNeighborsType</span><span class="cm">,</span> \<span class="i">%AtomNeighborsTypeMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1066 1053 <span class="s">}</span> | 
|  | 1067 1054 | 
|  | 1068 1055 <span class="c"># Get information related to bonds for all heavy atoms attached to an atom..</span> | 
|  | 1069 1056 <span class="c">#</span> | 
|  | 1070 <a name="GetHeavyAtomNeighborsBondformation-"></a>1057 <span class="k">sub </span><span class="m">GetHeavyAtomNeighborsBondformation</span> <span class="s">{</span> | 
|  | 1071 1058   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1072 1059 | 
|  | 1073 1060   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNonHydrogenAtomNeighborsBondInformation</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1074 1061 <span class="s">}</span> | 
|  | 1075 1062 | 
|  | 1076 1063 <span class="c"># Get information related to bonds for all non-hydrogen atoms attached to an atom..</span> | 
|  | 1077 1064 <span class="c">#</span> | 
|  | 1078 1065 <span class="c"># The following values are returned:</span> | 
|  | 1079 1066 <span class="c">#   . Number of bonds to non-hydrogen atom neighbors</span> | 
|  | 1080 1067 <span class="c">#   . A reference to an array containing bond objects correpsonding to non-hydrogen</span> | 
|  | 1081 1068 <span class="c">#     atom neighbors</span> | 
|  | 1082 1069 <span class="c">#   . A reference to a hash containing bond type as key with value corresponding</span> | 
|  | 1083 1070 <span class="c">#     to its count for non-hydrogen atom neighbors. Bond types are: Single, Double or Triple</span> | 
|  | 1084 1071 <span class="c">#   . A reference to a hash containing atom symbol as key pointing to bond type as second</span> | 
|  | 1085 1072 <span class="c">#     key with values correponding to count of bond types for atom symbol for non-hydrogen</span> | 
|  | 1086 1073 <span class="c">#     atom neighbors</span> | 
|  | 1087 1074 <span class="c">#   . A reference to a hash containing atom symbol as key pointing to bond type as second</span> | 
|  | 1088 1075 <span class="c">#     key with values correponding to atom objects array involved in corresponding bond type for</span> | 
|  | 1089 1076 <span class="c">#     atom symbol for non-hydrogen atom neighbors</span> | 
|  | 1090 1077 <span class="c">#</span> | 
|  | 1091 <a name="GetNonHydrogenAtomNeighborsBondInformation-"></a>1078 <span class="k">sub </span><span class="m">GetNonHydrogenAtomNeighborsBondInformation</span> <span class="s">{</span> | 
|  | 1092 1079   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1093 1080 | 
|  | 1094 1081   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1095 1082   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1096 1083     <span class="k">return</span> <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1097 1084   <span class="s">}</span> | 
|  | 1098 1085   <span class="k">my</span><span class="s">(</span><span class="i">$BondedAtom</span><span class="cm">,</span> <span class="i">$BondedAtomSymbol</span><span class="cm">,</span> <span class="i">$BondType</span><span class="cm">,</span> <span class="i">$None</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$NumOfBonds</span><span class="cm">,</span> <span class="i">@Bonds</span><span class="cm">,</span> <span class="i">%BondTypeCountMap</span><span class="cm">,</span> <span class="i">%AtomsBondTypesCountMap</span><span class="cm">,</span> <span class="i">%AtomsBondTypeAtomsMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1099 1086 | 
|  | 1100 1087   <span class="i">$NumOfBonds</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">@Bonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1101 1088   <span class="i">%BondTypeCountMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1102 1089   <span class="i">%AtomsBondTypesCountMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">%AtomsBondTypeAtomsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1103 1090 | 
|  | 1104 1091   <span class="i">$BondTypeCountMap</span>{<span class="w">Single</span>} = <span class="n">0</span><span class="sc">;</span> | 
|  | 1105 1092   <span class="i">$BondTypeCountMap</span>{<span class="w">Double</span>} = <span class="n">0</span><span class="sc">;</span> | 
|  | 1106 1093   <span class="i">$BondTypeCountMap</span>{<span class="w">Triple</span>} = <span class="n">0</span><span class="sc">;</span> | 
|  | 1107 1094 | 
|  | 1108 1095   <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1109 1096   <span class="i">$NumOfBonds</span> = <span class="k">scalar</span> <span class="i">@Bonds</span><span class="sc">;</span> | 
|  | 1110 1097 | 
|  | 1111 1098   <span class="j">BOND:</span> <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1112 1099     <span class="i">$BondType</span> = <span class="i">$Bond</span><span class="i">->IsSingle</span><span class="s">(</span><span class="s">)</span> ? <span class="q">"Single"</span> <span class="co">:</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">->IsDouble</span><span class="s">(</span><span class="s">)</span> ? <span class="q">"Double"</span> <span class="co">:</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">->IsTriple</span><span class="s">(</span><span class="s">)</span> ? <span class="q">"Triple"</span> <span class="co">:</span> <span class="q">""</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1113 1100     <span class="k">if</span> <span class="s">(</span>!<span class="i">$BondType</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1114 1101       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 1115 1102     <span class="s">}</span> | 
|  | 1116 1103 | 
|  | 1117 1104     <span class="c"># Track bond types...</span> | 
|  | 1118 1105     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$BondTypeCountMap</span>{<span class="i">$BondType</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1119 1106       <span class="i">$BondTypeCountMap</span>{<span class="i">$BondType</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 1120 1107     <span class="s">}</span> | 
|  | 1121 1108     <span class="k">else</span> <span class="s">{</span> | 
|  | 1122 1109       <span class="i">$BondTypeCountMap</span>{<span class="i">$BondType</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 1123 1110     <span class="s">}</span> | 
|  | 1124 1111 | 
|  | 1125 1112     <span class="i">$BondedAtom</span> = <span class="i">$Bond</span><span class="i">->GetBondedAtom</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1126 1113     <span class="i">$BondedAtomSymbol</span> = <span class="i">$BondedAtom</span>->{<span class="w">AtomSymbol</span>}<span class="sc">;</span> | 
|  | 1127 1114 | 
|  | 1128 1115     <span class="c"># Track bond types count for atom types involved in specific bond types...</span> | 
|  | 1129 1116     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$AtomsBondTypesCountMap</span>{<span class="i">$BondedAtomSymbol</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1130 1117       <span class="i">%</span>{<span class="i">$AtomsBondTypesCountMap</span>{<span class="i">$BondedAtomSymbol</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1131 1118     <span class="s">}</span> | 
|  | 1132 1119     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$AtomsBondTypesCountMap</span>{<span class="i">$BondedAtomSymbol</span>}{<span class="i">$BondType</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1133 1120       <span class="i">$AtomsBondTypesCountMap</span>{<span class="i">$BondedAtomSymbol</span>}{<span class="i">$BondType</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 1134 1121     <span class="s">}</span> | 
|  | 1135 1122     <span class="k">else</span> <span class="s">{</span> | 
|  | 1136 1123       <span class="i">$AtomsBondTypesCountMap</span>{<span class="i">$BondedAtomSymbol</span>}{<span class="i">$BondType</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 1137 1124     <span class="s">}</span> | 
|  | 1138 1125 | 
|  | 1139 1126     <span class="c"># Track atoms involved in specific bond types for specific atom types...</span> | 
|  | 1140 1127     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$AtomsBondTypeAtomsMap</span>{<span class="i">$BondedAtomSymbol</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1141 1128       <span class="i">%</span>{<span class="i">$AtomsBondTypeAtomsMap</span>{<span class="i">$BondedAtomSymbol</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1142 1129     <span class="s">}</span> | 
|  | 1143 1130     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$AtomsBondTypeAtomsMap</span>{<span class="i">$BondedAtomSymbol</span>}{<span class="i">$BondType</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1144 1131       <span class="i">@</span>{<span class="i">$AtomsBondTypeAtomsMap</span>{<span class="i">$BondedAtomSymbol</span>}{<span class="i">$BondType</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1145 1132     <span class="s">}</span> | 
|  | 1146 1133     <span class="k">push</span> <span class="i">@</span>{<span class="i">$AtomsBondTypeAtomsMap</span>{<span class="i">$BondedAtomSymbol</span>}{<span class="i">$BondType</span>}}<span class="cm">,</span> <span class="i">$BondedAtom</span><span class="sc">;</span> | 
|  | 1147 1134   <span class="s">}</span> | 
|  | 1148 1135 | 
|  | 1149 1136   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfBonds</span><span class="cm">,</span> \<span class="i">@Bonds</span><span class="cm">,</span> \<span class="i">%BondTypeCountMap</span><span class="cm">,</span> \<span class="i">%AtomsBondTypesCountMap</span><span class="cm">,</span> \<span class="i">%AtomsBondTypeAtomsMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1150 1137 <span class="s">}</span> | 
|  | 1151 1138 | 
|  | 1152 1139 <span class="c"># Get number of bonds to hydrogen atoms...</span> | 
|  | 1153 <a name="GetNumOfBondsToHydrogenAtoms-"></a>1140 <span class="k">sub </span><span class="m">GetNumOfBondsToHydrogenAtoms</span> <span class="s">{</span> | 
|  | 1154 1141   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1155 1142   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1156 1143 | 
|  | 1157 1144   <span class="i">$NumOfBonds</span> = <span class="i">$This</span><span class="i">->GetBondsToHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1158 1145 | 
|  | 1159 1146   <span class="k">return</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$NumOfBonds</span><span class="s">)</span> ? <span class="s">(</span><span class="i">$NumOfBonds</span><span class="s">)</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1160 1147 <span class="s">}</span> | 
|  | 1161 1148 | 
|  | 1162 1149 <span class="c"># Get sum of bond orders to all bonded atoms...</span> | 
|  | 1163 1150 <span class="c">#</span> | 
|  | 1164 <a name="GetSumOfBondOrders-"></a>1151 <span class="k">sub </span><span class="m">GetSumOfBondOrders</span> <span class="s">{</span> | 
|  | 1165 1152   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1166 1153 | 
|  | 1167 1154   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1168 1155   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1169 1156     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1170 1157   <span class="s">}</span> | 
|  | 1171 1158 | 
|  | 1172 1159   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetSumOfBondOrders</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1173 1160 <span class="s">}</span> | 
|  | 1174 1161 | 
|  | 1175 1162 <span class="c"># Get sum of bond orders to non-hydrogen atoms only...</span> | 
|  | 1176 1163 <span class="c">#</span> | 
|  | 1177 <a name="GetSumOfBondOrdersToHeavyAtoms-"></a>1164 <span class="k">sub </span><span class="m">GetSumOfBondOrdersToHeavyAtoms</span> <span class="s">{</span> | 
|  | 1178 1165   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1179 1166 | 
|  | 1180 1167   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSumOfBondOrdersToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1181 1168 <span class="s">}</span> | 
|  | 1182 1169 | 
|  | 1183 1170 <span class="c"># Get sum of bond orders to non-hydrogen atoms only...</span> | 
|  | 1184 1171 <span class="c">#</span> | 
|  | 1185 <a name="GetSumOfBondOrdersToNonHydrogenAtoms-"></a>1172 <span class="k">sub </span><span class="m">GetSumOfBondOrdersToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 1186 1173   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1187 1174 | 
|  | 1188 1175   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1189 1176   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1190 1177     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1191 1178   <span class="s">}</span> | 
|  | 1192 1179   <span class="k">my</span><span class="s">(</span><span class="i">$ToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$ToHydrogenAtomsOnly</span><span class="s">)</span> = <span class="s">(</span><span class="n">1</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1193 1180 | 
|  | 1194 1181   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetSumOfBondOrders</span><span class="s">(</span><span class="i">$ToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$ToHydrogenAtomsOnly</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1195 1182 <span class="s">}</span> | 
|  | 1196 1183 | 
|  | 1197 1184 <span class="c"># Get sum of bond orders to hydrogen atoms only...</span> | 
|  | 1198 1185 <span class="c">#</span> | 
|  | 1199 <a name="GetSumOfBondOrdersToHydrogenAtoms-"></a>1186 <span class="k">sub </span><span class="m">GetSumOfBondOrdersToHydrogenAtoms</span> <span class="s">{</span> | 
|  | 1200 1187   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1201 1188 | 
|  | 1202 1189   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1203 1190   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1204 1191     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1205 1192   <span class="s">}</span> | 
|  | 1206 1193   <span class="k">my</span><span class="s">(</span><span class="i">$ToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$ToHydrogenAtomsOnly</span><span class="s">)</span> = <span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1207 1194 | 
|  | 1208 1195   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetSumOfBondOrders</span><span class="s">(</span><span class="i">$ToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$ToHydrogenAtomsOnly</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1209 1196 <span class="s">}</span> | 
|  | 1210 1197 | 
|  | 1211 1198 <span class="c"># Get sum of bond orders to all bonded atoms,  non-hydrogen or hydrogen bonded atoms...</span> | 
|  | 1212 1199 <span class="c">#</span> | 
|  | 1213 <a name="_GetSumOfBondOrders-"></a>1200 <span class="k">sub </span><span class="m">_GetSumOfBondOrders</span> <span class="s">{</span> | 
|  | 1214 1201   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$ToHydrogenAtomsOnly</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1215 1202 | 
|  | 1216 1203   <span class="c"># Check flags...</span> | 
|  | 1217 1204   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ToNonHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1218 1205     <span class="i">$ToNonHydrogenAtomsOnly</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1219 1206   <span class="s">}</span> | 
|  | 1220 1207   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ToHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1221 1208     <span class="i">$ToHydrogenAtomsOnly</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1222 1209   <span class="s">}</span> | 
|  | 1223 1210   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="cm">,</span> <span class="i">$SumOfBondOrders</span><span class="cm">,</span> <span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1224 1211   <span class="i">@Bonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1225 1212 | 
|  | 1226 1213   <span class="k">if</span> <span class="s">(</span><span class="i">$ToNonHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1227 1214     <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1228 1215   <span class="s">}</span> | 
|  | 1229 1216   <span class="k">elsif</span> <span class="s">(</span><span class="i">$ToHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1230 1217     <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBondsToHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1231 1218   <span class="s">}</span> | 
|  | 1232 1219   <span class="k">else</span> <span class="s">{</span> | 
|  | 1233 1220     <span class="c"># All bonds...</span> | 
|  | 1234 1221     <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBonds</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1235 1222   <span class="s">}</span> | 
|  | 1236 1223 | 
|  | 1237 1224   <span class="i">$SumOfBondOrders</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1238 1225   <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1239 1226     <span class="i">$SumOfBondOrders</span> += <span class="i">$Bond</span><span class="i">->GetBondOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1240 1227   <span class="s">}</span> | 
|  | 1241 1228 | 
|  | 1242 1229   <span class="k">if</span> <span class="s">(</span><span class="i">$SumOfBondOrders</span> =~ <span class="q">/\./</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1243 1230     <span class="c">#</span> | 
|  | 1244 1231     <span class="c"># Change any fractional bond order to next largest integer...</span> | 
|  | 1245 1232     <span class="c">#</span> | 
|  | 1246 1233     <span class="c"># As long as aromatic bond orders in a ring are correctly using using 4n + 2 Huckel rule</span> | 
|  | 1247 1234     <span class="c"># (BondOrder: 1.5) or explicity set as Kekule  bonds (alternate single/double),</span> | 
|  | 1248 1235     <span class="c"># SumOfBondOrders should add up to an integer.</span> | 
|  | 1249 1236     <span class="c">#</span> | 
|  | 1250 1237     <span class="i">$SumOfBondOrders</span> = <span class="i">ceil</span><span class="s">(</span><span class="i">$SumOfBondOrders</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1251 1238   <span class="s">}</span> | 
|  | 1252 1239 | 
|  | 1253 1240   <span class="k">return</span> <span class="i">$SumOfBondOrders</span><span class="sc">;</span> | 
|  | 1254 1241 <span class="s">}</span> | 
|  | 1255 1242 | 
|  | 1256 1243 <span class="c"># Get largest bond order to any bonded atoms...</span> | 
|  | 1257 1244 <span class="c">#</span> | 
|  | 1258 <a name="GetLargestBondOrder-"></a>1245 <span class="k">sub </span><span class="m">GetLargestBondOrder</span> <span class="s">{</span> | 
|  | 1259 1246   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1260 1247 | 
|  | 1261 1248   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1262 1249   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1263 1250     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1264 1251   <span class="s">}</span> | 
|  | 1265 1252 | 
|  | 1266 1253   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetLargestBondOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1267 1254 <span class="s">}</span> | 
|  | 1268 1255 | 
|  | 1269 1256 <span class="c"># Get largest bond order to bonded non-hydrogen atoms...</span> | 
|  | 1270 1257 <span class="c">#</span> | 
|  | 1271 <a name="GetLargestBondOrderToHeavyAtoms-"></a>1258 <span class="k">sub </span><span class="m">GetLargestBondOrderToHeavyAtoms</span> <span class="s">{</span> | 
|  | 1272 1259   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1273 1260 | 
|  | 1274 1261   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetLargestBondOrderToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1275 1262 <span class="s">}</span> | 
|  | 1276 1263 | 
|  | 1277 1264 <span class="c"># Get largest bond order to bonded non-hydrogen atoms...</span> | 
|  | 1278 1265 <span class="c">#</span> | 
|  | 1279 <a name="GetLargestBondOrderToNonHydrogenAtoms-"></a>1266 <span class="k">sub </span><span class="m">GetLargestBondOrderToNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 1280 1267   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1281 1268 | 
|  | 1282 1269   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1283 1270   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1284 1271     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1285 1272   <span class="s">}</span> | 
|  | 1286 1273 | 
|  | 1287 1274   <span class="k">my</span><span class="s">(</span><span class="i">$ToNonHydrogenAtomsOnly</span><span class="s">)</span> = <span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1288 1275 | 
|  | 1289 1276   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetLargestBondOrder</span><span class="s">(</span><span class="i">$ToNonHydrogenAtomsOnly</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1290 1277 <span class="s">}</span> | 
|  | 1291 1278 | 
|  | 1292 1279 <span class="c"># Get largest bond order to all bonded atoms, non-hydrogen or hydrogen bonded atoms...</span> | 
|  | 1293 1280 <span class="c">#</span> | 
|  | 1294 <a name="_GetLargestBondOrder-"></a>1281 <span class="k">sub </span><span class="m">_GetLargestBondOrder</span> <span class="s">{</span> | 
|  | 1295 1282   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ToNonHydrogenAtomsOnly</span><span class="cm">,</span> <span class="i">$ToHydrogenAtomsOnly</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1296 1283 | 
|  | 1297 1284   <span class="c"># Check flags...</span> | 
|  | 1298 1285   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ToNonHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1299 1286     <span class="i">$ToNonHydrogenAtomsOnly</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1300 1287   <span class="s">}</span> | 
|  | 1301 1288   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ToHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1302 1289     <span class="i">$ToHydrogenAtomsOnly</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1303 1290   <span class="s">}</span> | 
|  | 1304 1291   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="cm">,</span> <span class="i">$LargestBondOrder</span><span class="cm">,</span> <span class="i">$BondOrder</span><span class="cm">,</span> <span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1305 1292   <span class="i">@Bonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1306 1293 | 
|  | 1307 1294   <span class="k">if</span> <span class="s">(</span><span class="i">$ToNonHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1308 1295     <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1309 1296   <span class="s">}</span> | 
|  | 1310 1297   <span class="k">elsif</span> <span class="s">(</span><span class="i">$ToHydrogenAtomsOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1311 1298     <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBondsToHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1312 1299   <span class="s">}</span> | 
|  | 1313 1300   <span class="k">else</span> <span class="s">{</span> | 
|  | 1314 1301     <span class="c"># All bonds...</span> | 
|  | 1315 1302     <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBonds</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1316 1303   <span class="s">}</span> | 
|  | 1317 1304 | 
|  | 1318 1305   <span class="i">$LargestBondOrder</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1319 1306   <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1320 1307     <span class="i">$BondOrder</span> = <span class="i">$Bond</span><span class="i">->GetBondOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1321 1308     <span class="k">if</span> <span class="s">(</span><span class="i">$BondOrder</span> > <span class="i">$LargestBondOrder</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1322 1309       <span class="i">$LargestBondOrder</span> = <span class="i">$BondOrder</span><span class="sc">;</span> | 
|  | 1323 1310     <span class="s">}</span> | 
|  | 1324 1311   <span class="s">}</span> | 
|  | 1325 1312 | 
|  | 1326 1313   <span class="k">return</span> <span class="i">$LargestBondOrder</span><span class="sc">;</span> | 
|  | 1327 1314 <span class="s">}</span> | 
|  | 1328 1315 | 
|  | 1329 1316 <span class="c"># Get number of implicit hydrogen for atom...</span> | 
|  | 1330 1317 <span class="c">#</span> | 
|  | 1331 <a name="GetImplicitHydrogens-"></a>1318 <span class="k">sub </span><span class="m">GetImplicitHydrogens</span> <span class="s">{</span> | 
|  | 1332 1319   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1333 1320 | 
|  | 1334 1321   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfImplicitHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1335 1322 <span class="s">}</span> | 
|  | 1336 1323 | 
|  | 1337 1324 <span class="c"># Get number of implicit hydrogen for atom...</span> | 
|  | 1338 1325 <span class="c">#</span> | 
|  | 1339 <a name="GetNumOfImplicitHydrogens-"></a>1326 <span class="k">sub </span><span class="m">GetNumOfImplicitHydrogens</span> <span class="s">{</span> | 
|  | 1340 1327   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1341 1328 | 
|  | 1342 1329   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1343 1330   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1344 1331     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1345 1332   <span class="s">}</span> | 
|  | 1346 1333 | 
|  | 1347 1334   <span class="c"># Is ImplicitHydrogens property explicitly set?</span> | 
|  | 1348 1335   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'ImplicitHydrogens'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1349 1336     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'ImplicitHydrogens'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1350 1337   <span class="s">}</span> | 
|  | 1351 1338 | 
|  | 1352 1339   <span class="c"># Is it an element symbol?</span> | 
|  | 1353 1340   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1354 1341     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1355 1342   <span class="s">}</span> | 
|  | 1356 1343 | 
|  | 1357 1344   <span class="k">my</span><span class="s">(</span><span class="i">$ImplicitHydrogens</span><span class="cm">,</span> <span class="i">$PotentialTotalValence</span><span class="cm">,</span> <span class="i">$SumOfBondOrders</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1358 1345 | 
|  | 1359 1346   <span class="i">$ImplicitHydrogens</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1360 1347   <span class="i">$SumOfBondOrders</span> = <span class="i">$This</span><span class="i">->GetSumOfBondOrders</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1361 1348   <span class="i">$PotentialTotalValence</span> = <span class="i">$This</span><span class="i">->GetPotentialTotalCommonValence</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1362 1349 | 
|  | 1363 1350   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$PotentialTotalValence</span><span class="s">)</span> && <span class="k">defined</span><span class="s">(</span><span class="i">$SumOfBondOrders</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1364 1351     <span class="c"># Subtract sum of bond orders to non-hydrogen and hydrogen atom neighbors...</span> | 
|  | 1365 1352     <span class="i">$ImplicitHydrogens</span> = <span class="i">$PotentialTotalValence</span> - <span class="i">$SumOfBondOrders</span><span class="sc">;</span> | 
|  | 1366 1353   <span class="s">}</span> | 
|  | 1367 1354 | 
|  | 1368 1355   <span class="k">return</span> <span class="i">$ImplicitHydrogens</span> > <span class="n">0</span> ? <span class="i">$ImplicitHydrogens</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1369 1356 <span class="s">}</span> | 
|  | 1370 1357 | 
|  | 1371 1358 <span class="c"># Get number of bonds available to form additional bonds with heavy atoms, excluding</span> | 
|  | 1372 1359 <span class="c"># any implicit bonds to hydrogens set using ImplicitHydrogens property.</span> | 
|  | 1373 1360 <span class="c">#</span> | 
|  | 1374 1361 <span class="c"># It's different from number of implicit or missing hydrogens, both of which are equivalent.</span> | 
|  | 1375 1362 <span class="c">#</span> | 
|  | 1376 1363 <span class="c"># For example, in a SMILES string, [nH] ring atom corresponds to an aromatic nitrogen.</span> | 
|  | 1377 1364 <span class="c"># Although the hydrogen specified for n is treated internally as implicit hydrogen and shows</span> | 
|  | 1378 1365 <span class="c"># up in missing hydrogen count, it's not available to participate in double bonds to additional</span> | 
|  | 1379 1366 <span class="c"># heavy atoms.</span> | 
|  | 1380 1367 <span class="c">#</span> | 
|  | 1381 <a name="GetNumOfBondsAvailableForHeavyAtoms-"></a>1368 <span class="k">sub </span><span class="m">GetNumOfBondsAvailableForHeavyAtoms</span> <span class="s">{</span> | 
|  | 1382 1369   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1383 1370 | 
|  | 1384 1371   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfBondsAvailableForNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1385 1372 <span class="s">}</span> | 
|  | 1386 1373 | 
|  | 1387 1374 <span class="c"># It's another name for GetNumOfBondsAvailableForHeavyAtoms</span> | 
|  | 1388 1375 <span class="c">#</span> | 
|  | 1389 <a name="GetNumOfBondsAvailableForNonHydrogenAtoms-"></a>1376 <span class="k">sub </span><span class="m">GetNumOfBondsAvailableForNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 1390 1377   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1391 1378   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfAvailableBonds</span><span class="cm">,</span> <span class="i">$PotentialTotalValence</span><span class="cm">,</span> <span class="i">$SumOfBondOrders</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1392 1379 | 
|  | 1393 1380   <span class="i">$NumOfAvailableBonds</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1394 1381 | 
|  | 1395 1382   <span class="i">$SumOfBondOrders</span> = <span class="i">$This</span><span class="i">->GetSumOfBondOrders</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1396 1383   <span class="i">$PotentialTotalValence</span> = <span class="i">$This</span><span class="i">->GetPotentialTotalCommonValence</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1397 1384 | 
|  | 1398 1385   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$PotentialTotalValence</span><span class="s">)</span> && <span class="k">defined</span><span class="s">(</span><span class="i">$SumOfBondOrders</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1399 1386     <span class="c"># Subtract sum of bond orders to non-hydrogen and hydrogen atom neighbors...</span> | 
|  | 1400 1387     <span class="i">$NumOfAvailableBonds</span> = <span class="i">$PotentialTotalValence</span> - <span class="i">$SumOfBondOrders</span><span class="sc">;</span> | 
|  | 1401 1388   <span class="s">}</span> | 
|  | 1402 1389 | 
|  | 1403 1390   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'ImplicitHydrogens'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1404 1391     <span class="i">$NumOfAvailableBonds</span> -= <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'ImplicitHydrogens'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1405 1392   <span class="s">}</span> | 
|  | 1406 1393 | 
|  | 1407 1394   <span class="k">return</span> <span class="i">$NumOfAvailableBonds</span> > <span class="n">0</span> ? <span class="i">$NumOfAvailableBonds</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1408 1395 <span class="s">}</span> | 
|  | 1409 1396 | 
|  | 1410 1397 <span class="c"># Disable setting of explicit hydrogens property...</span> | 
|  | 1411 <a name="SetExplicitHydrogens-"></a>1398 <span class="k">sub </span><span class="m">SetExplicitHydrogens</span> <span class="s">{</span> | 
|  | 1412 1399   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1413 1400 | 
|  | 1414 1401   <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetExplicitHydrogens: Setting of explicit hydrogens is not supported..."</span><span class="sc">;</span> | 
|  | 1415 1402 | 
|  | 1416 1403   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1417 1404 <span class="s">}</span> | 
|  | 1418 1405 | 
|  | 1419 1406 <span class="c"># Get number of explicit hydrogens for atom...</span> | 
|  | 1420 1407 <span class="c">#</span> | 
|  | 1421 <a name="GetExplicitHydrogens-"></a>1408 <span class="k">sub </span><span class="m">GetExplicitHydrogens</span> <span class="s">{</span> | 
|  | 1422 1409   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1423 1410 | 
|  | 1424 1411   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfExplicitHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1425 1412 <span class="s">}</span> | 
|  | 1426 1413 | 
|  | 1427 1414 <span class="c"># Get number of explicit hydrogens for atom...</span> | 
|  | 1428 1415 <span class="c">#</span> | 
|  | 1429 <a name="GetNumOfExplicitHydrogens-"></a>1416 <span class="k">sub </span><span class="m">GetNumOfExplicitHydrogens</span> <span class="s">{</span> | 
|  | 1430 1417   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1431 1418   <span class="k">my</span><span class="s">(</span><span class="i">$HydrogenAtomNbrs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1432 1419 | 
|  | 1433 1420   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1434 1421   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1435 1422     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1436 1423   <span class="s">}</span> | 
|  | 1437 1424 | 
|  | 1438 1425   <span class="i">$HydrogenAtomNbrs</span> = <span class="i">$This</span><span class="i">->GetNumOfHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1439 1426 | 
|  | 1440 1427   <span class="k">return</span> <span class="k">defined</span> <span class="i">$HydrogenAtomNbrs</span> ? <span class="i">$HydrogenAtomNbrs</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1441 1428 <span class="s">}</span> | 
|  | 1442 1429 | 
|  | 1443 1430 <span class="c"># Get num of missing hydrogens...</span> | 
|  | 1444 1431 <span class="c">#</span> | 
|  | 1445 <a name="GetMissingHydrogens-"></a>1432 <span class="k">sub </span><span class="m">GetMissingHydrogens</span> <span class="s">{</span> | 
|  | 1446 1433   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1447 1434 | 
|  | 1448 1435   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1449 1436 <span class="s">}</span> | 
|  | 1450 1437 | 
|  | 1451 1438 <span class="c"># Get num of missing hydrogens...</span> | 
|  | 1452 1439 <span class="c">#</span> | 
|  | 1453 <a name="GetNumOfMissingHydrogens-"></a>1440 <span class="k">sub </span><span class="m">GetNumOfMissingHydrogens</span> <span class="s">{</span> | 
|  | 1454 1441   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1455 1442 | 
|  | 1456 1443   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1457 1444   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1458 1445     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1459 1446   <span class="s">}</span> | 
|  | 1460 1447 | 
|  | 1461 1448   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfImplicitHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1462 1449 <span class="s">}</span> | 
|  | 1463 1450 | 
|  | 1464 1451 <span class="c"># Get total number of hydrogens...</span> | 
|  | 1465 1452 <span class="c">#</span> | 
|  | 1466 <a name="GetHydrogens-"></a>1453 <span class="k">sub </span><span class="m">GetHydrogens</span> <span class="s">{</span> | 
|  | 1467 1454   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1468 1455 | 
|  | 1469 1456   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1470 1457 <span class="s">}</span> | 
|  | 1471 1458 | 
|  | 1472 1459 <span class="c"># Get total number of hydrogens...</span> | 
|  | 1473 1460 <span class="c">#</span> | 
|  | 1474 <a name="GetNumOfHydrogens-"></a>1461 <span class="k">sub </span><span class="m">GetNumOfHydrogens</span> <span class="s">{</span> | 
|  | 1475 1462   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1476 1463 | 
|  | 1477 1464   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1478 1465   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1479 1466     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1480 1467   <span class="s">}</span> | 
|  | 1481 1468 | 
|  | 1482 1469   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfImplicitHydrogens</span><span class="s">(</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->GetNumOfExplicitHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1483 1470 <span class="s">}</span> | 
|  | 1484 1471 | 
|  | 1485 1472 <span class="c"># Valence corresponds to the number of electrons used by an atom in bonding:</span> | 
|  | 1486 1473 <span class="c">#</span> | 
|  | 1487 1474 <span class="c">#   Valence = ValenceElectrons - ValenceFreeElectrons = BondingElectrons</span> | 
|  | 1488 1475 <span class="c">#</span> | 
|  | 1489 1476 <span class="c"># Single, double, triple bonds with bond orders of 1, 2 and 3 correspond to contribution of</span> | 
|  | 1490 1477 <span class="c"># 1, 2, and 3 bonding electrons. So Valence can be computed using:</span> | 
|  | 1491 1478 <span class="c">#</span> | 
|  | 1492 1479 <span class="c">#   Valence = SumOfBondOrders + NumOfMissingHydrogens + FormalCharge</span> | 
|  | 1493 1480 <span class="c">#</span> | 
|  | 1494 1481 <span class="c"># where positive and negative values of FormalCharge increase and decrease the number</span> | 
|  | 1495 1482 <span class="c"># of bonding electrons respectively.</span> | 
|  | 1496 1483 <span class="c">#</span> | 
|  | 1497 1484 <span class="c"># The current release of MayaChemTools supports the following three valence models, which</span> | 
|  | 1498 1485 <span class="c"># are used during calculation of implicit hydrogens: MDLValenceModel, DaylightValenceModel,</span> | 
|  | 1499 1486 <span class="c"># InternalValenceModel or MayaChemToolsValenceModel.</span> | 
|  | 1500 1487 <span class="c">#</span> | 
|  | 1501 1488 <span class="c"># Notes:</span> | 
|  | 1502 1489 <span class="c">#  . This doesn't always corresponds to explicit valence.</span> | 
|  | 1503 1490 <span class="c">#  . Missing hydrogens are included in the valence.</span> | 
|  | 1504 1491 <span class="c">#  . For neutral molecules, valence and sum of bond order are equal.</span> | 
|  | 1505 1492 <span class="c">#  . For molecules containing only single bonds, SumOfBondOrders and NumOfBonds are equal.</span> | 
|  | 1506 1493 <span class="c">#  . Free radical electrons lead to the decrease in valence. For atoms with explicit assignment</span> | 
|  | 1507 1494 <span class="c">#    of SpinMultiplicity property values corresponding to Singlet (two unparied electrons</span> | 
|  | 1508 1495 <span class="c">#    corresponding to one spin state), Doublet (free radical; an unpaired electron corresponding</span> | 
|  | 1509 1496 <span class="c">#    to two spin states), and Triplet (two unparied electrons corresponding to three spin states;</span> | 
|  | 1510 1497 <span class="c">#    divalent carbon atoms (carbenes)), FreeRadicalElectrons are calculated as follows:</span> | 
|  | 1511 1498 <span class="c">#</span> | 
|  | 1512 1499 <span class="c">#       SpinMultiplicity: Doublet(2); FreeRadicalElectrons: 1 (one valence electron not available for bonding)</span> | 
|  | 1513 1500 <span class="c">#       SpinMultiplicity: Singlet(1)/Triplet(3); FreeRadicalElectrons: 2 (two valence electrons not available for bonding)</span> | 
|  | 1514 1501 <span class="c">#</span> | 
|  | 1515 <a name="GetValence-"></a>1502 <span class="k">sub </span><span class="m">GetValence</span> <span class="s">{</span> | 
|  | 1516 1503   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1517 1504 | 
|  | 1518 1505   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1519 1506   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1520 1507     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1521 1508   <span class="s">}</span> | 
|  | 1522 1509 | 
|  | 1523 1510   <span class="c"># Is Valence property explicitly set?</span> | 
|  | 1524 1511   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Valence'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1525 1512     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Valence'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1526 1513   <span class="s">}</span> | 
|  | 1527 1514   <span class="k">my</span><span class="s">(</span><span class="i">$Valence</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1528 1515 | 
|  | 1529 1516   <span class="i">$Valence</span> = <span class="i">$This</span><span class="i">->GetSumOfBondOrders</span><span class="s">(</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1530 1517 | 
|  | 1531 1518   <span class="k">return</span> <span class="i">$Valence</span> > <span class="n">0</span> ? <span class="i">$Valence</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1532 1519 <span class="s">}</span> | 
|  | 1533 1520 | 
|  | 1534 1521 <span class="c"># Get free non-bodning valence electrons left on atom after taking into account</span> | 
|  | 1535 1522 <span class="c"># sum of bond orders, missing hydrogens and formal charged on the atom. Free</span> | 
|  | 1536 1523 <span class="c"># radical electrons are included in the valence free electrons count by default.</span> | 
|  | 1537 1524 <span class="c">#</span> | 
|  | 1538 1525 <span class="c"># Valence corresponds to number of electrons used by atom in bonding:</span> | 
|  | 1539 1526 <span class="c">#</span> | 
|  | 1540 1527 <span class="c">#   Valence = ValenceElectrons - ValenceFreeElectrons</span> | 
|  | 1541 1528 <span class="c">#</span> | 
|  | 1542 1529 <span class="c"># Additionally, valence can also be calculated by:</span> | 
|  | 1543 1530 <span class="c">#</span> | 
|  | 1544 1531 <span class="c">#   Valence = SumOfBondOrders + NumOfMissingHydrogens + FormalCharge</span> | 
|  | 1545 1532 <span class="c">#</span> | 
|  | 1546 1533 <span class="c"># Valence and SumOfBondOrders are equal for neutral molecules.</span> | 
|  | 1547 1534 <span class="c">#</span> | 
|  | 1548 1535 <span class="c"># From two formulas for Valence described above, non-bonding free electrons</span> | 
|  | 1549 1536 <span class="c"># left can be computed by:</span> | 
|  | 1550 1537 <span class="c">#</span> | 
|  | 1551 1538 <span class="c">#  ValenceFreeElectrons = ValenceElectrons - Valence</span> | 
|  | 1552 1539 <span class="c">#                       = ValenceElectrons - SumOfBondOrders -</span> | 
|  | 1553 1540 <span class="c">#                         NumOfMissingHydrogens - FormalCharge</span> | 
|  | 1554 1541 <span class="c">#</span> | 
|  | 1555 1542 <span class="c"># . Notes:</span> | 
|  | 1556 1543 <span class="c">#    . Missing hydrogens are excluded from the valence free electrons.</span> | 
|  | 1557 1544 <span class="c">#    . Any free radical electrons are considered part of the valence free electrons</span> | 
|  | 1558 1545 <span class="c">#      by default.</span> | 
|  | 1559 1546 <span class="c">#</span> | 
|  | 1560 1547 <span class="c"># Examples:</span> | 
|  | 1561 1548 <span class="c">#</span> | 
|  | 1562 1549 <span class="c"># o NH3: ValenceFreeElectrons = 5 - 3 = 5 - 3 - 0 - 0 = 2</span> | 
|  | 1563 1550 <span class="c"># o NH2: ValenceFreeElectrons = 5 - 3 = 5 - 2 - 1 - 0 = 2</span> | 
|  | 1564 1551 <span class="c"># o NH4+; ValenceFreeElectrons = 5 - 5 = 5 - 4 - 0 - 1 = 0</span> | 
|  | 1565 1552 <span class="c"># o NH3+; ValenceFreeElectrons = 5 - 5 = 5 - 3 - 1 - 1 = 0</span> | 
|  | 1566 1553 <span class="c"># o C(=O)O- : ValenceFreeElectrons on O- = 6 - 0 = 6 - 1 - 0 - (-1) = 6</span> | 
|  | 1567 1554 <span class="c"># o C(=O)O- : ValenceFreeElectrons on =O = 6 - 2 = 6 - 2 - 0 - 0 = 4</span> | 
|  | 1568 1555 <span class="c">#</span> | 
|  | 1569 1556 <span class="c">#</span> | 
|  | 1570 <a name="GetValenceFreeElectrons-"></a>1557 <span class="k">sub </span><span class="m">GetValenceFreeElectrons</span> <span class="s">{</span> | 
|  | 1571 1558   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ExcludeFreeRadicalElectrons</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1572 1559 | 
|  | 1573 1560   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1574 1561   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1575 1562     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1576 1563   <span class="s">}</span> | 
|  | 1577 1564 | 
|  | 1578 1565   <span class="c"># Is ValenceFreeElectrons property explicitly set?</span> | 
|  | 1579 1566   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'ValenceFreeElectrons'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1580 1567     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'ValenceFreeElectrons'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1581 1568   <span class="s">}</span> | 
|  | 1582 1569 | 
|  | 1583 1570   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1584 1571     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1585 1572   <span class="s">}</span> | 
|  | 1586 1573 | 
|  | 1587 1574   <span class="k">my</span><span class="s">(</span><span class="i">$ValenceFreeElectrons</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1588 1575 | 
|  | 1589 1576   <span class="i">$ValenceFreeElectrons</span> = <span class="i">$This</span><span class="i">->GetValenceElectrons</span><span class="s">(</span><span class="s">)</span> - <span class="i">$This</span><span class="i">->GetValence</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1590 1577   <span class="k">if</span> <span class="s">(</span><span class="i">$ExcludeFreeRadicalElectrons</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1591 1578     <span class="i">$ValenceFreeElectrons</span> -= <span class="i">$This</span><span class="i">->GetFreeRadicalElectrons</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1592 1579   <span class="s">}</span> | 
|  | 1593 1580 | 
|  | 1594 1581   <span class="k">return</span> <span class="i">$ValenceFreeElectrons</span> > <span class="n">0</span> ? <span class="i">$ValenceFreeElectrons</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1595 1582 <span class="s">}</span> | 
|  | 1596 1583 | 
|  | 1597 1584 <span class="c"># Get potential total common valence for calculating the number of implicit hydrogens</span> | 
|  | 1598 1585 <span class="c"># using the specified common valence model or default internal model for a molecule...</span> | 
|  | 1599 1586 <span class="c">#</span> | 
|  | 1600 <a name="GetPotentialTotalCommonValence-"></a>1587 <span class="k">sub </span><span class="m">GetPotentialTotalCommonValence</span> <span class="s">{</span> | 
|  | 1601 1588   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1602 1589 | 
|  | 1603 1590   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1604 1591   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1605 1592     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1606 1593   <span class="s">}</span> | 
|  | 1607 1594   <span class="k">my</span><span class="s">(</span><span class="i">$PotentialTotalValence</span><span class="cm">,</span> <span class="i">$ValenceModel</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1608 1595 | 
|  | 1609 1596   <span class="i">$PotentialTotalValence</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1610 1597   <span class="i">$ValenceModel</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="i">->GetValenceModel</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1611 1598 | 
|  | 1612 1599   <span class="j">VALENCEMODEL:</span> <span class="s">{</span> | 
|  | 1613 1600     <span class="k">if</span> <span class="s">(</span><span class="i">$ValenceModel</span> =~ <span class="q">/^MDLValenceModel$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1614 1601       <span class="i">$PotentialTotalValence</span> = <span class="i">$This</span><span class="i">->_GetPotentialTotalCommonValenceUsingMDLValenceModel</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1615 1602       <span class="k">last</span> <span class="j">VALENCEMODEL</span><span class="sc">;</span> | 
|  | 1616 1603     <span class="s">}</span> | 
|  | 1617 1604     <span class="k">if</span> <span class="s">(</span><span class="i">$ValenceModel</span> =~ <span class="q">/^DaylightValenceModel$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1618 1605        <span class="i">$PotentialTotalValence</span> = <span class="i">$This</span><span class="i">->_GetPotentialTotalCommonValenceUsingDaylightValenceModel</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1619 1606       <span class="k">last</span> <span class="j">VALENCEMODEL</span><span class="sc">;</span> | 
|  | 1620 1607     <span class="s">}</span> | 
|  | 1621 1608     <span class="k">if</span> <span class="s">(</span><span class="i">$ValenceModel</span> !~ <span class="q">/^(InternalValenceModel|MayaChemToolsValenceModel)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1622 1609       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->GetPotentialTotalCommonValence: The current release of MayaChemTools doesn't support the specified valence model $ValenceModel. Supported valence models: MDLValenceModel, DaylightValenceModel, InternalValenceModel. Using internal valence model..."</span><span class="sc">;</span> | 
|  | 1623 1610     <span class="s">}</span> | 
|  | 1624 1611     <span class="c"># Use internal valence model as the default valence model...</span> | 
|  | 1625 1612     <span class="i">$PotentialTotalValence</span> = <span class="i">$This</span><span class="i">->_GetPotentialTotalCommonValenceUsingInternalValenceModel</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1626 1613   <span class="s">}</span> | 
|  | 1627 1614 | 
|  | 1628 1615   <span class="k">return</span> <span class="i">$PotentialTotalValence</span><span class="sc">;</span> | 
|  | 1629 1616 <span class="s">}</span> | 
|  | 1630 1617 | 
|  | 1631 1618 <span class="c"># Get potential total common valence using data for MDL valence model available in file,</span> | 
|  | 1632 1619 <span class="c"># lib/data/MDLValenceModelData.csv, distributed with the package...</span> | 
|  | 1633 1620 <span class="c">#</span> | 
|  | 1634 <a name="_GetPotentialTotalCommonValenceUsingMDLValenceModel-"></a>1621 <span class="k">sub </span><span class="m">_GetPotentialTotalCommonValenceUsingMDLValenceModel</span> <span class="s">{</span> | 
|  | 1635 1622   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1636 1623 | 
|  | 1637 1624   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPotentialTotalCommonValenceUsingValenceModelData</span><span class="s">(</span>\<span class="i">%MDLValenceModelDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1638 1625 | 
|  | 1639 1626 <span class="s">}</span> | 
|  | 1640 1627 | 
|  | 1641 1628 <span class="c"># Get potential total common valence using data for Daylight valence model available in file,</span> | 
|  | 1642 1629 <span class="c"># lib/data/DaylightValenceModelData.csv, distributed with the release...</span> | 
|  | 1643 1630 <span class="c">#</span> | 
|  | 1644 <a name="_GetPotentialTotalCommonValenceUsingDaylightValenceModel-"></a>1631 <span class="k">sub </span><span class="m">_GetPotentialTotalCommonValenceUsingDaylightValenceModel</span> <span class="s">{</span> | 
|  | 1645 1632   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1646 1633 | 
|  | 1647 1634   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPotentialTotalCommonValenceUsingValenceModelData</span><span class="s">(</span>\<span class="i">%DaylightValenceModelDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1648 1635 <span class="s">}</span> | 
|  | 1649 1636 | 
|  | 1650 1637 <span class="c"># Get potential total common valence using data for a specific valence model...</span> | 
|  | 1651 1638 <span class="c">#</span> | 
|  | 1652 <a name="_GetPotentialTotalCommonValenceUsingValenceModelData-"></a>1639 <span class="k">sub </span><span class="m">_GetPotentialTotalCommonValenceUsingValenceModelData</span> <span class="s">{</span> | 
|  | 1653 1640   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ValenceModelDataRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1654 1641   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$FormalCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1655 1642 | 
|  | 1656 1643   <span class="i">$AtomicNumber</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 1657 1644   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1658 1645     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1659 1646   <span class="s">}</span> | 
|  | 1660 1647 | 
|  | 1661 1648   <span class="i">$FormalCharge</span> = <span class="i">$This</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1662 1649 | 
|  | 1663 1650   <span class="c"># Is any valence model data available for atomic number and formal charge?</span> | 
|  | 1664 1651   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$ValenceModelDataRef</span>->{<span class="i">$AtomicNumber</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1665 1652     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1666 1653   <span class="s">}</span> | 
|  | 1667 1654   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$ValenceModelDataRef</span>->{<span class="i">$AtomicNumber</span>}{<span class="i">$FormalCharge</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1668 1655     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1669 1656   <span class="s">}</span> | 
|  | 1670 1657 | 
|  | 1671 1658   <span class="k">my</span><span class="s">(</span><span class="i">$PotentialTotalValence</span><span class="cm">,</span> <span class="i">$SumOfBondOrders</span><span class="cm">,</span> <span class="i">$CurrentEffectiveValence</span><span class="cm">,</span> <span class="i">$AvailableCommonValence</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1672 1659 | 
|  | 1673 1660   <span class="i">$SumOfBondOrders</span> = <span class="i">$This</span><span class="i">->GetSumOfBondOrders</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1674 1661   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$SumOfBondOrders</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1675 1662     <span class="i">$SumOfBondOrders</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1676 1663   <span class="s">}</span> | 
|  | 1677 1664   <span class="i">$CurrentEffectiveValence</span> = <span class="i">$SumOfBondOrders</span> + <span class="i">$This</span><span class="i">->GetFreeRadicalElectrons</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1678 1665 | 
|  | 1679 1666   <span class="i">$PotentialTotalValence</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1680 1667   <span class="j">VALENCE:</span> <span class="k">for</span> <span class="i">$AvailableCommonValence</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ValenceModelDataRef</span>->{<span class="i">$AtomicNumber</span>}{<span class="i">$FormalCharge</span>}{<span class="w">CommonValences</span>}}<span class="s">)</span> <span class="s">{</span> | 
|  | 1681 1668       <span class="k">if</span> <span class="s">(</span><span class="i">$CurrentEffectiveValence</span> <= <span class="i">$AvailableCommonValence</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1682 1669         <span class="i">$PotentialTotalValence</span> = <span class="i">$AvailableCommonValence</span><span class="sc">;</span> | 
|  | 1683 1670         <span class="k">last</span> <span class="j">VALENCE</span><span class="sc">;</span> | 
|  | 1684 1671       <span class="s">}</span> | 
|  | 1685 1672   <span class="s">}</span> | 
|  | 1686 1673 | 
|  | 1687 1674   <span class="k">return</span> <span class="i">$PotentialTotalValence</span><span class="sc">;</span> | 
|  | 1688 1675 <span class="s">}</span> | 
|  | 1689 1676 | 
|  | 1690 1677 <span class="c">#</span> | 
|  | 1691 1678 <span class="c"># For elements with one one common valence, potential total common valence used</span> | 
|  | 1692 1679 <span class="c"># during the calculation for number of implicit hydrogens during InternalValenceMode</span> | 
|  | 1693 1680 <span class="c"># corresponds to:</span> | 
|  | 1694 1681 <span class="c">#</span> | 
|  | 1695 1682 <span class="c">#   CommonValence + FormalCharge - FreeRadicalElectrons</span> | 
|  | 1696 1683 <span class="c">#</span> | 
|  | 1697 1684 <span class="c"># For elements with multiple common valences, each common valence is used to</span> | 
|  | 1698 1685 <span class="c"># calculate total potential common valence as shown above, and the first total potential</span> | 
|  | 1699 1686 <span class="c"># common valence gerater than the sum of bond orderes is selected as the final total</span> | 
|  | 1700 1687 <span class="c"># common valence.</span> | 
|  | 1701 1688 <span class="c">#</span> | 
|  | 1702 1689 <span class="c"># Group numbers > 14 - Group numbers 15 (N), 16 (O), 17 (F), 18 (He)</span> | 
|  | 1703 1690 <span class="c">#</span> | 
|  | 1704 1691 <span class="c"># Formal charge sign is not adjusted. Positive and negative values result in the</span> | 
|  | 1705 1692 <span class="c"># increase and decrease of valence.</span> | 
|  | 1706 1693 <span class="c">#</span> | 
|  | 1707 1694 <span class="c"># Group 14 containing C, Si, Ge, Sn, Pb...</span> | 
|  | 1708 1695 <span class="c">#</span> | 
|  | 1709 1696 <span class="c"># Formal charge sign is reversed for positive values. Both positive and negative</span> | 
|  | 1710 1697 <span class="c"># values result in the decrease of valence.</span> | 
|  | 1711 1698 <span class="c">#</span> | 
|  | 1712 1699 <span class="c"># Group 13 containing B, Al, Ga, In, Tl...</span> | 
|  | 1713 1700 <span class="c">#</span> | 
|  | 1714 1701 <span class="c"># Formal charge sign is always reversed. Positive and negative values result in the</span> | 
|  | 1715 1702 <span class="c"># decrease and increase of valence.</span> | 
|  | 1716 1703 <span class="c">#</span> | 
|  | 1717 1704 <span class="c"># Groups 1 (H) through 12 (Zn)...</span> | 
|  | 1718 1705 <span class="c">#</span> | 
|  | 1719 1706 <span class="c"># Formal charge sign is reversed for positive values. Both positive and negative</span> | 
|  | 1720 1707 <span class="c"># values result in the decrease of valence.</span> | 
|  | 1721 1708 <span class="c">#</span> | 
|  | 1722 1709 <span class="c"># Lanthanides and actinides...</span> | 
|  | 1723 1710 <span class="c">#</span> | 
|  | 1724 1711 <span class="c"># Formal charge sign is reversed for positive values. Both positive and negative</span> | 
|  | 1725 1712 <span class="c"># values result in the decrease of valence.</span> | 
|  | 1726 1713 <span class="c">#</span> | 
|  | 1727 1714 <span class="c"># Notes:</span> | 
|  | 1728 1715 <span class="c">#  . CommonValence and HighestCommonValence available from PeriodicTable module</span> | 
|  | 1729 1716 <span class="c">#    are equivalent to most common and highest sum of bond orders for an element. For</span> | 
|  | 1730 1717 <span class="c">#    neutral atoms involved only in single bonds, it corresponds to highest number of</span> | 
|  | 1731 1718 <span class="c">#    allowed bonds for the atom.</span> | 
|  | 1732 1719 <span class="c">#  . FormalCharge sign is reversed for electropositive elements with positive formal charge</span> | 
|  | 1733 1720 <span class="c">#    during common valence calculations. Electropositive elements, metals and transition elements,</span> | 
|  | 1734 1721 <span class="c">#    have usually plus formal charge and it leads to decrease in common valence; the negative</span> | 
|  | 1735 1722 <span class="c">#    formal charge should result in the decrease of common valence.</span> | 
|  | 1736 1723 <span class="c">#  . For carbon, both plus/minus formal charge cause decrease in common valence</span> | 
|  | 1737 1724 <span class="c">#  . For elements on the right of carbon in periodic table, electronegative elements, plus formal</span> | 
|  | 1738 1725 <span class="c">#    charge causes common valence to increase and minus formal charge cause it to decrease.</span> | 
|  | 1739 1726 <span class="c">#</span> | 
|  | 1740 <a name="_GetPotentialTotalCommonValenceUsingInternalValenceModel-"></a>1727 <span class="k">sub </span><span class="m">_GetPotentialTotalCommonValenceUsingInternalValenceModel</span> <span class="s">{</span> | 
|  | 1741 1728   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1742 1729   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$CommonValences</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1743 1730 | 
|  | 1744 1731   <span class="i">$AtomicNumber</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 1745 1732   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1746 1733     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1747 1734   <span class="s">}</span> | 
|  | 1748 1735 | 
|  | 1749 1736   <span class="i">$CommonValences</span> = <span class="i">PeriodicTable::GetElementCommonValences</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1750 1737   <span class="k">if</span> <span class="s">(</span>!<span class="i">$CommonValences</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1751 1738     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1752 1739   <span class="s">}</span> | 
|  | 1753 1740 | 
|  | 1754 1741   <span class="k">my</span><span class="s">(</span><span class="i">$PotentialTotalValence</span><span class="cm">,</span> <span class="i">$AdjustedFormalCharge</span><span class="cm">,</span> <span class="i">$FreeRadicalElectrons</span><span class="cm">,</span> <span class="i">$SumOfBondOrders</span><span class="cm">,</span> <span class="i">$AvailableCommonValence</span><span class="cm">,</span> <span class="i">@AvailableCommonValences</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1755 1742 | 
|  | 1756 1743   <span class="i">$AdjustedFormalCharge</span> = <span class="i">$This</span><span class="i">->_GetFormalChargeAdjustedForInternalValenceModel</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1757 1744   <span class="i">$FreeRadicalElectrons</span> = <span class="i">$This</span><span class="i">->GetFreeRadicalElectrons</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1758 1745 | 
|  | 1759 1746   <span class="i">$SumOfBondOrders</span> = <span class="i">$This</span><span class="i">->GetSumOfBondOrders</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1760 1747   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$SumOfBondOrders</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1761 1748     <span class="i">$SumOfBondOrders</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1762 1749   <span class="s">}</span> | 
|  | 1763 1750 | 
|  | 1764 1751   <span class="i">@AvailableCommonValences</span> = <span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$CommonValences</span><span class="sc">;</span> | 
|  | 1765 1752 | 
|  | 1766 1753   <span class="k">if</span> <span class="s">(</span><span class="i">@AvailableCommonValences</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1767 1754     <span class="c"># Calculate potential total valence using the only available common valence...</span> | 
|  | 1768 1755     <span class="i">$PotentialTotalValence</span> = <span class="i">$AvailableCommonValences</span>[<span class="n">0</span>] + <span class="i">$AdjustedFormalCharge</span> - <span class="i">$FreeRadicalElectrons</span><span class="sc">;</span> | 
|  | 1769 1756   <span class="s">}</span> | 
|  | 1770 1757   <span class="k">else</span> <span class="s">{</span> | 
|  | 1771 1758     <span class="c"># Calculate potential total valence using common valence from a list of available valences</span> | 
|  | 1772 1759     <span class="c"># that makes it higher than sum of bond orders or using the highest common valence...</span> | 
|  | 1773 1760     <span class="j">VALENCE:</span> <span class="k">for</span> <span class="i">$AvailableCommonValence</span> <span class="s">(</span><span class="i">@AvailableCommonValences</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1774 1761       <span class="i">$PotentialTotalValence</span> = <span class="i">$AvailableCommonValence</span> + <span class="i">$AdjustedFormalCharge</span> - <span class="i">$FreeRadicalElectrons</span><span class="sc">;</span> | 
|  | 1775 1762 | 
|  | 1776 1763       <span class="k">if</span> <span class="s">(</span><span class="i">$PotentialTotalValence</span> < <span class="n">0</span> || <span class="i">$PotentialTotalValence</span> >= <span class="i">$SumOfBondOrders</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1777 1764         <span class="k">last</span> <span class="j">VALENCE</span><span class="sc">;</span> | 
|  | 1778 1765       <span class="s">}</span> | 
|  | 1779 1766     <span class="s">}</span> | 
|  | 1780 1767   <span class="s">}</span> | 
|  | 1781 1768 | 
|  | 1782 1769   <span class="k">return</span> <span class="i">$PotentialTotalValence</span> > <span class="n">0</span> ? <span class="i">$PotentialTotalValence</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1783 1770 <span class="s">}</span> | 
|  | 1784 1771 | 
|  | 1785 1772 <span class="c"># Adjust sign of the formal charge for potential total common valence calculation</span> | 
|  | 1786 1773 <span class="c"># used during internal valence model to figure out number of implicit hydrogens.</span> | 
|  | 1787 1774 <span class="c">#</span> | 
|  | 1788 <a name="_GetFormalChargeAdjustedForInternalValenceModel-"></a>1775 <span class="k">sub </span><span class="m">_GetFormalChargeAdjustedForInternalValenceModel</span> <span class="s">{</span> | 
|  | 1789 1776   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1790 1777   <span class="k">my</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="cm">,</span> <span class="i">$GroupNumber</span><span class="cm">,</span> <span class="i">$SwitchSign</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1791 1778 | 
|  | 1792 1779   <span class="i">$FormalCharge</span> = <span class="i">$This</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1793 1780   <span class="k">if</span> <span class="s">(</span><span class="i">$FormalCharge</span> == <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1794 1781     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1795 1782   <span class="s">}</span> | 
|  | 1796 1783 | 
|  | 1797 1784   <span class="i">$GroupNumber</span> = <span class="i">$This</span><span class="i">->GetGroupNumber</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1798 1785   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$GroupNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1799 1786     <span class="k">return</span> <span class="i">$FormalCharge</span><span class="sc">;</span> | 
|  | 1800 1787   <span class="s">}</span> | 
|  | 1801 1788 | 
|  | 1802 1789   <span class="c"># Group numbers > 14 - Group numbers 15 (N), 16 (O), 17 (F), 18 (He)</span> | 
|  | 1803 1790   <span class="c">#</span> | 
|  | 1804 1791   <span class="c"># Formal charge sign is not adjusted. Positive and negative values result in the</span> | 
|  | 1805 1792   <span class="c"># increase and decrease of valence.</span> | 
|  | 1806 1793   <span class="c">#</span> | 
|  | 1807 1794   <span class="c"># Group 14 containing C, Si, Ge, Sn, Pb...</span> | 
|  | 1808 1795   <span class="c">#</span> | 
|  | 1809 1796   <span class="c"># Formal charge sign is reversed for positive values. Both positive and negative</span> | 
|  | 1810 1797   <span class="c"># values result in the decrease of valence.</span> | 
|  | 1811 1798   <span class="c">#</span> | 
|  | 1812 1799   <span class="c"># Group 13 containing B, Al, Ga, In, Tl...</span> | 
|  | 1813 1800   <span class="c">#</span> | 
|  | 1814 1801   <span class="c"># Formal charge sign is always reversed. Positive and negative values result in the</span> | 
|  | 1815 1802   <span class="c"># decrease and increase of valence.</span> | 
|  | 1816 1803   <span class="c">#</span> | 
|  | 1817 1804   <span class="c"># Groups 1 (H) through 12 (Zn)...</span> | 
|  | 1818 1805   <span class="c">#</span> | 
|  | 1819 1806   <span class="c"># Formal charge sign is reversed for positive values. Both positive and negative</span> | 
|  | 1820 1807   <span class="c"># values result in the decrease of valence.</span> | 
|  | 1821 1808   <span class="c">#</span> | 
|  | 1822 1809   <span class="c"># Lanthanides and actinides...</span> | 
|  | 1823 1810   <span class="c">#</span> | 
|  | 1824 1811   <span class="c"># Formal charge sign is reversed for positive values. Both positive and negative</span> | 
|  | 1825 1812   <span class="c"># values result in the decrease of valence.</span> | 
|  | 1826 1813   <span class="c">#</span> | 
|  | 1827 1814 | 
|  | 1828 1815   <span class="i">$SwitchSign</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1829 1816   <span class="k">if</span> <span class="s">(</span><span class="k">length</span> <span class="i">$GroupNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1830 1817     <span class="j">GROUPNUMBER:</span> <span class="s">{</span> | 
|  | 1831 1818       <span class="k">if</span> <span class="s">(</span><span class="i">$GroupNumber</span> > <span class="n">14</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1832 1819         <span class="c"># Groups on the right side of C group in the periodic table...</span> | 
|  | 1833 1820         <span class="i">$SwitchSign</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1834 1821         <span class="k">last</span> <span class="j">GROUPNUMBER</span><span class="sc">;</span> | 
|  | 1835 1822       <span class="s">}</span> | 
|  | 1836 1823       <span class="k">if</span> <span class="s">(</span><span class="i">$GroupNumber</span> == <span class="n">14</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1837 1824         <span class="c"># Group containing C, Si, Ge, Sn, Pb...</span> | 
|  | 1838 1825         <span class="i">$SwitchSign</span> = <span class="s">(</span><span class="i">$FormalCharge</span> > <span class="n">0</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1839 1826         <span class="k">last</span> <span class="j">GROUPNUMBER</span><span class="sc">;</span> | 
|  | 1840 1827       <span class="s">}</span> | 
|  | 1841 1828       <span class="k">if</span> <span class="s">(</span><span class="i">$GroupNumber</span> == <span class="n">13</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1842 1829         <span class="c"># Group containing B, Al, Ga, In, Tl...</span> | 
|  | 1843 1830         <span class="i">$SwitchSign</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 1844 1831         <span class="k">last</span> <span class="j">GROUPNUMBER</span><span class="sc">;</span> | 
|  | 1845 1832       <span class="s">}</span> | 
|  | 1846 1833       <span class="c"># Groups 1 (H) through 12 (Zn)...</span> | 
|  | 1847 1834       <span class="k">if</span> <span class="s">(</span><span class="i">$GroupNumber</span> >=<span class="n">1</span> && <span class="i">$GroupNumber</span> <= <span class="n">12</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1848 1835         <span class="c"># Groups 1 (H) through 12 (Zn)...</span> | 
|  | 1849 1836         <span class="i">$SwitchSign</span> = <span class="s">(</span><span class="i">$FormalCharge</span> > <span class="n">0</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1850 1837         <span class="k">last</span> <span class="j">GROUPNUMBER</span><span class="sc">;</span> | 
|  | 1851 1838       <span class="s">}</span> | 
|  | 1852 1839     <span class="s">}</span> | 
|  | 1853 1840   <span class="s">}</span> | 
|  | 1854 1841   <span class="k">else</span> <span class="s">{</span> | 
|  | 1855 1842     <span class="c"># Lanthanides and actinides...</span> | 
|  | 1856 1843     <span class="i">$SwitchSign</span> = <span class="s">(</span><span class="i">$FormalCharge</span> > <span class="n">0</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1857 1844   <span class="s">}</span> | 
|  | 1858 1845 | 
|  | 1859 1846   <span class="k">if</span> <span class="s">(</span><span class="i">$SwitchSign</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1860 1847     <span class="i">$FormalCharge</span> *= <span class="n">-1.0</span><span class="sc">;</span> | 
|  | 1861 1848   <span class="s">}</span> | 
|  | 1862 1849 | 
|  | 1863 1850   <span class="k">return</span> <span class="i">$FormalCharge</span><span class="sc">;</span> | 
|  | 1864 1851 <span class="s">}</span> | 
|  | 1865 1852 | 
|  | 1866 1853 <span class="c"># Get lowest common valence...</span> | 
|  | 1867 <a name="GetLowestCommonValence-"></a>1854 <span class="k">sub </span><span class="m">GetLowestCommonValence</span> <span class="s">{</span> | 
|  | 1868 1855   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1869 1856 | 
|  | 1870 1857   <span class="c"># Is LowestCommonValence property explicitly set?</span> | 
|  | 1871 1858   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'LowestCommonValence'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1872 1859     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'LowestCommonValence'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1873 1860   <span class="s">}</span> | 
|  | 1874 1861   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$LowestCommonValence</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1875 1862 | 
|  | 1876 1863   <span class="i">$AtomicNumber</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 1877 1864   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1878 1865     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1879 1866   <span class="s">}</span> | 
|  | 1880 1867   <span class="c"># Any need to differentiate between internal and other valence models...</span> | 
|  | 1881 1868 | 
|  | 1882 1869   <span class="c"># LowestCommonValence is not set for all elements...</span> | 
|  | 1883 1870   <span class="i">$LowestCommonValence</span> = <span class="i">PeriodicTable::GetElementLowestCommonValence</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1884 1871   <span class="k">if</span> <span class="s">(</span>!<span class="i">$LowestCommonValence</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1885 1872     <span class="i">$LowestCommonValence</span> = <span class="k">undef</span><span class="sc">;</span> | 
|  | 1886 1873   <span class="s">}</span> | 
|  | 1887 1874 | 
|  | 1888 1875   <span class="k">return</span> <span class="i">$LowestCommonValence</span><span class="sc">;</span> | 
|  | 1889 1876 <span class="s">}</span> | 
|  | 1890 1877 | 
|  | 1891 1878 <span class="c"># Get highest common valence...</span> | 
|  | 1892 <a name="GetHighestCommonValence-"></a>1879 <span class="k">sub </span><span class="m">GetHighestCommonValence</span> <span class="s">{</span> | 
|  | 1893 1880   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1894 1881 | 
|  | 1895 1882   <span class="c"># Is HighestCommonValence property explicitly set?</span> | 
|  | 1896 1883   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'HighestCommonValence'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1897 1884     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'HighestCommonValence'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1898 1885   <span class="s">}</span> | 
|  | 1899 1886   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$HighestCommonValence</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1900 1887 | 
|  | 1901 1888   <span class="i">$AtomicNumber</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 1902 1889   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1903 1890     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1904 1891   <span class="s">}</span> | 
|  | 1905 1892 | 
|  | 1906 1893   <span class="c"># Any need to differentiate between internal and other valence models...</span> | 
|  | 1907 1894 | 
|  | 1908 1895   <span class="c"># HighestCommonValence is not set for all elements...</span> | 
|  | 1909 1896   <span class="i">$HighestCommonValence</span> = <span class="i">PeriodicTable::GetElementHighestCommonValence</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1910 1897   <span class="k">if</span> <span class="s">(</span>!<span class="i">$HighestCommonValence</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1911 1898     <span class="i">$HighestCommonValence</span> = <span class="k">undef</span><span class="sc">;</span> | 
|  | 1912 1899   <span class="s">}</span> | 
|  | 1913 1900 | 
|  | 1914 1901   <span class="k">return</span> <span class="i">$HighestCommonValence</span><span class="sc">;</span> | 
|  | 1915 1902 <span class="s">}</span> | 
|  | 1916 1903 | 
|  | 1917 1904 <span class="c"># Get valence electrons...</span> | 
|  | 1918 <a name="GetValenceElectrons-"></a>1905 <span class="k">sub </span><span class="m">GetValenceElectrons</span> <span class="s">{</span> | 
|  | 1919 1906   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1920 1907 | 
|  | 1921 1908   <span class="c"># Is ValenceElectrons property explicitly set?</span> | 
|  | 1922 1909   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'ValenceElectrons'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1923 1910     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'ValenceElectrons'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1924 1911   <span class="s">}</span> | 
|  | 1925 1912   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$ValenceElectrons</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1926 1913 | 
|  | 1927 1914   <span class="i">$AtomicNumber</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 1928 1915   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1929 1916     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1930 1917   <span class="s">}</span> | 
|  | 1931 1918 | 
|  | 1932 1919   <span class="i">$ValenceElectrons</span> = <span class="i">PeriodicTable::GetElementValenceElectrons</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1933 1920 | 
|  | 1934 1921   <span class="k">return</span> <span class="i">$ValenceElectrons</span><span class="sc">;</span> | 
|  | 1935 1922 <span class="s">}</span> | 
|  | 1936 1923 | 
|  | 1937 1924 <span class="c"># Add hydrogens to specified atom in molecule and return number of hydrogens added:</span> | 
|  | 1938 1925 <span class="c">#</span> | 
|  | 1939 1926 <span class="c">#   o HydrogensToAdd = ImplicitHydrogenCount - ExplicitHydrogenCount</span> | 
|  | 1940 1927 <span class="c">#</span> | 
|  | 1941 1928 <span class="c">#   o XYZ are set to ZeroVector</span> | 
|  | 1942 1929 <span class="c">#</span> | 
|  | 1943 <a name="AddHydrogens-"></a>1930 <span class="k">sub </span><span class="m">AddHydrogens</span> <span class="s">{</span> | 
|  | 1944 1931   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$HydrogenPositionsWarning</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1945 1932 | 
|  | 1946 1933   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1947 1934   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1948 1935     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1949 1936   <span class="s">}</span> | 
|  | 1950 1937   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$HydrogenPositionsWarning</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1951 1938     <span class="i">$HydrogenPositionsWarning</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 1952 1939   <span class="s">}</span> | 
|  | 1953 1940   <span class="k">if</span> <span class="s">(</span><span class="i">$HydrogenPositionsWarning</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1954 1941     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddHydrogens: The current release of MayaChemTools doesn't assign any hydrogen positions..."</span><span class="sc">;</span> | 
|  | 1955 1942   <span class="s">}</span> | 
|  | 1956 1943 | 
|  | 1957 1944   <span class="c"># Is it an element symbol?</span> | 
|  | 1958 1945   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1959 1946     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1960 1947   <span class="s">}</span> | 
|  | 1961 1948 | 
|  | 1962 1949   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="cm">,</span> <span class="i">$HydrogensAdded</span><span class="cm">,</span> <span class="i">$HydrogensToAdd</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1963 1950 | 
|  | 1964 1951   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1965 1952   <span class="i">$HydrogensAdded</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1966 1953   <span class="i">$HydrogensToAdd</span> = <span class="i">$This</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1967 1954   <span class="k">if</span> <span class="s">(</span><span class="i">$HydrogensToAdd</span> <= <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1968 1955     <span class="k">return</span> <span class="i">$HydrogensAdded</span><span class="sc">;</span> | 
|  | 1969 1956   <span class="s">}</span> | 
|  | 1970 1957 | 
|  | 1971 1958   <span class="k">my</span><span class="s">(</span><span class="i">$Count</span><span class="cm">,</span> <span class="i">$Hydrogen</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1972 1959 | 
|  | 1973 1960   <span class="k">for</span> <span class="i">$Count</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$HydrogensToAdd</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1974 1961     <span class="i">$HydrogensAdded</span>++<span class="sc">;</span> | 
|  | 1975 1962 | 
|  | 1976 1963     <span class="i">$Hydrogen</span> = <span class="i">$Molecule</span><span class="i">->NewAtom</span><span class="s">(</span><span class="q">'AtomSymbol'</span> <span class="cm">=></span> <span class="q">'H'</span><span class="cm">,</span> <span class="q">'XYZ'</span> <span class="cm">=></span> <span class="s">[</span><span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="s">]</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1977 1964     <span class="i">$Molecule</span><span class="i">->NewBond</span><span class="s">(</span><span class="q">'Atoms'</span> <span class="cm">=></span> <span class="s">[</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Hydrogen</span><span class="s">]</span><span class="cm">,</span> <span class="q">'BondOrder'</span> <span class="cm">=></span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1978 1965   <span class="s">}</span> | 
|  | 1979 1966 | 
|  | 1980 1967   <span class="k">return</span> <span class="i">$HydrogensAdded</span><span class="sc">;</span> | 
|  | 1981 1968 <span class="s">}</span> | 
|  | 1982 1969 | 
|  | 1983 1970 <span class="c"># Delete hydrogens attached to atom in molecule and return total number of hydrogens deleted...</span> | 
|  | 1984 <a name="DeleteHydrogens-"></a>1971 <span class="k">sub </span><span class="m">DeleteHydrogens</span> <span class="s">{</span> | 
|  | 1985 1972   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1986 1973 | 
|  | 1987 1974   <span class="c"># Is this atom in a molecule?</span> | 
|  | 1988 1975   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1989 1976     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1990 1977   <span class="s">}</span> | 
|  | 1991 1978 | 
|  | 1992 1979   <span class="c"># Is it an element symbol?</span> | 
|  | 1993 1980   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1994 1981     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1995 1982   <span class="s">}</span> | 
|  | 1996 1983 | 
|  | 1997 1984   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="cm">,</span> <span class="i">$Neighbor</span><span class="cm">,</span> <span class="i">$HydrogensDeleted</span><span class="cm">,</span> <span class="i">@Neighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1998 1985 | 
|  | 1999 1986   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2000 1987   <span class="i">$HydrogensDeleted</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2001 1988   <span class="i">@Neighbors</span> = <span class="i">$This</span><span class="i">->GetNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2002 1989 | 
|  | 2003 1990   <span class="j">NEIGHBOR:</span> <span class="k">for</span> <span class="i">$Neighbor</span> <span class="s">(</span><span class="i">@Neighbors</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2004 1991     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Neighbor</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2005 1992       <span class="k">next</span> <span class="j">NEIGHBOR</span><span class="sc">;</span> | 
|  | 2006 1993     <span class="s">}</span> | 
|  | 2007 1994     <span class="i">$Molecule</span><span class="i">->_DeleteAtom</span><span class="s">(</span><span class="i">$Neighbor</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2008 1995     <span class="i">$HydrogensDeleted</span>++<span class="sc">;</span> | 
|  | 2009 1996   <span class="s">}</span> | 
|  | 2010 1997 | 
|  | 2011 1998   <span class="k">return</span> <span class="i">$HydrogensDeleted</span><span class="sc">;</span> | 
|  | 2012 1999 <span class="s">}</span> | 
|  | 2013 2000 | 
|  | 2014 2001 <span class="c"># Copy atom and all its associated data...</span> | 
|  | 2015 <a name="Copy-"></a>2002 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span> | 
|  | 2016 2003   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2017 2004   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2018 2005 | 
|  | 2019 2006   <span class="i">$Atom</span> = <span class="i">Storable::dclone</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2020 2007 | 
|  | 2021 2008   <span class="k">return</span> <span class="i">$Atom</span><span class="sc">;</span> | 
|  | 2022 2009 <span class="s">}</span> | 
|  | 2023 2010 | 
|  | 2024 2011 <span class="c"># Get atomic invariant value...</span> | 
|  | 2025 2012 <span class="c">#</span> | 
|  | 2026 <a name="GetAtomicInvariantValue-"></a>2013 <span class="k">sub </span><span class="m">GetAtomicInvariantValue</span> <span class="s">{</span> | 
|  | 2027 2014   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomicInvariant</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2028 2015   <span class="k">my</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2029 2016 | 
|  | 2030 2017   <span class="i">$Value</span> = <span class="q">""</span><span class="sc">;</span> | 
|  | 2031 2018 | 
|  | 2032 2019   <span class="j">ATOMICVARIANT:</span> <span class="s">{</span> | 
|  | 2033 2020     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(AS|AtomSymbol|ElementSymbol)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2034 2021       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetAtomSymbol</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2035 2022       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2036 2023     <span class="s">}</span> | 
|  | 2037 2024     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(X|NumOfNonHydrogenAtomNeighbors|NumOfHeavyAtomNeighbors)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2038 2025       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetNumOfNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2039 2026       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2040 2027     <span class="s">}</span> | 
|  | 2041 2028     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(BO|SumOfBondOrdersToNonHydrogenAtoms|SumOfBondOrdersToHeavyAtoms)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2042 2029       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetSumOfBondOrdersToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2043 2030       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2044 2031     <span class="s">}</span> | 
|  | 2045 2032     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(LBO|LargestBondOrderToNonHydrogenAtoms|LargestBondOrderToHeavyAtoms)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2046 2033       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetLargestBondOrderToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2047 2034       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2048 2035     <span class="s">}</span> | 
|  | 2049 2036     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(H|NumOfImplicitAndExplicitHydrogens)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2050 2037       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetNumOfHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2051 2038       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2052 2039     <span class="s">}</span> | 
|  | 2053 2040     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(SB|NumOfSingleBondsToNonHydrogenAtoms|NumOfSingleBondsToHeavyAtoms)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2054 2041       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetNumOfSingleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2055 2042       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2056 2043     <span class="s">}</span> | 
|  | 2057 2044     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(DB|NumOfDoubleBondsToNonHydrogenAtoms|NumOfDoubleBondsToHeavyAtoms)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2058 2045       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetNumOfDoubleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2059 2046       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2060 2047     <span class="s">}</span> | 
|  | 2061 2048     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(TB|NumOfTripleBondsToNonHydrogenAtoms|NumOfTripleBondsToHeavyAtoms)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2062 2049       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetNumOfTripleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2063 2050       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2064 2051     <span class="s">}</span> | 
|  | 2065 2052     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(AB|NumOfAromaticBondsToNonHydrogenAtoms|NumOfAromaticBondsToHeavyAtoms)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2066 2053       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetNumOfAromaticBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2067 2054       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2068 2055     <span class="s">}</span> | 
|  | 2069 2056     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(FC|FormalCharge)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2070 2057       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2071 2058       <span class="i">$Value</span> = <span class="k">defined</span> <span class="i">$Value</span> ? <span class="i">$Value</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2072 2059       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2073 2060     <span class="s">}</span> | 
|  | 2074 2061     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(T|TotalNumOfAtomNeighbors)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2075 2062       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetNumOfNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->GetNumOfHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2076 2063       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2077 2064     <span class="s">}</span> | 
|  | 2078 2065     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(TSB|TotalNumOfSingleBonds)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2079 2066       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetNumOfSingleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->GetNumOfHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2080 2067       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2081 2068     <span class="s">}</span> | 
|  | 2082 2069     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(Ar|Aromatic)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2083 2070       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2084 2071       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2085 2072     <span class="s">}</span> | 
|  | 2086 2073     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(RA|RingAtom)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2087 2074       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsInRing</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2088 2075       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2089 2076     <span class="s">}</span> | 
|  | 2090 2077     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(Str|Stereochemistry)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2091 2078       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetStereochemistry</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2092 2079       <span class="i">$Value</span>= <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="s">(</span><span class="i">$Value</span> =~ <span class="q">/^(R|S)$/i</span><span class="s">)</span><span class="s">)</span> ? <span class="i">$Value</span> <span class="co">:</span> <span class="q">''</span><span class="sc">;</span> | 
|  | 2093 2080       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2094 2081     <span class="s">}</span> | 
|  | 2095 2082     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(AN|AtomicNumber)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2096 2083       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2097 2084       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2098 2085     <span class="s">}</span> | 
|  | 2099 2086     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(AM|AtomicMass)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2100 2087       <span class="i">$Value</span> = <span class="i">round</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetExactMass</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="n">4</span><span class="s">)</span> + <span class="n">0</span><span class="sc">;</span> | 
|  | 2101 2088       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2102 2089     <span class="s">}</span> | 
|  | 2103 2090     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(MN|MassNumber)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2104 2091       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetMassNumber</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2105 2092       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2106 2093     <span class="s">}</span> | 
|  | 2107 2094     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(SM|SpinMultiplicity)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2108 2095       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->GetSpinMultiplicity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2109 2096       <span class="i">$Value</span> = <span class="k">defined</span> <span class="i">$Value</span> ? <span class="i">$Value</span> <span class="co">:</span> <span class="q">''</span><span class="sc">;</span> | 
|  | 2110 2097       <span class="k">last</span> <span class="j">ATOMICVARIANT</span><span class="sc">;</span> | 
|  | 2111 2098     <span class="s">}</span> | 
|  | 2112 2099     <span class="i">$Value</span> = <span class="q">""</span><span class="sc">;</span> | 
|  | 2113 2100     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->GetAtomicInvariantValue: Unknown atomic invariant $AtomicInvariant..."</span><span class="sc">;</span> | 
|  | 2114 2101   <span class="s">}</span> | 
|  | 2115 2102 | 
|  | 2116 2103   <span class="k">return</span> <span class="i">$Value</span><span class="sc">;</span> | 
|  | 2117 2104 <span class="s">}</span> | 
|  | 2118 2105 | 
|  | 2119 2106 <span class="c"># Get period number of the atom..</span> | 
|  | 2120 2107 <span class="c">#</span> | 
|  | 2121 <a name="GetPeriodNumber-"></a>2108 <span class="k">sub </span><span class="m">GetPeriodNumber</span> <span class="s">{</span> | 
|  | 2122 2109   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2123 2110 | 
|  | 2124 2111   <span class="c"># Is PeriodNumber property explicitly set?</span> | 
|  | 2125 2112   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'PeriodNumber'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2126 2113     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'PeriodNumber'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2127 2114   <span class="s">}</span> | 
|  | 2128 2115   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$PeriodNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2129 2116 | 
|  | 2130 2117   <span class="i">$AtomicNumber</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 2131 2118   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2132 2119     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2133 2120   <span class="s">}</span> | 
|  | 2134 2121 | 
|  | 2135 2122   <span class="i">$PeriodNumber</span> = <span class="i">PeriodicTable::GetElementPeriodNumber</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2136 2123 | 
|  | 2137 2124   <span class="k">return</span> <span class="i">$PeriodNumber</span><span class="sc">;</span> | 
|  | 2138 2125 <span class="s">}</span> | 
|  | 2139 2126 | 
|  | 2140 2127 <span class="c"># Get group number of the atom..</span> | 
|  | 2141 2128 <span class="c">#</span> | 
|  | 2142 <a name="GetGroupNumber-"></a>2129 <span class="k">sub </span><span class="m">GetGroupNumber</span> <span class="s">{</span> | 
|  | 2143 2130   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2144 2131 | 
|  | 2145 2132   <span class="c"># Is GroupNumber property explicitly set?</span> | 
|  | 2146 2133   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'GroupNumber'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2147 2134     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'GroupNumber'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2148 2135   <span class="s">}</span> | 
|  | 2149 2136   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$GroupNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2150 2137 | 
|  | 2151 2138   <span class="i">$AtomicNumber</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 2152 2139   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2153 2140     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2154 2141   <span class="s">}</span> | 
|  | 2155 2142 | 
|  | 2156 2143   <span class="i">$GroupNumber</span> = <span class="i">PeriodicTable::GetElementGroupNumber</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2157 2144 | 
|  | 2158 2145   <span class="k">return</span> <span class="i">$GroupNumber</span><span class="sc">;</span> | 
|  | 2159 2146 <span class="s">}</span> | 
|  | 2160 2147 | 
|  | 2161 2148 <span class="c"># Is it a specified topological pharmacophore atom type?</span> | 
|  | 2162 2149 <span class="c">#</span> | 
|  | 2163 <a name="IsTopologicalPharmacophoreType-"></a>2150 <span class="k">sub </span><span class="m">IsTopologicalPharmacophoreType</span> <span class="s">{</span> | 
|  | 2164 2151   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2165 2152 | 
|  | 2166 2153   <span class="k">return</span> <span class="i">$This</span><span class="i">->_IsFunctionalClassType</span><span class="s">(</span><span class="i">$Type</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2167 2154 <span class="s">}</span> | 
|  | 2168 2155 | 
|  | 2169 2156 <span class="c"># Is it a specified functional class atom type?</span> | 
|  | 2170 2157 <span class="c">#</span> | 
|  | 2171 <a name="IsFunctionalClassType-"></a>2158 <span class="k">sub </span><span class="m">IsFunctionalClassType</span> <span class="s">{</span> | 
|  | 2172 2159   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2173 2160 | 
|  | 2174 2161   <span class="k">return</span> <span class="i">$This</span><span class="i">->_IsFunctionalClassType</span><span class="s">(</span><span class="i">$Type</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2175 2162 <span class="s">}</span> | 
|  | 2176 2163 | 
|  | 2177 2164 <span class="c"># Is it a specified functional/topological pharmacophore atom type?</span> | 
|  | 2178 2165 <span class="c">#</span> | 
|  | 2179 <a name="_IsFunctionalClassType-"></a>2166 <span class="k">sub </span><span class="m">_IsFunctionalClassType</span> <span class="s">{</span> | 
|  | 2180 2167   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2181 2168   <span class="k">my</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2182 2169 | 
|  | 2183 2170   <span class="i">$Value</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2184 2171 | 
|  | 2185 2172   <span class="j">TYPE:</span> <span class="s">{</span> | 
|  | 2186 2173     <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> =~ <span class="q">/^(HBD|HydrogenBondDonor)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2187 2174       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsHydrogenBondDonor</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2188 2175       <span class="k">last</span> <span class="j">TYPE</span><span class="sc">;</span> | 
|  | 2189 2176     <span class="s">}</span> | 
|  | 2190 2177     <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> =~ <span class="q">/^(HBA|HydrogenBondAcceptor)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2191 2178       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsHydrogenBondAcceptor</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2192 2179       <span class="k">last</span> <span class="j">TYPE</span><span class="sc">;</span> | 
|  | 2193 2180     <span class="s">}</span> | 
|  | 2194 2181     <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> =~ <span class="q">/^(PI|PositivelyIonizable)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2195 2182       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsPositivelyIonizable</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2196 2183       <span class="k">last</span> <span class="j">TYPE</span><span class="sc">;</span> | 
|  | 2197 2184     <span class="s">}</span> | 
|  | 2198 2185     <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> =~ <span class="q">/^(NI|NegativelyIonizable)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2199 2186       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsNegativelyIonizable</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2200 2187       <span class="k">last</span> <span class="j">TYPE</span><span class="sc">;</span> | 
|  | 2201 2188     <span class="s">}</span> | 
|  | 2202 2189     <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> =~ <span class="q">/^(H|Hydrophobic)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2203 2190       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsHydrophobic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2204 2191       <span class="k">last</span> <span class="j">TYPE</span><span class="sc">;</span> | 
|  | 2205 2192     <span class="s">}</span> | 
|  | 2206 2193     <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> =~ <span class="q">/^(Ar|Aromatic)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2207 2194       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2208 2195       <span class="k">last</span> <span class="j">TYPE</span><span class="sc">;</span> | 
|  | 2209 2196     <span class="s">}</span> | 
|  | 2210 2197     <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> =~ <span class="q">/^(Hal|Halogen)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2211 2198       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsHalogen</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2212 2199       <span class="k">last</span> <span class="j">TYPE</span><span class="sc">;</span> | 
|  | 2213 2200     <span class="s">}</span> | 
|  | 2214 2201     <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> =~ <span class="q">/^(RA|RingAtom)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2215 2202       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsInRing</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2216 2203       <span class="k">last</span> <span class="j">TYPE</span><span class="sc">;</span> | 
|  | 2217 2204     <span class="s">}</span> | 
|  | 2218 2205     <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> =~ <span class="q">/^(CA|ChainAtom)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2219 2206       <span class="i">$Value</span> = <span class="i">$This</span><span class="i">->IsNotInRing</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2220 2207       <span class="k">last</span> <span class="j">TYPE</span><span class="sc">;</span> | 
|  | 2221 2208     <span class="s">}</span> | 
|  | 2222 2209     <span class="i">$Value</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2223 2210     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_IsType: Unknown functional/pharmacohore type $Type..."</span><span class="sc">;</span> | 
|  | 2224 2211   <span class="s">}</span> | 
|  | 2225 2212   <span class="k">return</span> <span class="i">$Value</span><span class="sc">;</span> | 
|  | 2226 2213 <span class="s">}</span> | 
|  | 2227 2214 | 
|  | 2228 2215 <span class="c"># Is it a Hydrogen atom?</span> | 
|  | 2229 <a name="IsHydrogen-"></a>2216 <span class="k">sub </span><span class="m">IsHydrogen</span> <span class="s">{</span> | 
|  | 2230 2217   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2231 2218 | 
|  | 2232 2219   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">1</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2233 2220 <span class="s">}</span> | 
|  | 2234 2221 | 
|  | 2235 2222 <span class="c"># Is it a Carbon atom?</span> | 
|  | 2236 <a name="IsCarbon-"></a>2223 <span class="k">sub </span><span class="m">IsCarbon</span> <span class="s">{</span> | 
|  | 2237 2224   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2238 2225 | 
|  | 2239 2226   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">6</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2240 2227 <span class="s">}</span> | 
|  | 2241 2228 | 
|  | 2242 2229 <span class="c"># Is it a Nitrogen atom?</span> | 
|  | 2243 <a name="IsNitrogen-"></a>2230 <span class="k">sub </span><span class="m">IsNitrogen</span> <span class="s">{</span> | 
|  | 2244 2231   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2245 2232 | 
|  | 2246 2233   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">7</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2247 2234 <span class="s">}</span> | 
|  | 2248 2235 | 
|  | 2249 2236 <span class="c"># Is it a Oxygen atom?</span> | 
|  | 2250 <a name="IsOxygen-"></a>2237 <span class="k">sub </span><span class="m">IsOxygen</span> <span class="s">{</span> | 
|  | 2251 2238   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2252 2239 | 
|  | 2253 2240   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">8</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2254 2241 <span class="s">}</span> | 
|  | 2255 2242 | 
|  | 2256 2243 <span class="c"># Is it a Fluorine atom?</span> | 
|  | 2257 <a name="IsFluorine-"></a>2244 <span class="k">sub </span><span class="m">IsFluorine</span> <span class="s">{</span> | 
|  | 2258 2245   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2259 2246 | 
|  | 2260 2247   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">9</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2261 2248 <span class="s">}</span> | 
|  | 2262 2249 | 
|  | 2263 2250 <span class="c"># Is it a Silicon atom?</span> | 
|  | 2264 <a name="IsSilicon-"></a>2251 <span class="k">sub </span><span class="m">IsSilicon</span> <span class="s">{</span> | 
|  | 2265 2252   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2266 2253 | 
|  | 2267 2254   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">14</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2268 2255 <span class="s">}</span> | 
|  | 2269 2256 | 
|  | 2270 2257 <span class="c"># Is it a Phosphorus atom?</span> | 
|  | 2271 <a name="IsPhosphorus-"></a>2258 <span class="k">sub </span><span class="m">IsPhosphorus</span> <span class="s">{</span> | 
|  | 2272 2259   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2273 2260 | 
|  | 2274 2261   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">15</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2275 2262 <span class="s">}</span> | 
|  | 2276 2263 | 
|  | 2277 2264 <span class="c"># Is it a Sulphur atom?</span> | 
|  | 2278 <a name="IsSulphur-"></a>2265 <span class="k">sub </span><span class="m">IsSulphur</span> <span class="s">{</span> | 
|  | 2279 2266   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2280 2267 | 
|  | 2281 2268   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsSulfur</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2282 2269 <span class="s">}</span> | 
|  | 2283 2270 | 
|  | 2284 2271 <span class="c"># Is it a Sulfur atom?</span> | 
|  | 2285 <a name="IsSulfur-"></a>2272 <span class="k">sub </span><span class="m">IsSulfur</span> <span class="s">{</span> | 
|  | 2286 2273   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2287 2274 | 
|  | 2288 2275   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">16</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2289 2276 <span class="s">}</span> | 
|  | 2290 2277 | 
|  | 2291 2278 <span class="c"># Is it a Chlorine atom?</span> | 
|  | 2292 <a name="IsChlorine-"></a>2279 <span class="k">sub </span><span class="m">IsChlorine</span> <span class="s">{</span> | 
|  | 2293 2280   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2294 2281 | 
|  | 2295 2282   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">17</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2296 2283 <span class="s">}</span> | 
|  | 2297 2284 | 
|  | 2298 2285 <span class="c"># Is it a Arsenic atom?</span> | 
|  | 2299 <a name="IsArsenic-"></a>2286 <span class="k">sub </span><span class="m">IsArsenic</span> <span class="s">{</span> | 
|  | 2300 2287   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2301 2288 | 
|  | 2302 2289   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">33</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2303 2290 <span class="s">}</span> | 
|  | 2304 2291 | 
|  | 2305 2292 <span class="c"># Is it a Selenium atom?</span> | 
|  | 2306 <a name="IsSelenium-"></a>2293 <span class="k">sub </span><span class="m">IsSelenium</span> <span class="s">{</span> | 
|  | 2307 2294   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2308 2295 | 
|  | 2309 2296   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">34</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2310 2297 <span class="s">}</span> | 
|  | 2311 2298 | 
|  | 2312 2299 <span class="c"># Is it a Bromine atom?</span> | 
|  | 2313 <a name="IsBromine-"></a>2300 <span class="k">sub </span><span class="m">IsBromine</span> <span class="s">{</span> | 
|  | 2314 2301   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2315 2302 | 
|  | 2316 2303   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">35</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2317 2304 <span class="s">}</span> | 
|  | 2318 2305 | 
|  | 2319 2306 <span class="c"># Is it a Tellurium atom?</span> | 
|  | 2320 <a name="IsTellurium-"></a>2307 <span class="k">sub </span><span class="m">IsTellurium</span> <span class="s">{</span> | 
|  | 2321 2308   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2322 2309 | 
|  | 2323 2310   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">52</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2324 2311 <span class="s">}</span> | 
|  | 2325 2312 | 
|  | 2326 2313 <span class="c"># Is it a Iodine atom?</span> | 
|  | 2327 <a name="IsIodine-"></a>2314 <span class="k">sub </span><span class="m">IsIodine</span> <span class="s">{</span> | 
|  | 2328 2315   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2329 2316 | 
|  | 2330 2317   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">53</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2331 2318 <span class="s">}</span> | 
|  | 2332 2319 | 
|  | 2333 2320 <span class="c"># Is it a hetro atom? (N, O, F, P, S, Cl, Br, I)</span> | 
|  | 2334 <a name="IsHeteroAtom-"></a>2321 <span class="k">sub </span><span class="m">IsHeteroAtom</span> <span class="s">{</span> | 
|  | 2335 2322   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2336 2323 | 
|  | 2337 2324   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} =~ <span class="q">/^(7|8|9|15|16|17|35|53)$/</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2338 2325 <span class="s">}</span> | 
|  | 2339 2326 | 
|  | 2340 2327 <span class="c"># Is it a halogen atom? (F, Cl, Br, I)</span> | 
|  | 2341 <a name="IsHalogen-"></a>2328 <span class="k">sub </span><span class="m">IsHalogen</span> <span class="s">{</span> | 
|  | 2342 2329   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2343 2330 | 
|  | 2344 2331   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} =~ <span class="q">/^(9|17|35|53)$/</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2345 2332 <span class="s">}</span> | 
|  | 2346 2333 | 
|  | 2347 2334 <span class="c"># Is it classified as metallic?</span> | 
|  | 2348 <a name="IsMetallic-"></a>2335 <span class="k">sub </span><span class="m">IsMetallic</span> <span class="s">{</span> | 
|  | 2349 2336   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2350 2337   <span class="k">my</span><span class="s">(</span><span class="i">$Classification</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2351 2338 | 
|  | 2352 2339   <span class="i">$Classification</span> = <span class="i">PeriodicTable::GetElementClassification</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 2353 2340 | 
|  | 2354 2341   <span class="k">return</span> <span class="s">(</span><span class="i">$Classification</span> =~ <span class="q">/^Metallic$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2355 2342 <span class="s">}</span> | 
|  | 2356 2343 | 
|  | 2357 2344 <span class="c"># Is it a non carbon or hydrogen atom? (C, H)</span> | 
|  | 2358 <a name="IsNonCarbonOrHydrogen-"></a>2345 <span class="k">sub </span><span class="m">IsNonCarbonOrHydrogen</span> <span class="s">{</span> | 
|  | 2359 2346   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2360 2347 | 
|  | 2361 2348   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} =~ <span class="q">/^(1|6)$/</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2362 2349 <span class="s">}</span> | 
|  | 2363 2350 | 
|  | 2364 2351 <span class="c"># Is it a polar atom? ( N, O,  P, S)</span> | 
|  | 2365 <a name="IsPolarAtom-"></a>2352 <span class="k">sub </span><span class="m">IsPolarAtom</span> <span class="s">{</span> | 
|  | 2366 2353   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2367 2354 | 
|  | 2368 2355   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} =~ <span class="q">/^(7|8|15|16)$/</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2369 2356 <span class="s">}</span> | 
|  | 2370 2357 | 
|  | 2371 2358 <span class="c"># Is it an isotope?</span> | 
|  | 2372 <a name="IsIsotope-"></a>2359 <span class="k">sub </span><span class="m">IsIsotope</span> <span class="s">{</span> | 
|  | 2373 2360   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2374 2361 | 
|  | 2375 2362   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span> = <span class="i">$This</span>->{<span class="w">AtomicNumber</span>}<span class="sc">;</span> | 
|  | 2376 2363   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2377 2364     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2378 2365   <span class="s">}</span> | 
|  | 2379 2366 | 
|  | 2380 2367   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'MassNumber'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2381 2368     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2382 2369   <span class="s">}</span> | 
|  | 2383 2370   <span class="k">my</span><span class="s">(</span><span class="i">$MassNumber</span><span class="cm">,</span> <span class="i">$MostAbundantMassNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2384 2371 | 
|  | 2385 2372   <span class="i">$MassNumber</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'MassNumber'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2386 2373   <span class="i">$MostAbundantMassNumber</span> = <span class="i">PeriodicTable::GetElementMostAbundantNaturalIsotopeMassNumber</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2387 2374 | 
|  | 2388 2375   <span class="k">return</span> <span class="s">(</span><span class="i">$MassNumber</span> == <span class="i">$MostAbundantMassNumber</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2389 2376 <span class="s">}</span> | 
|  | 2390 2377 | 
|  | 2391 2378 <span class="c"># Is it a terminal atom?</span> | 
|  | 2392 <a name="IsTerminal-"></a>2379 <span class="k">sub </span><span class="m">IsTerminal</span> <span class="s">{</span> | 
|  | 2393 2380   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2394 2381 | 
|  | 2395 2382   <span class="c"># Is this atom in a molecule?</span> | 
|  | 2396 2383   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2397 2384     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 2398 2385   <span class="s">}</span> | 
|  | 2399 2386 | 
|  | 2400 2387   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetNumOfNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span> <= <span class="n">1</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span> | 
|  | 2401 2388 | 
|  | 2402 2389 <span class="s">}</span> | 
|  | 2403 2390 | 
|  | 2404 2391 <span class="c"># Is aromatic property set for the atom?</span> | 
|  | 2405 <a name="IsAromatic-"></a>2392 <span class="k">sub </span><span class="m">IsAromatic</span> <span class="s">{</span> | 
|  | 2406 2393   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2407 2394   <span class="k">my</span><span class="s">(</span><span class="i">$Aromatic</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2408 2395 | 
|  | 2409 2396   <span class="i">$Aromatic</span> = <span class="i">$This</span><span class="i">->GetAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2410 2397 | 
|  | 2411 2398   <span class="k">return</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Aromatic</span><span class="s">)</span> && <span class="i">$Aromatic</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2412 2399 <span class="s">}</span> | 
|  | 2413 2400 | 
|  | 2414 2401 <span class="c"># Is this a hydrogen atom and attached to one of these atoms: N, O, P, S</span> | 
|  | 2415 <a name="IsPolarHydrogen-"></a>2402 <span class="k">sub </span><span class="m">IsPolarHydrogen</span> <span class="s">{</span> | 
|  | 2416 2403   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2417 2404 | 
|  | 2418 2405   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2419 2406     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2420 2407   <span class="s">}</span> | 
|  | 2421 2408 | 
|  | 2422 2409   <span class="k">my</span><span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2423 2410   <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetBonds</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2424 2411   <span class="k">if</span> <span class="s">(</span><span class="i">@Bonds</span> > <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2425 2412     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2426 2413   <span class="s">}</span> | 
|  | 2427 2414 | 
|  | 2428 2415   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="cm">,</span> <span class="i">$BondedAtom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2429 2416   <span class="s">(</span><span class="i">$Bond</span><span class="s">)</span> = <span class="i">@Bonds</span><span class="sc">;</span> | 
|  | 2430 2417   <span class="i">$BondedAtom</span> = <span class="i">$Bond</span><span class="i">->GetBondedAtom</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2431 2418 | 
|  | 2432 2419   <span class="k">return</span> <span class="i">$BondedAtom</span><span class="i">->IsPolarAtom</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2433 2420 <span class="s">}</span> | 
|  | 2434 2421 | 
|  | 2435 2422 <span class="c"># Is it a hydrogen bond donor atom?</span> | 
|  | 2436 2423 <span class="c">#</span> | 
|  | 2437 <a name="IsHBondDonor-"></a>2424 <span class="k">sub </span><span class="m">IsHBondDonor</span> <span class="s">{</span> | 
|  | 2438 2425   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$HydrogenBondsType</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2439 2426 | 
|  | 2440 2427   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsHydrogenBondDonor</span><span class="s">(</span><span class="i">$HydrogenBondsType</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2441 2428 <span class="s">}</span> | 
|  | 2442 2429 | 
|  | 2443 2430 <span class="c"># The currrent release of MayaChemTools supports identification of two types of</span> | 
|  | 2444 2431 <span class="c"># hydrogen bond donor and acceptor atoms with these names:</span> | 
|  | 2445 2432 <span class="c">#</span> | 
|  | 2446 2433 <span class="c"># HBondsType1 or HydrogenBondsType1</span> | 
|  | 2447 2434 <span class="c"># HBondsType2 or HydrogenBondsType2</span> | 
|  | 2448 2435 <span class="c">#</span> | 
|  | 2449 2436 <span class="c"># The names of these hydrogen bond types are rather arbitrary. However, their</span> | 
|  | 2450 2437 <span class="c"># definitions have specific meaning and are as follows:</span> | 
|  | 2451 2438 <span class="c">#</span> | 
|  | 2452 2439 <span class="c"># HydrogenBondsType1 [ Ref 60-61, Ref 65-66 ]:</span> | 
|  | 2453 2440 <span class="c">#   . Donor: NH, NH2, NH3, OH - Any N and O with available H</span> | 
|  | 2454 2441 <span class="c">#   . Acceptor: N[!H], O - Any N without available H and any O</span> | 
|  | 2455 2442 <span class="c">#</span> | 
|  | 2456 2443 <span class="c"># HydrogenBondsType2 [ Ref 91 ]:</span> | 
|  | 2457 2444 <span class="c">#   . Donor: NH, NH2, NH3, OH - Any N and O with availabe H</span> | 
|  | 2458 2445 <span class="c">#   . Acceptor: N, O - Any N and O</span> | 
|  | 2459 2446 <span class="c">#</span> | 
|  | 2460 2447 <span class="c"># Note:</span> | 
|  | 2461 2448 <span class="c">#   . HydrogenBondsType2 definition corresponds to Rule of 5.</span> | 
|  | 2462 2449 <span class="c">#</span> | 
|  | 2463 2450 | 
|  | 2464 2451 <span class="c"># Is it a hydrogen bond donor atom?</span> | 
|  | 2465 2452 <span class="c">#</span> | 
|  | 2466 2453 <span class="c"># The currrent release of MayaChemTools supports identification of two types of</span> | 
|  | 2467 <a name="IsHydrogenBondDonor-"></a>2454 <span class="k">sub </span><span class="m">IsHydrogenBondDonor</span> <span class="s">{</span> | 
|  | 2468 2455   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$HydrogenBondsType</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2469 2456   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2470 2457 | 
|  | 2471 2458   <span class="i">$HydrogenBondsType</span> = <span class="k">defined</span> <span class="i">$HydrogenBondsType</span> ? <span class="i">$HydrogenBondsType</span> <span class="co">:</span> <span class="q">'HBondsType1'</span><span class="sc">;</span> | 
|  | 2472 2459   <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2473 2460 | 
|  | 2474 2461   <span class="j">HYDROGENBONDSTYPE:</span> <span class="s">{</span> | 
|  | 2475 2462 | 
|  | 2476 2463       <span class="k">if</span> <span class="s">(</span><span class="i">$HydrogenBondsType</span> =~ <span class="q">/^(HBondsType1|HydrogenBondsType1)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2477 2464         <span class="i">$Status</span> = <span class="i">$This</span><span class="i">->_IsHydrogenBondDonorOfType1</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2478 2465         <span class="k">last</span> <span class="j">HYDROGENBONDSTYPE</span><span class="sc">;</span> | 
|  | 2479 2466       <span class="s">}</span> | 
|  | 2480 2467 | 
|  | 2481 2468       <span class="k">if</span> <span class="s">(</span><span class="i">$HydrogenBondsType</span> =~ <span class="q">/^(HBondsType2|HydrogenBondsType2)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2482 2469         <span class="i">$Status</span> = <span class="i">$This</span><span class="i">->_IsHydrogenBondDonorOfType2</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2483 2470         <span class="k">last</span> <span class="j">HYDROGENBONDSTYPE</span><span class="sc">;</span> | 
|  | 2484 2471       <span class="s">}</span> | 
|  | 2485 2472 | 
|  | 2486 2473       <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2487 2474       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->IsHydrogenBondDonor: The current release of MayaChemTools doesn't support specified value, $HydrogenBondsType, for HydrogenBondsType. Valid values: HBondsType1, HydrogenBondsType1, HBondsType2 HydrogenBondsType2 ..."</span><span class="sc">;</span> | 
|  | 2488 2475   <span class="s">}</span> | 
|  | 2489 2476 | 
|  | 2490 2477   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 2491 2478 <span class="s">}</span> | 
|  | 2492 2479 | 
|  | 2493 2480 <span class="c"># Is it a MayaChemTools HBondType1 hydrogen bond donor atom?</span> | 
|  | 2494 2481 <span class="c">#</span> | 
|  | 2495 <a name="_IsHydrogenBondDonorOfType1-"></a>2482 <span class="k">sub </span><span class="m">_IsHydrogenBondDonorOfType1</span> <span class="s">{</span> | 
|  | 2496 2483   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2497 2484 | 
|  | 2498 2485   <span class="k">return</span> <span class="i">$This</span><span class="i">->_IsHydrogenBondDonorOfType1OrType2</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2499 2486 <span class="s">}</span> | 
|  | 2500 2487 | 
|  | 2501 2488 <span class="c"># Is it a MayaChemTools HBondType2 hydrogen bond donor atom?</span> | 
|  | 2502 2489 <span class="c">#</span> | 
|  | 2503 <a name="_IsHydrogenBondDonorOfType2-"></a>2490 <span class="k">sub </span><span class="m">_IsHydrogenBondDonorOfType2</span> <span class="s">{</span> | 
|  | 2504 2491   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2505 2492 | 
|  | 2506 2493   <span class="k">return</span> <span class="i">$This</span><span class="i">->_IsHydrogenBondDonorOfType1OrType2</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2507 2494 <span class="s">}</span> | 
|  | 2508 2495 | 
|  | 2509 2496 <span class="c"># Is it a hydrogen bond donor atom of MayaChemTools Type1 or Type2?</span> | 
|  | 2510 2497 <span class="c">#</span> | 
|  | 2511 2498 <span class="c"># HydrogenBondDonor definition [ Ref 60-61, Ref 65-66, Ref 91 ]: NH, NH2, OH</span> | 
|  | 2512 2499 <span class="c">#</span> | 
|  | 2513 2500 <span class="c"># In other words:</span> | 
|  | 2514 2501 <span class="c">#   . NH, NH2 - Nitrogen atom with available hydrogen</span> | 
|  | 2515 2502 <span class="c">#   . OH - Oxygen atom with avilable hydrogen</span> | 
|  | 2516 2503 <span class="c">#</span> | 
|  | 2517 <a name="_IsHydrogenBondDonorOfType1OrType2-"></a>2504 <span class="k">sub </span><span class="m">_IsHydrogenBondDonorOfType1OrType2</span> <span class="s">{</span> | 
|  | 2518 2505   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2519 2506 | 
|  | 2520 2507   <span class="c"># Is this atom in a molecule?</span> | 
|  | 2521 2508   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2522 2509     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2523 2510   <span class="s">}</span> | 
|  | 2524 2511 | 
|  | 2525 2512   <span class="c"># Is it N or O?</span> | 
|  | 2526 2513   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} !~ <span class="q">/^(7|8)$/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2527 2514     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2528 2515   <span class="s">}</span> | 
|  | 2529 2516 | 
|  | 2530 2517   <span class="c"># Any explicitly attached hydrogens?</span> | 
|  | 2531 2518   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetExplicitHydrogens</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2532 2519     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2533 2520   <span class="s">}</span> | 
|  | 2534 2521 | 
|  | 2535 2522   <span class="c"># Any missing hydrogens?</span> | 
|  | 2536 2523   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2537 2524 <span class="s">}</span> | 
|  | 2538 2525 | 
|  | 2539 2526 <span class="c"># Is it a hydrogen bond acceptor atom?</span> | 
|  | 2540 2527 <span class="c">#</span> | 
|  | 2541 <a name="IsHBondAcceptor-"></a>2528 <span class="k">sub </span><span class="m">IsHBondAcceptor</span> <span class="s">{</span> | 
|  | 2542 2529   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$HydrogenBondsType</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2543 2530 | 
|  | 2544 2531   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsHydrogenBondAcceptor</span><span class="s">(</span><span class="i">$HydrogenBondsType</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2545 2532 <span class="s">}</span> | 
|  | 2546 2533 | 
|  | 2547 2534 <span class="c"># Is it a hydrogen bond acceptor atom?</span> | 
|  | 2548 2535 <span class="c">#</span> | 
|  | 2549 <a name="IsHydrogenBondAcceptor-"></a>2536 <span class="k">sub </span><span class="m">IsHydrogenBondAcceptor</span> <span class="s">{</span> | 
|  | 2550 2537   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$HydrogenBondsType</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2551 2538   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2552 2539 | 
|  | 2553 2540   <span class="i">$HydrogenBondsType</span> = <span class="k">defined</span> <span class="i">$HydrogenBondsType</span> ? <span class="i">$HydrogenBondsType</span> <span class="co">:</span> <span class="q">'HBondsType1'</span><span class="sc">;</span> | 
|  | 2554 2541   <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2555 2542 | 
|  | 2556 2543   <span class="j">HYDROGENBONDSTYPE:</span> <span class="s">{</span> | 
|  | 2557 2544 | 
|  | 2558 2545       <span class="k">if</span> <span class="s">(</span><span class="i">$HydrogenBondsType</span> =~ <span class="q">/^(HBondsType1|HydrogenBondsType1)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2559 2546         <span class="i">$Status</span> = <span class="i">$This</span><span class="i">->_IsHydrogenBondAcceptorOfType1</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2560 2547         <span class="k">last</span> <span class="j">HYDROGENBONDSTYPE</span><span class="sc">;</span> | 
|  | 2561 2548       <span class="s">}</span> | 
|  | 2562 2549 | 
|  | 2563 2550       <span class="k">if</span> <span class="s">(</span><span class="i">$HydrogenBondsType</span> =~ <span class="q">/^(HBondsType2|HydrogenBondsType2)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2564 2551         <span class="i">$Status</span> = <span class="i">$This</span><span class="i">->_IsHydrogenBondAcceptorOfType2</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2565 2552         <span class="k">last</span> <span class="j">HYDROGENBONDSTYPE</span><span class="sc">;</span> | 
|  | 2566 2553       <span class="s">}</span> | 
|  | 2567 2554 | 
|  | 2568 2555       <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2569 2556       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->IsHydrogenBondAcceptor: The current release of MayaChemTools doesn't support specified value, $HydrogenBondsType, for HydrogenBondsType. Valid values: HBondsType1, HydrogenBondsType1, HBondsType2 HydrogenBondsType2 ..."</span><span class="sc">;</span> | 
|  | 2570 2557   <span class="s">}</span> | 
|  | 2571 2558 | 
|  | 2572 2559   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 2573 2560 <span class="s">}</span> | 
|  | 2574 2561 | 
|  | 2575 2562 <span class="c"># Is it a MayaChemTools HBondType1 hydrogen bond acceptor atom?</span> | 
|  | 2576 2563 <span class="c">#</span> | 
|  | 2577 2564 <span class="c"># HydrogenBondAcceptor definition [ Ref 60-61, Ref 65-66 ]: N[!H], O</span> | 
|  | 2578 2565 <span class="c">#</span> | 
|  | 2579 2566 <span class="c"># In other words:</span> | 
|  | 2580 2567 <span class="c">#   . N[!H] - Nitrogen atom with no hydrogen</span> | 
|  | 2581 2568 <span class="c">#   . O - Oxygen atom</span> | 
|  | 2582 2569 <span class="c">#</span> | 
|  | 2583 <a name="_IsHydrogenBondAcceptorOfType1-"></a>2570 <span class="k">sub </span><span class="m">_IsHydrogenBondAcceptorOfType1</span> <span class="s">{</span> | 
|  | 2584 2571   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2585 2572 | 
|  | 2586 2573   <span class="c"># Is this atom in a molecule?</span> | 
|  | 2587 2574   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2588 2575     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2589 2576   <span class="s">}</span> | 
|  | 2590 2577 | 
|  | 2591 2578   <span class="c"># Is it N or O?</span> | 
|  | 2592 2579   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} !~ <span class="q">/^(7|8)$/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2593 2580     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2594 2581   <span class="s">}</span> | 
|  | 2595 2582 | 
|  | 2596 2583   <span class="c"># Is it O?</span> | 
|  | 2597 2584   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">8</span> <span class="s">)</span> <span class="s">{</span> | 
|  | 2598 2585     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2599 2586   <span class="s">}</span> | 
|  | 2600 2587 | 
|  | 2601 2588   <span class="c"># Any explicitly attached hydrogens?</span> | 
|  | 2602 2589   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetExplicitHydrogens</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2603 2590     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2604 2591   <span class="s">}</span> | 
|  | 2605 2592 | 
|  | 2606 2593   <span class="c"># Any missing hydrogens?</span> | 
|  | 2607 2594   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2608 2595 <span class="s">}</span> | 
|  | 2609 2596 | 
|  | 2610 2597 <span class="c"># Is it a MayaChemTools HBondType2 hydrogen bond acceptor atom?</span> | 
|  | 2611 2598 <span class="c">#</span> | 
|  | 2612 2599 <span class="c"># HydrogenBondAcceptor definition [ Ref 91 ]: N, O</span> | 
|  | 2613 2600 <span class="c">#</span> | 
|  | 2614 2601 <span class="c"># In other words:</span> | 
|  | 2615 2602 <span class="c">#   . Any Nitrogen or Oxygen atom</span> | 
|  | 2616 2603 <span class="c">#</span> | 
|  | 2617 2604 <span class="c"># Note:</span> | 
|  | 2618 2605 <span class="c">#   . HydrogenBondsType2 definition corresponds to Rule of 5.</span> | 
|  | 2619 2606 <span class="c">#</span> | 
|  | 2620 <a name="_IsHydrogenBondAcceptorOfType2-"></a>2607 <span class="k">sub </span><span class="m">_IsHydrogenBondAcceptorOfType2</span> <span class="s">{</span> | 
|  | 2621 2608   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2622 2609 | 
|  | 2623 2610   <span class="c"># Is this atom in a molecule?</span> | 
|  | 2624 2611   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2625 2612     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2626 2613   <span class="s">}</span> | 
|  | 2627 2614 | 
|  | 2628 2615   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} =~ <span class="q">/^(7|8)$/</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2629 2616 <span class="s">}</span> | 
|  | 2630 2617 | 
|  | 2631 2618 <span class="c"># Is it a positively ionizable atom?</span> | 
|  | 2632 2619 <span class="c">#</span> | 
|  | 2633 2620 <span class="c"># PositivelyIonizable defintion [ Ref 60-61, Ref 65-66 ]: +, NH2</span> | 
|  | 2634 2621 <span class="c">#</span> | 
|  | 2635 2622 <span class="c"># In other words:</span> | 
|  | 2636 2623 <span class="c">#   . Any atom with positve formal charge</span> | 
|  | 2637 2624 <span class="c">#   . NH2 - Nitogen atom in amino group</span> | 
|  | 2638 2625 <span class="c">#</span> | 
|  | 2639 <a name="IsPositivelyIonizable-"></a>2626 <span class="k">sub </span><span class="m">IsPositivelyIonizable</span> <span class="s">{</span> | 
|  | 2640 2627   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2641 2628   <span class="k">my</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2642 2629 | 
|  | 2643 2630   <span class="c"># Is this atom in a molecule?</span> | 
|  | 2644 2631   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2645 2632     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2646 2633   <span class="s">}</span> | 
|  | 2647 2634 | 
|  | 2648 2635   <span class="c"># Any explicit positive formal charge?</span> | 
|  | 2649 2636   <span class="i">$FormalCharge</span> = <span class="i">$This</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2650 2637   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span> && <span class="i">$FormalCharge</span> > <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2651 2638     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2652 2639   <span class="s">}</span> | 
|  | 2653 2640 | 
|  | 2654 2641   <span class="c"># Is it  N?</span> | 
|  | 2655 2642   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} != <span class="n">7</span> <span class="s">)</span> <span class="s">{</span> | 
|  | 2656 2643     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2657 2644   <span class="s">}</span> | 
|  | 2658 2645 | 
|  | 2659 2646   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetNumOfHydrogens</span><span class="s">(</span><span class="s">)</span> == <span class="n">2</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2660 2647 <span class="s">}</span> | 
|  | 2661 2648 | 
|  | 2662 2649 <span class="c"># Is it a negatively ionizable atom?</span> | 
|  | 2663 2650 <span class="c">#</span> | 
|  | 2664 2651 <span class="c"># NegativelyIonizable definition [ Ref 60-61, Ref 65-66 ]: -, C(=O)OH, S(=O)OH, P(=O)OH</span> | 
|  | 2665 2652 <span class="c">#</span> | 
|  | 2666 2653 <span class="c"># In other words:</span> | 
|  | 2667 2654 <span class="c">#   . Any atom with negative formal charge</span> | 
|  | 2668 2655 <span class="c">#   . Carbon atom in C(=O)OH group</span> | 
|  | 2669 2656 <span class="c">#   . Phosphorous in P(=O)OH group</span> | 
|  | 2670 2657 <span class="c">#   . Sulfur atom in S(=O)OH group</span> | 
|  | 2671 2658 <span class="c">#</span> | 
|  | 2672 <a name="IsNegativelyIonizable-"></a>2659 <span class="k">sub </span><span class="m">IsNegativelyIonizable</span> <span class="s">{</span> | 
|  | 2673 2660   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2674 2661   <span class="k">my</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2675 2662 | 
|  | 2676 2663   <span class="c"># Is this atom in a molecule?</span> | 
|  | 2677 2664   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2678 2665     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2679 2666   <span class="s">}</span> | 
|  | 2680 2667 | 
|  | 2681 2668   <span class="c"># Any explicit negative formal charge?</span> | 
|  | 2682 2669   <span class="i">$FormalCharge</span> = <span class="i">$This</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2683 2670   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span> && <span class="i">$FormalCharge</span> < <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2684 2671     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2685 2672   <span class="s">}</span> | 
|  | 2686 2673 | 
|  | 2687 2674   <span class="c"># Is it C, P or S?</span> | 
|  | 2688 2675   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} !~ <span class="q">/^(6|15|16)$/</span> <span class="s">)</span> <span class="s">{</span> | 
|  | 2689 2676     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2690 2677   <span class="s">}</span> | 
|  | 2691 2678 | 
|  | 2692 2679   <span class="c"># Collect oxygens connected to C, P or S with single or double bonds and not connected to</span> | 
|  | 2693 2680   <span class="c"># any other heavy atom...</span> | 
|  | 2694 2681   <span class="k">my</span><span class="s">(</span><span class="i">$Neighbor</span><span class="cm">,</span> <span class="i">$NeighborOxygenBondOrder</span><span class="cm">,</span> <span class="i">$NumOfNeighborOxygensWithSingleBonds</span><span class="cm">,</span> <span class="i">$NumOfNeighborOxygensWithDoubleBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2695 2682 | 
|  | 2696 2683   <span class="i">$NumOfNeighborOxygensWithSingleBonds</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$NumOfNeighborOxygensWithDoubleBonds</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2697 2684 | 
|  | 2698 2685   <span class="j">NEIGHBOR:</span> <span class="k">for</span> <span class="i">$Neighbor</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetNeighbors</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2699 2686     <span class="c"># Is it an oxygen?</span> | 
|  | 2700 2687     <span class="k">if</span> <span class="s">(</span><span class="i">$Neighbor</span>->{<span class="w">AtomicNumber</span>} != <span class="n">8</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2701 2688       <span class="k">next</span> <span class="j">NEIGHBOR</span><span class="sc">;</span> | 
|  | 2702 2689     <span class="s">}</span> | 
|  | 2703 2690     <span class="c"># Is oxygent connected to only heavy atom?</span> | 
|  | 2704 2691     <span class="k">if</span> <span class="s">(</span><span class="i">$Neighbor</span><span class="i">->GetNumOfHeavyAtomNeighbors</span><span class="s">(</span><span class="s">)</span> != <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2705 2692       <span class="k">next</span> <span class="j">NEIGHBOR</span><span class="sc">;</span> | 
|  | 2706 2693     <span class="s">}</span> | 
|  | 2707 2694     <span class="i">$NeighborOxygenBondOrder</span> = <span class="i">$This</span><span class="i">->GetBondToAtom</span><span class="s">(</span><span class="i">$Neighbor</span><span class="s">)</span><span class="i">->GetBondOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2708 2695 | 
|  | 2709 2696     <span class="k">if</span> <span class="s">(</span><span class="i">$NeighborOxygenBondOrder</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2710 2697       <span class="i">$NumOfNeighborOxygensWithDoubleBonds</span>++<span class="sc">;</span> | 
|  | 2711 2698     <span class="s">}</span> | 
|  | 2712 2699     <span class="k">elsif</span> <span class="s">(</span><span class="i">$NeighborOxygenBondOrder</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2713 2700       <span class="i">$NumOfNeighborOxygensWithSingleBonds</span>++<span class="sc">;</span> | 
|  | 2714 2701     <span class="s">}</span> | 
|  | 2715 2702   <span class="s">}</span> | 
|  | 2716 2703   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfNeighborOxygensWithDoubleBonds</span> >= <span class="n">1</span> && <span class="i">$NumOfNeighborOxygensWithSingleBonds</span> >= <span class="n">1</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2717 2704 <span class="s">}</span> | 
|  | 2718 2705 | 
|  | 2719 2706 <span class="c"># Is it a liphophilic atom?</span> | 
|  | 2720 2707 <span class="c">#</span> | 
|  | 2721 2708 <span class="c"># Lipophilic definition [ Ref 60-61, Ref 65-66 ]: C(C)(C)(C)(C), Cl, Br, I, S(C)(C)</span> | 
|  | 2722 2709 <span class="c">#</span> | 
|  | 2723 2710 <span class="c"># In other words:</span> | 
|  | 2724 2711 <span class="c">#   . C(C)(C)(C)(C) - Carbon atom connected to only other carbons</span> | 
|  | 2725 2712 <span class="c">#   . Chlorine, Bromine or Iodine atom</span> | 
|  | 2726 2713 <span class="c">#   . S(C)(C) - Sulfur connected to two carbons</span> | 
|  | 2727 2714 <span class="c">#</span> | 
|  | 2728 <a name="IsLipophilic-"></a>2715 <span class="k">sub </span><span class="m">IsLipophilic</span> <span class="s">{</span> | 
|  | 2729 2716   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2730 2717 | 
|  | 2731 2718   <span class="c"># Is this atom in a molecule?</span> | 
|  | 2732 2719   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2733 2720     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2734 2721   <span class="s">}</span> | 
|  | 2735 2722 | 
|  | 2736 2723   <span class="c"># Is it Cl, Br, I?</span> | 
|  | 2737 2724   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} =~ <span class="q">/^(17|35|53)$/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2738 2725     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2739 2726   <span class="s">}</span> | 
|  | 2740 2727 | 
|  | 2741 2728   <span class="c"># Is it C, S?</span> | 
|  | 2742 2729   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} !~ <span class="q">/^(6|16)$/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2743 2730     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2744 2731   <span class="s">}</span> | 
|  | 2745 2732 | 
|  | 2746 2733   <span class="c"># Are all heavy atom neighbors Carbons?</span> | 
|  | 2747 2734   <span class="k">my</span><span class="s">(</span><span class="i">$HeavyAtomNeighbor</span><span class="cm">,</span> <span class="i">@HeavyAtomNeighbors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2748 2735   <span class="i">@HeavyAtomNeighbors</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2749 2736   <span class="i">@HeavyAtomNeighbors</span> = <span class="i">$This</span><span class="i">->GetHeavyAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2750 2737 | 
|  | 2751 2738   <span class="k">for</span> <span class="i">$HeavyAtomNeighbor</span> <span class="s">(</span><span class="i">@HeavyAtomNeighbors</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2752 2739     <span class="k">if</span> <span class="s">(</span><span class="i">$HeavyAtomNeighbor</span>->{<span class="w">AtomicNumber</span>} != <span class="n">6</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2753 2740       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2754 2741     <span class="s">}</span> | 
|  | 2755 2742   <span class="s">}</span> | 
|  | 2756 2743 | 
|  | 2757 2744   <span class="c"># Does sulfur has two carbon neighbors?</span> | 
|  | 2758 2745   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="n">16</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2759 2746     <span class="k">if</span> <span class="s">(</span><span class="i">@HeavyAtomNeighbors</span> != <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2760 2747       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2761 2748     <span class="s">}</span> | 
|  | 2762 2749   <span class="s">}</span> | 
|  | 2763 2750   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2764 2751 <span class="s">}</span> | 
|  | 2765 2752 | 
|  | 2766 2753 <span class="c"># Is it hydrophobic?</span> | 
|  | 2767 2754 <span class="c">#</span> | 
|  | 2768 <a name="IsHydrophobic-"></a>2755 <span class="k">sub </span><span class="m">IsHydrophobic</span> <span class="s">{</span> | 
|  | 2769 2756   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2770 2757 | 
|  | 2771 2758   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsLipophilic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2772 2759 <span class="s">}</span> | 
|  | 2773 2760 | 
|  | 2774 2761 <span class="c"># Is it a Nitrogen atom in Guadinium group?</span> | 
|  | 2775 2762 <span class="c">#</span> | 
|  | 2776 <a name="IsGuadiniumNitrogen-"></a>2763 <span class="k">sub </span><span class="m">IsGuadiniumNitrogen</span> <span class="s">{</span> | 
|  | 2777 2764   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2778 2765 | 
|  | 2779 2766   <span class="c"># Is it Nitrogen?</span> | 
|  | 2780 2767   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsNitrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2781 2768     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2782 2769   <span class="s">}</span> | 
|  | 2783 2770 | 
|  | 2784 2771   <span class="c"># Is it connected to a Guadinium Carbon?</span> | 
|  | 2785 2772   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNeighbor</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2786 2773 | 
|  | 2787 2774   <span class="k">for</span> <span class="i">$AtomNeighbor</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2788 2775     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomNeighbor</span><span class="i">->IsGuadiniumCarbon</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2789 2776       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2790 2777     <span class="s">}</span> | 
|  | 2791 2778   <span class="s">}</span> | 
|  | 2792 2779 | 
|  | 2793 2780   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2794 2781 <span class="s">}</span> | 
|  | 2795 2782 | 
|  | 2796 2783 <span class="c"># Is it a Carbon atom in Guadinium group?</span> | 
|  | 2797 2784 <span class="c">#</span> | 
|  | 2798 2785 <span class="c"># Guadinium group definition:</span> | 
|  | 2799 2786 <span class="c">#</span> | 
|  | 2800 2787 <span class="c">#   R2N-C(=NR)-(NR2) or R2N-C(=NR2+)-(NR2)</span> | 
|  | 2801 2788 <span class="c">#</span> | 
|  | 2802 2789 <span class="c">#   where:</span> | 
|  | 2803 2790 <span class="c">#      . R = Hydrogens or group of atoms attached through Carbon</span> | 
|  | 2804 2791 <span class="c">#      . Only one of the three Nitrogens has a double bond to Carbon and has optional</span> | 
|  | 2805 2792 <span class="c">#        formal charge allowing it to be neutral or charged state</span> | 
|  | 2806 2793 <span class="c">#</span> | 
|  | 2807 <a name="IsGuadiniumCarbon-"></a>2794 <span class="k">sub </span><span class="m">IsGuadiniumCarbon</span> <span class="s">{</span> | 
|  | 2808 2795   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2809 2796 | 
|  | 2810 2797   <span class="c"># Is it Carbon?</span> | 
|  | 2811 2798   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsCarbon</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2812 2799     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2813 2800   <span class="s">}</span> | 
|  | 2814 2801 | 
|  | 2815 2802   <span class="c"># Match atom neighborhood...</span> | 
|  | 2816 2803   <span class="k">my</span><span class="s">(</span><span class="i">$CentralAtomSpec</span><span class="cm">,</span> <span class="i">@NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">@NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">@NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2817 2804 | 
|  | 2818 2805   <span class="i">$CentralAtomSpec</span> = <span class="q">'C.X3.BO4'</span><span class="sc">;</span> | 
|  | 2819 2806   <span class="i">@NbrAtomSpecsRef</span> = <span class="s">(</span><span class="q">'N.FC0'</span><span class="cm">,</span> <span class="q">'N.FC0'</span><span class="cm">,</span> <span class="q">'N.FC0,N.FC+1'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2820 2807   <span class="i">@NbrBondSpecsRef</span> = <span class="s">(</span><span class="q">'-'</span><span class="cm">,</span> <span class="q">'-'</span><span class="cm">,</span> <span class="q">'='</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2821 2808   <span class="i">@NbrOfNbrAtomSpecsRef</span> = <span class="s">(</span><span class="q">'C,H'</span><span class="cm">,</span> <span class="q">'C,H'</span><span class="cm">,</span> <span class="q">'C,H'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2822 2809 | 
|  | 2823 2810   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->DoesAtomNeighborhoodMatch</span><span class="s">(</span><span class="i">$CentralAtomSpec</span><span class="cm">,</span> \<span class="i">@NbrAtomSpecsRef</span><span class="cm">,</span> \<span class="i">@NbrBondSpecsRef</span><span class="cm">,</span> \<span class="i">@NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2824 2811     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2825 2812   <span class="s">}</span> | 
|  | 2826 2813 | 
|  | 2827 2814   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2828 2815 <span class="s">}</span> | 
|  | 2829 2816 | 
|  | 2830 2817 <span class="c"># Is it a Nitrogen atom in Amide group?</span> | 
|  | 2831 2818 <span class="c">#</span> | 
|  | 2832 <a name="IsAmideNitrogen-"></a>2819 <span class="k">sub </span><span class="m">IsAmideNitrogen</span> <span class="s">{</span> | 
|  | 2833 2820   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2834 2821 | 
|  | 2835 2822   <span class="c"># Is it Nitrogen?</span> | 
|  | 2836 2823   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsNitrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2837 2824     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2838 2825   <span class="s">}</span> | 
|  | 2839 2826 | 
|  | 2840 2827   <span class="c"># Is it connected to a Amide Carbon?</span> | 
|  | 2841 2828   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNeighbor</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2842 2829 | 
|  | 2843 2830   <span class="k">for</span> <span class="i">$AtomNeighbor</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2844 2831     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomNeighbor</span><span class="i">->IsAmideCarbon</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2845 2832       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2846 2833     <span class="s">}</span> | 
|  | 2847 2834   <span class="s">}</span> | 
|  | 2848 2835 | 
|  | 2849 2836   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2850 2837 <span class="s">}</span> | 
|  | 2851 2838 | 
|  | 2852 2839 <span class="c"># Is it a Carbon atom in Amide group?</span> | 
|  | 2853 2840 <span class="c">#</span> | 
|  | 2854 2841 <span class="c"># Amide group definition: R-C(=O)-N(-R')-R''</span> | 
|  | 2855 2842 <span class="c">#</span> | 
|  | 2856 2843 <span class="c">#   where:</span> | 
|  | 2857 2844 <span class="c">#      . R = Hydrogen or groups of atoms attached through Carbon</span> | 
|  | 2858 2845 <span class="c">#      . R' = Hydrogens or groups of atoms attached through Carbon or hetro atoms</span> | 
|  | 2859 2846 <span class="c">#      . R'' = Hydrogens or groups of atoms attached through Carbon or hetro atoms</span> | 
|  | 2860 2847 <span class="c">#</span> | 
|  | 2861 <a name="IsAmideCarbon-"></a>2848 <span class="k">sub </span><span class="m">IsAmideCarbon</span> <span class="s">{</span> | 
|  | 2862 2849   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2863 2850 | 
|  | 2864 2851   <span class="c"># Is this atom in a molecule?</span> | 
|  | 2865 2852   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2866 2853     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2867 2854   <span class="s">}</span> | 
|  | 2868 2855 | 
|  | 2869 2856   <span class="c"># Is it Carbon?</span> | 
|  | 2870 2857   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsCarbon</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2871 2858     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2872 2859   <span class="s">}</span> | 
|  | 2873 2860 | 
|  | 2874 2861   <span class="c"># Match atom neighborhood...</span> | 
|  | 2875 2862   <span class="k">my</span><span class="s">(</span><span class="i">$CentralAtomSpec</span><span class="cm">,</span> <span class="i">@NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">@NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">@NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2876 2863 | 
|  | 2877 2864   <span class="i">$CentralAtomSpec</span> = <span class="q">'C.X3.BO4,C.X2.BO3'</span><span class="sc">;</span> | 
|  | 2878 2865   <span class="i">@NbrAtomSpecsRef</span> = <span class="s">(</span><span class="q">'C,H'</span><span class="cm">,</span> <span class="q">'O'</span><span class="cm">,</span> <span class="q">'N'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2879 2866   <span class="i">@NbrBondSpecsRef</span> = <span class="s">(</span><span class="q">'-'</span><span class="cm">,</span> <span class="q">'='</span><span class="cm">,</span> <span class="q">'-'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2880 2867   <span class="i">@NbrOfNbrAtomSpecsRef</span> = <span class="s">(</span><span class="q">'C,H'</span><span class="cm">,</span> <span class="q">'C'</span><span class="cm">,</span> <span class="q">'C,H,N,O,S,P,F,Cl,Br,I'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2881 2868 | 
|  | 2882 2869   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->DoesAtomNeighborhoodMatch</span><span class="s">(</span><span class="i">$CentralAtomSpec</span><span class="cm">,</span> \<span class="i">@NbrAtomSpecsRef</span><span class="cm">,</span> \<span class="i">@NbrBondSpecsRef</span><span class="cm">,</span> \<span class="i">@NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2883 2870     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2884 2871   <span class="s">}</span> | 
|  | 2885 2872 | 
|  | 2886 2873   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2887 2874 <span class="s">}</span> | 
|  | 2888 2875 | 
|  | 2889 2876 <span class="c"># Is it a Oxygen atom in Carboxylate group?</span> | 
|  | 2890 2877 <span class="c">#</span> | 
|  | 2891 <a name="IsCarboxylateOxygen-"></a>2878 <span class="k">sub </span><span class="m">IsCarboxylateOxygen</span> <span class="s">{</span> | 
|  | 2892 2879   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2893 2880 | 
|  | 2894 2881   <span class="k">return</span> <span class="i">$This</span><span class="i">->_MatchCarboxylateAndOrCarboxylOxygen</span><span class="s">(</span><span class="q">'Carboxylate'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2895 2882 <span class="s">}</span> | 
|  | 2896 2883 | 
|  | 2897 2884 <span class="c"># Is it a Carbon atom in Carboxylate group?</span> | 
|  | 2898 2885 <span class="c">#</span> | 
|  | 2899 2886 <span class="c"># Carboxyl group definition: R-C(=O)-O-</span> | 
|  | 2900 2887 <span class="c">#</span> | 
|  | 2901 <a name="IsCarboxylateCarbon-"></a>2888 <span class="k">sub </span><span class="m">IsCarboxylateCarbon</span> <span class="s">{</span> | 
|  | 2902 2889   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2903 2890 | 
|  | 2904 2891   <span class="k">return</span> <span class="i">$This</span><span class="i">->_MatchCarboxylateAndOrCarboxylCarbon</span><span class="s">(</span><span class="q">'Carboxylate'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2905 2892 <span class="s">}</span> | 
|  | 2906 2893 | 
|  | 2907 2894 <span class="c"># Is it a Oxygen atom in Carboxyl group?</span> | 
|  | 2908 2895 <span class="c">#</span> | 
|  | 2909 <a name="IsCarboxylOxygen-"></a>2896 <span class="k">sub </span><span class="m">IsCarboxylOxygen</span> <span class="s">{</span> | 
|  | 2910 2897   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2911 2898 | 
|  | 2912 2899   <span class="k">return</span> <span class="i">$This</span><span class="i">->_MatchCarboxylateAndOrCarboxylOxygen</span><span class="s">(</span><span class="q">'Carboxyl'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2913 2900 <span class="s">}</span> | 
|  | 2914 2901 | 
|  | 2915 2902 <span class="c"># Is it a Carbon atom in Carboxyl group?</span> | 
|  | 2916 2903 <span class="c">#</span> | 
|  | 2917 2904 <span class="c"># Carboxyl group definition: R-C(=O)-OH</span> | 
|  | 2918 2905 <span class="c">#</span> | 
|  | 2919 <a name="IsCarboxylCarbon-"></a>2906 <span class="k">sub </span><span class="m">IsCarboxylCarbon</span> <span class="s">{</span> | 
|  | 2920 2907   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2921 2908 | 
|  | 2922 2909   <span class="k">return</span> <span class="i">$This</span><span class="i">->_MatchCarboxylateAndOrCarboxylCarbon</span><span class="s">(</span><span class="q">'Carboxyl'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2923 2910 <span class="s">}</span> | 
|  | 2924 2911 | 
|  | 2925 2912 <span class="c"># Match Carboxylate and/or Carboxyl oxygen...</span> | 
|  | 2926 2913 <span class="c">#</span> | 
|  | 2927 <a name="_MatchCarboxylateAndOrCarboxylOxygen-"></a>2914 <span class="k">sub </span><span class="m">_MatchCarboxylateAndOrCarboxylOxygen</span> <span class="s">{</span> | 
|  | 2928 2915   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2929 2916 | 
|  | 2930 2917   <span class="c"># Is it Oxygen?</span> | 
|  | 2931 2918   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsOxygen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2932 2919     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2933 2920   <span class="s">}</span> | 
|  | 2934 2921 | 
|  | 2935 2922   <span class="c"># Is it connected to a Carboxylate Carbon?</span> | 
|  | 2936 2923   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNeighbor</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2937 2924 | 
|  | 2938 2925   <span class="k">for</span> <span class="i">$AtomNeighbor</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2939 2926     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomNeighbor</span><span class="i">->_MatchCarboxylateAndOrCarboxylCarbon</span><span class="s">(</span><span class="i">$Mode</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2940 2927       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2941 2928     <span class="s">}</span> | 
|  | 2942 2929   <span class="s">}</span> | 
|  | 2943 2930 | 
|  | 2944 2931   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2945 2932 <span class="s">}</span> | 
|  | 2946 2933 | 
|  | 2947 2934 <span class="c"># Match Carboxylate and Carboxyl Carbon</span> | 
|  | 2948 2935 <span class="c">#</span> | 
|  | 2949 2936 <span class="c"># Carboxylate group definition: R-C(=O)-O-</span> | 
|  | 2950 2937 <span class="c"># Carboxyl group definition: R-C(=O)-OH</span> | 
|  | 2951 2938 <span class="c">#</span> | 
|  | 2952 2939 <span class="c">#   where:</span> | 
|  | 2953 2940 <span class="c">#      . R = Hydrogens or groups of atoms attached through Carbon</span> | 
|  | 2954 2941 <span class="c">#</span> | 
|  | 2955 <a name="_MatchCarboxylateAndOrCarboxylCarbon-"></a>2942 <span class="k">sub </span><span class="m">_MatchCarboxylateAndOrCarboxylCarbon</span> <span class="s">{</span> | 
|  | 2956 2943   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2957 2944 | 
|  | 2958 2945   <span class="c"># Is this atom in a molecule?</span> | 
|  | 2959 2946   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2960 2947     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2961 2948   <span class="s">}</span> | 
|  | 2962 2949 | 
|  | 2963 2950   <span class="c"># Is it Carbon?</span> | 
|  | 2964 2951   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsCarbon</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2965 2952     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2966 2953   <span class="s">}</span> | 
|  | 2967 2954 | 
|  | 2968 2955   <span class="c"># Match atom neighborhood...</span> | 
|  | 2969 2956   <span class="k">my</span><span class="s">(</span><span class="i">$CentralAtomSpec</span><span class="cm">,</span> <span class="i">@NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">@NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">@NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2970 2957 | 
|  | 2971 2958   <span class="i">$CentralAtomSpec</span> = <span class="q">'C.X3.BO4,C.X2.BO3'</span><span class="sc">;</span> | 
|  | 2972 2959   <span class="j">MODE:</span> <span class="s">{</span> | 
|  | 2973 2960     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^Carboxylate$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2974 2961       <span class="i">@NbrAtomSpecsRef</span> = <span class="s">(</span><span class="q">'C,H'</span><span class="cm">,</span> <span class="q">'O'</span><span class="cm">,</span> <span class="q">'O.X1.FC-1'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2975 2962       <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> | 
|  | 2976 2963     <span class="s">}</span> | 
|  | 2977 2964     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^Carboxyl$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2978 2965       <span class="i">@NbrAtomSpecsRef</span> = <span class="s">(</span><span class="q">'C,H'</span><span class="cm">,</span> <span class="q">'O'</span><span class="cm">,</span> <span class="q">'O.X1.FC0'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2979 2966       <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> | 
|  | 2980 2967     <span class="s">}</span> | 
|  | 2981 2968     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^CarboxylateOrCarboxyl$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2982 2969       <span class="i">@NbrAtomSpecsRef</span> = <span class="s">(</span><span class="q">'C,H'</span><span class="cm">,</span> <span class="q">'O'</span><span class="cm">,</span> <span class="q">'O.X1.FC-1,O.X1.FC0'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2983 2970       <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> | 
|  | 2984 2971     <span class="s">}</span> | 
|  | 2985 2972     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_MatchCarboxylateAndCarboxylCarbon.: Unknown mode $Mode..."</span><span class="sc">;</span> | 
|  | 2986 2973     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2987 2974   <span class="s">}</span> | 
|  | 2988 2975   <span class="i">@NbrBondSpecsRef</span> = <span class="s">(</span><span class="q">'-'</span><span class="cm">,</span> <span class="q">'='</span><span class="cm">,</span> <span class="q">'-'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2989 2976   <span class="i">@NbrOfNbrAtomSpecsRef</span> = <span class="s">(</span><span class="q">'C,H'</span><span class="cm">,</span> <span class="q">'C'</span><span class="cm">,</span> <span class="q">'C'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2990 2977 | 
|  | 2991 2978   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->DoesAtomNeighborhoodMatch</span><span class="s">(</span><span class="i">$CentralAtomSpec</span><span class="cm">,</span> \<span class="i">@NbrAtomSpecsRef</span><span class="cm">,</span> \<span class="i">@NbrBondSpecsRef</span><span class="cm">,</span> \<span class="i">@NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2992 2979     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2993 2980   <span class="s">}</span> | 
|  | 2994 2981 | 
|  | 2995 2982   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2996 2983 <span class="s">}</span> | 
|  | 2997 2984 | 
|  | 2998 2985 <span class="c"># Is it a Oxygen atom in Phosphate group?</span> | 
|  | 2999 2986 <span class="c">#</span> | 
|  | 3000 <a name="IsPhosphateOxygen-"></a>2987 <span class="k">sub </span><span class="m">IsPhosphateOxygen</span> <span class="s">{</span> | 
|  | 3001 2988   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3002 2989 | 
|  | 3003 2990   <span class="c"># Is it Oxygen?</span> | 
|  | 3004 2991   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsOxygen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3005 2992     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3006 2993   <span class="s">}</span> | 
|  | 3007 2994 | 
|  | 3008 2995   <span class="c"># Is it connected to a Phosphate Phosphorus?</span> | 
|  | 3009 2996   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNeighbor</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3010 2997 | 
|  | 3011 2998   <span class="k">for</span> <span class="i">$AtomNeighbor</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3012 2999     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomNeighbor</span><span class="i">->IsPhosphatePhosphorus</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3013 3000       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3014 3001     <span class="s">}</span> | 
|  | 3015 3002   <span class="s">}</span> | 
|  | 3016 3003 | 
|  | 3017 3004   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3018 3005 <span class="s">}</span> | 
|  | 3019 3006 | 
|  | 3020 3007 <span class="c"># Is it a Phosphorus atom in Phosphate group?</span> | 
|  | 3021 3008 <span class="c">#</span> | 
|  | 3022 3009 <span class="c"># Phosphate group definition: AO-(O=)P(-OA)-OA</span> | 
|  | 3023 3010 <span class="c">#</span> | 
|  | 3024 3011 <span class="c">#   where:</span> | 
|  | 3025 3012 <span class="c">#      . A = Any Groups of atoms including hydrogens</span> | 
|  | 3026 3013 <span class="c">#</span> | 
|  | 3027 <a name="IsPhosphatePhosphorus-"></a>3014 <span class="k">sub </span><span class="m">IsPhosphatePhosphorus</span> <span class="s">{</span> | 
|  | 3028 3015   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3029 3016 | 
|  | 3030 3017   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3031 3018   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3032 3019     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3033 3020   <span class="s">}</span> | 
|  | 3034 3021 | 
|  | 3035 3022   <span class="c"># Is it Phosphorus?</span> | 
|  | 3036 3023   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsPhosphorus</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3037 3024     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3038 3025   <span class="s">}</span> | 
|  | 3039 3026 | 
|  | 3040 3027   <span class="c"># Match atom neighborhood...</span> | 
|  | 3041 3028   <span class="k">my</span><span class="s">(</span><span class="i">$CentralAtomSpec</span><span class="cm">,</span> <span class="i">@NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">@NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">@NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3042 3029 | 
|  | 3043 3030   <span class="i">$CentralAtomSpec</span> = <span class="q">'P.X4.BO5'</span><span class="sc">;</span> | 
|  | 3044 3031   <span class="i">@NbrAtomSpecsRef</span> = <span class="s">(</span><span class="q">'O'</span><span class="cm">,</span> <span class="q">'O'</span><span class="cm">,</span> <span class="q">'O'</span><span class="cm">,</span> <span class="q">'O'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3045 3032   <span class="i">@NbrBondSpecsRef</span> = <span class="s">(</span><span class="q">'-'</span><span class="cm">,</span> <span class="q">'='</span><span class="cm">,</span> <span class="q">'-'</span><span class="cm">,</span> <span class="q">'-'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3046 3033   <span class="i">@NbrOfNbrAtomSpecsRef</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3047 3034 | 
|  | 3048 3035   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->DoesAtomNeighborhoodMatch</span><span class="s">(</span><span class="i">$CentralAtomSpec</span><span class="cm">,</span> \<span class="i">@NbrAtomSpecsRef</span><span class="cm">,</span> \<span class="i">@NbrBondSpecsRef</span><span class="cm">,</span> \<span class="i">@NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3049 3036     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3050 3037   <span class="s">}</span> | 
|  | 3051 3038 | 
|  | 3052 3039   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3053 3040 <span class="s">}</span> | 
|  | 3054 3041 | 
|  | 3055 3042 | 
|  | 3056 3043 <span class="c"># Match central atom and its neighborhood using specified atom and bonds specifications...</span> | 
|  | 3057 3044 <span class="c">#</span> | 
|  | 3058 3045 <span class="c"># Let:</span> | 
|  | 3059 3046 <span class="c">#   AS = Atom symbol corresponding to element symbol, atomic number (#n) or any</span> | 
|  | 3060 3047 <span class="c">#        atom (A)</span> | 
|  | 3061 3048 <span class="c">#</span> | 
|  | 3062 3049 <span class="c">#   X<n>   = Number of non-hydrogen atom neighbors or heavy atoms attached to atom</span> | 
|  | 3063 3050 <span class="c">#   T<n>   = Total number of atom neighbors including implcit and explicit hydrogens</span> | 
|  | 3064 3051 <span class="c">#   BO<n> = Sum of bond orders to non-hydrogen atom neighbors or heavy atoms attached to atom</span> | 
|  | 3065 3052 <span class="c">#   LBO<n> = Largest bond order of non-hydrogen atom neighbors or heavy atoms attached to atom</span> | 
|  | 3066 3053 <span class="c">#   SB<n> = Number of single bonds to non-hydrogen atom neighbors or heavy atoms attached to atom</span> | 
|  | 3067 3054 <span class="c">#   TSB<n> = Total number of single bonds to atom neighbors including implcit and explicit hydrogens</span> | 
|  | 3068 3055 <span class="c">#   DB<n> = Number of double bonds to non-hydrogen atom neighbors or heavy atoms attached to atom</span> | 
|  | 3069 3056 <span class="c">#   TB<n> = Number of triple bonds to non-hydrogen atom neighbors or heavy atoms attached to atom</span> | 
|  | 3070 3057 <span class="c">#   H<n>   = Number of implicit and explicit hydrogens for atom</span> | 
|  | 3071 3058 <span class="c">#   Ar     = Aromatic annotation indicating whether atom is aromatic</span> | 
|  | 3072 3059 <span class="c">#   RA or RA<n>  = Ring atom annotation indicating whether atom is a ring</span> | 
|  | 3073 3060 <span class="c">#   TR<n>  = Total number of rings containing atom</span> | 
|  | 3074 3061 <span class="c">#   FC<+n/-n> = Formal charge assigned to atom</span> | 
|  | 3075 3062 <span class="c">#   MN<n> = Mass number indicating isotope other than most abundant isotope</span> | 
|  | 3076 3063 <span class="c">#   SM<n> = Spin multiplicity of atom. Possible values: 1 (singlet), 2 (doublet) or 3 (triplet)</span> | 
|  | 3077 3064 <span class="c">#</span> | 
|  | 3078 3065 <span class="c"># Then:</span> | 
|  | 3079 3066 <span class="c">#</span> | 
|  | 3080 3067 <span class="c">#   Atom specification corresponds to:</span> | 
|  | 3081 3068 <span class="c">#</span> | 
|  | 3082 3069 <span class="c">#     AS.X<n>.T<n>.BO<n>.LBO<n>.<SB><n>.TSB<n>.<DB><n>.<TB><n>.H<n>.Ar.RA<n>.TR<n>FC<+n/-n>.MN<n>.SM<n></span> | 
|  | 3083 3070 <span class="c">#</span> | 
|  | 3084 3071 <span class="c"># Except for AS which is a required atomic invariant in atom specification, all other atomic invariants are</span> | 
|  | 3085 3072 <span class="c"># optional. For an atom specification to match an atom, the values of all specified atomic invariants must</span> | 
|  | 3086 3073 <span class="c"># match. Exclamation in from of atomic invariant can be used to negate its effect during the match.</span> | 
|  | 3087 3074 <span class="c">#</span> | 
|  | 3088 3075 <span class="c"># A comma delimited atom specification string is used to match any one of the specifed atom specification.</span> | 
|  | 3089 3076 <span class="c">#</span> | 
|  | 3090 3077 <span class="c"># Notes:</span> | 
|  | 3091 3078 <span class="c">#   . During atom specification match to an atom, the first atomic invariant is always assumed to</span> | 
|  | 3092 3079 <span class="c">#     atom symbol.</span> | 
|  | 3093 3080 <span class="c">#   . Atom match specfication is based on AtomicInvariantAtomTypes implemented in</span> | 
|  | 3094 3081 <span class="c">#     AotmTypes::AtomicInvariantAtomType.pm module</span> | 
|  | 3095 3082 <span class="c">#</span> | 
|  | 3096 3083 <span class="c"># Examples:</span> | 
|  | 3097 3084 <span class="c">#     . ('N', 'N', 'N')</span> | 
|  | 3098 3085 <span class="c">#     . ('N.FC0', 'N.FC0', 'N,N.FC+1.H1')</span> | 
|  | 3099 3086 <span class="c">#     . ('N.H2', 'N.H2', 'N.H1')</span> | 
|  | 3100 3087 <span class="c">#     . ('C,N', '!N', '!H')</span> | 
|  | 3101 3088 <span class="c">#     . ('C,N', 'N.Ar', 'N.R5')</span> | 
|  | 3102 3089 <span class="c">#</span> | 
|  | 3103 3090 <span class="c"># Let:</span> | 
|  | 3104 3091 <span class="c">#   -|1|s|Single = Single bond</span> | 
|  | 3105 3092 <span class="c">#   =|2|d|Double = Double bond</span> | 
|  | 3106 3093 <span class="c">#   #|3|t|Triple  = Triple bond</span> | 
|  | 3107 3094 <span class="c">#   :|1.5|a|Ar|Aromatic = Aromatic bond</span> | 
|  | 3108 3095 <span class="c">#</span> | 
|  | 3109 3096 <span class="c">#   @|RB|Ring = Ring bond</span> | 
|  | 3110 3097 <span class="c">#   ~|*|Any = Any bond</span> | 
|  | 3111 3098 <span class="c">#</span> | 
|  | 3112 3099 <span class="c"># Then:</span> | 
|  | 3113 3100 <span class="c">#</span> | 
|  | 3114 3101 <span class="c">#   Bond specification corresponds to:</span> | 
|  | 3115 3102 <span class="c">#</span> | 
|  | 3116 3103 <span class="c">#     -.:</span> | 
|  | 3117 3104 <span class="c">#     =.@</span> | 
|  | 3118 3105 <span class="c">#     Double.Aromatic</span> | 
|  | 3119 3106 <span class="c">#</span> | 
|  | 3120 3107 <span class="c"># For a bond specification to match bond between two atoms, the values of all specified bond symbols must</span> | 
|  | 3121 3108 <span class="c"># match. Exclamation in from of bond symbol can be used to negate its effect during the match.</span> | 
|  | 3122 3109 <span class="c">#</span> | 
|  | 3123 3110 <span class="c"># A comma delimited bond specification string is used to match any one of the specifed atom specification.</span> | 
|  | 3124 3111 <span class="c">#</span> | 
|  | 3125 <a name="DoesAtomNeighborhoodMatch-"></a>3112 <span class="k">sub </span><span class="m">DoesAtomNeighborhoodMatch</span> <span class="s">{</span> | 
|  | 3126 3113   <span class="k">my</span><span class="s">(</span><span class="i">$CentralAtom</span><span class="cm">,</span> <span class="i">$CentralAtomSpec</span><span class="cm">,</span> <span class="i">$NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">$NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpecsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3127 3114   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfNbrAtomSpecs</span><span class="cm">,</span> <span class="i">$NumOfNbrBondSpecs</span><span class="cm">,</span> <span class="i">$NumOfNbrOfNbrAtomSpecs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3128 3115 | 
|  | 3129 3116   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3130 3117   <span class="k">if</span> <span class="s">(</span>!<span class="i">$CentralAtom</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3131 3118     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3132 3119   <span class="s">}</span> | 
|  | 3133 3120 | 
|  | 3134 3121   <span class="i">$NumOfNbrAtomSpecs</span> = <span class="k">defined</span> <span class="i">$NbrAtomSpecsRef</span> ? <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$NbrAtomSpecsRef</span>} <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3135 3122   <span class="i">$NumOfNbrBondSpecs</span> = <span class="k">defined</span> <span class="i">$NbrBondSpecsRef</span> ? <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$NbrBondSpecsRef</span>} <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3136 3123   <span class="i">$NumOfNbrOfNbrAtomSpecs</span> = <span class="k">defined</span> <span class="i">$NbrOfNbrAtomSpecsRef</span> ? <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$NbrOfNbrAtomSpecsRef</span>} <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3137 3124 | 
|  | 3138 3125   <span class="c"># Validate number of specifications...</span> | 
|  | 3139 3126   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfNbrBondSpecs</span> && <span class="s">(</span><span class="i">$NumOfNbrAtomSpecs</span> != <span class="i">$NumOfNbrBondSpecs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3140 3127     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DoesAtomNeighborhoodMatch: Number of specified central atom, $NumOfNbrAtomSpecs, and bond, $NumOfNbrBondSpecs, specifications must be same; No neighborhood match performed ..."</span><span class="sc">;</span> | 
|  | 3141 3128     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3142 3129   <span class="s">}</span> | 
|  | 3143 3130 | 
|  | 3144 3131   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfNbrOfNbrAtomSpecs</span> && <span class="s">(</span><span class="i">$NumOfNbrOfNbrAtomSpecs</span> != <span class="i">$NumOfNbrAtomSpecs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3145 3132     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DoesAtomNeighborhoodMatch: Number of specified central atom, $NumOfNbrAtomSpecs, and neighbor of neighbor atoms specifications, $NumOfNbrOfNbrAtomSpecs, must be same; No neighborhood match performed ..."</span><span class="sc">;</span> | 
|  | 3146 3133     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3147 3134   <span class="s">}</span> | 
|  | 3148 3135 | 
|  | 3149 3136   <span class="c"># Sort atom and bond specifications in terms of being most specific to least specific..</span> | 
|  | 3150 3137   <span class="s">(</span><span class="i">$NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">$NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpecsRef</span><span class="s">)</span> = <span class="i">$CentralAtom</span><span class="i">->_SortSpecificationsForAtomNeighborhoodMatch</span><span class="s">(</span><span class="i">$NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">$NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3151 3138 | 
|  | 3152 3139   <span class="c"># Does central atom specification match?</span> | 
|  | 3153 3140   <span class="k">if</span> <span class="s">(</span>!<span class="i">$CentralAtom</span><span class="i">->_DoesAtomSpecificationMatch</span><span class="s">(</span><span class="i">$CentralAtomSpec</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3154 3141     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3155 3142   <span class="s">}</span> | 
|  | 3156 3143 | 
|  | 3157 3144   <span class="c"># No neighbors to match...</span> | 
|  | 3158 3145   <span class="k">if</span> <span class="s">(</span>!<span class="i">$NumOfNbrAtomSpecs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3159 3146     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3160 3147   <span class="s">}</span> | 
|  | 3161 3148 | 
|  | 3162 3149   <span class="c"># Match neighbors...</span> | 
|  | 3163 3150   <span class="k">my</span><span class="s">(</span><span class="i">$NbrSpecsMatched</span><span class="cm">,</span> <span class="i">$NbrSpecCount</span><span class="cm">,</span> <span class="i">$NbrSpecMatchCount</span><span class="cm">,</span> <span class="i">%NbrSpecAlreadyMatchedMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3164 3151 | 
|  | 3165 3152   <span class="i">$NbrSpecCount</span> = <span class="i">$NumOfNbrAtomSpecs</span><span class="sc">;</span> | 
|  | 3166 3153   <span class="i">$NbrSpecMatchCount</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3167 3154 | 
|  | 3168 3155   <span class="i">%NbrSpecAlreadyMatchedMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3169 3156   <span class="s">(</span><span class="i">$NbrSpecsMatched</span><span class="cm">,</span> <span class="i">$NbrSpecMatchCount</span><span class="s">)</span> = <span class="i">$CentralAtom</span><span class="i">->_MatchAtomNeighborhoodUsingAtomBondSpecs</span><span class="s">(</span><span class="i">$NbrSpecCount</span><span class="cm">,</span> <span class="i">$NbrSpecMatchCount</span><span class="cm">,</span> \<span class="i">%NbrSpecAlreadyMatchedMap</span><span class="cm">,</span> <span class="i">$NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">$NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3170 3157 | 
|  | 3171 3158   <span class="k">if</span> <span class="s">(</span><span class="i">$NbrSpecsMatched</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3172 3159     <span class="c"># It's match...</span> | 
|  | 3173 3160     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3174 3161   <span class="s">}</span> | 
|  | 3175 3162 | 
|  | 3176 3163   <span class="c"># Match central atom's missing hydrogens with any unmatched atom</span> | 
|  | 3177 3164   <span class="c"># and bond specifications...</span> | 
|  | 3178 3165   <span class="c">#</span> | 
|  | 3179 3166   <span class="s">(</span><span class="i">$NbrSpecsMatched</span><span class="cm">,</span> <span class="i">$NbrSpecMatchCount</span><span class="s">)</span> = <span class="i">$CentralAtom</span><span class="i">->_MatchAtomNeighborhoodUsingMissingHydrogens</span><span class="s">(</span><span class="i">$NbrSpecCount</span><span class="cm">,</span> <span class="i">$NbrSpecMatchCount</span><span class="cm">,</span> \<span class="i">%NbrSpecAlreadyMatchedMap</span><span class="cm">,</span> <span class="i">$NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">$NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3180 3167 | 
|  | 3181 3168   <span class="k">if</span> <span class="s">(</span><span class="i">$NbrSpecsMatched</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3182 3169     <span class="c"># It's match...</span> | 
|  | 3183 3170     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3184 3171   <span class="s">}</span> | 
|  | 3185 3172 | 
|  | 3186 3173   <span class="c"># No match...</span> | 
|  | 3187 3174   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3188 3175 <span class="s">}</span> | 
|  | 3189 3176 | 
|  | 3190 3177 <span class="c"># Match central atom neighborhood atom and bond specifications...</span> | 
|  | 3191 3178 <span class="c">#</span> | 
|  | 3192 <a name="_MatchAtomNeighborhoodUsingAtomBondSpecs-"></a>3179 <span class="k">sub </span><span class="m">_MatchAtomNeighborhoodUsingAtomBondSpecs</span> <span class="s">{</span> | 
|  | 3193 3180   <span class="k">my</span><span class="s">(</span><span class="i">$CentralAtom</span><span class="cm">,</span> <span class="i">$NbrSpecCount</span><span class="cm">,</span> <span class="i">$NbrSpecMatchCount</span><span class="cm">,</span> <span class="i">$NbrSpecAlreadyMatchedRef</span><span class="cm">,</span> <span class="i">$NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">$NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpecsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3194 3181   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$NbrAtom</span><span class="cm">,</span> <span class="i">$NbrAtomSpec</span><span class="cm">,</span> <span class="i">$NbrBondSpec</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtom</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpec</span><span class="cm">,</span> <span class="i">$MatchNbrOfNbrAtomSpecs</span><span class="cm">,</span> <span class="i">$NbrSpecsMatched</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3195 3182 | 
|  | 3196 3183   <span class="i">$MatchNbrOfNbrAtomSpecs</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$NbrOfNbrAtomSpecsRef</span> && <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$NbrOfNbrAtomSpecsRef</span>}<span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3197 3184 | 
|  | 3198 3185   <span class="i">$NbrSpecsMatched</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3199 3186 | 
|  | 3200 3187   <span class="c"># Match central atom's  immediate neighbors atom and bond specifications...</span> | 
|  | 3201 3188   <span class="j">NBRATOM:</span>  <span class="k">for</span> <span class="i">$NbrAtom</span> <span class="s">(</span><span class="i">$CentralAtom</span><span class="i">->GetNeighbors</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3202 3189     <span class="j">NBRATOMSPEC:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NbrSpecCount</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3203 3190       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$NbrSpecAlreadyMatchedRef</span>->{<span class="i">$Index</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 3204 3191         <span class="k">next</span> <span class="j">NBRATOMSPEC</span><span class="sc">;</span> | 
|  | 3205 3192       <span class="s">}</span> | 
|  | 3206 3193       <span class="i">$NbrAtomSpec</span> = <span class="i">$NbrAtomSpecsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 3207 3194       <span class="i">$NbrBondSpec</span> = <span class="i">$NbrBondSpecsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 3208 3195 | 
|  | 3209 3196       <span class="i">$NbrOfNbrAtomSpec</span> = <span class="i">$MatchNbrOfNbrAtomSpecs</span> ? <span class="i">$NbrOfNbrAtomSpecsRef</span>->[<span class="i">$Index</span>] <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3210 3197 | 
|  | 3211 3198       <span class="c"># Match neighbor atom specification...</span> | 
|  | 3212 3199       <span class="k">if</span> <span class="s">(</span>!<span class="i">$NbrAtom</span><span class="i">->_DoesAtomSpecificationMatch</span><span class="s">(</span><span class="i">$NbrAtomSpec</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3213 3200         <span class="k">next</span> <span class="j">NBRATOMSPEC</span><span class="sc">;</span> | 
|  | 3214 3201       <span class="s">}</span> | 
|  | 3215 3202 | 
|  | 3216 3203       <span class="c"># Match central atom to neighbor atom bond specification...</span> | 
|  | 3217 3204       <span class="k">if</span> <span class="s">(</span>!<span class="i">$CentralAtom</span><span class="i">->_DoesBondSpecificationMatch</span><span class="s">(</span><span class="i">$NbrAtom</span><span class="cm">,</span> <span class="i">$NbrBondSpec</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3218 3205         <span class="k">next</span> <span class="j">NBRATOMSPEC</span><span class="sc">;</span> | 
|  | 3219 3206       <span class="s">}</span> | 
|  | 3220 3207 | 
|  | 3221 3208       <span class="c"># Match any neighbor of neighbor atom specifications...</span> | 
|  | 3222 3209       <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$NbrOfNbrAtomSpec</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3223 3210         <span class="c"># Go over the neighbors of central atom skipping the central atom...</span> | 
|  | 3224 3211         <span class="k">for</span> <span class="i">$NbrOfNbrAtom</span> <span class="s">(</span><span class="i">$NbrAtom</span><span class="i">->GetNeighbors</span><span class="s">(</span><span class="i">$CentralAtom</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3225 3212           <span class="k">if</span> <span class="s">(</span>!<span class="i">$NbrOfNbrAtom</span><span class="i">->_DoesAtomSpecificationMatch</span><span class="s">(</span><span class="i">$NbrOfNbrAtomSpec</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3226 3213             <span class="k">next</span> <span class="j">NBRATOMSPEC</span><span class="sc">;</span> | 
|  | 3227 3214           <span class="s">}</span> | 
|  | 3228 3215         <span class="s">}</span> | 
|  | 3229 3216       <span class="s">}</span> | 
|  | 3230 3217 | 
|  | 3231 3218       <span class="c"># It's a match for a neighbor atom specification...</span> | 
|  | 3232 3219       <span class="i">$NbrSpecAlreadyMatchedRef</span>->{<span class="i">$Index</span>} = <span class="i">$Index</span><span class="sc">;</span> | 
|  | 3233 3220       <span class="i">$NbrSpecMatchCount</span>++<span class="sc">;</span> | 
|  | 3234 3221 | 
|  | 3235 3222       <span class="k">if</span> <span class="s">(</span><span class="i">$NbrSpecMatchCount</span> == <span class="i">$NbrSpecCount</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3236 3223         <span class="c"># It's match...</span> | 
|  | 3237 3224         <span class="i">$NbrSpecsMatched</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3238 3225         <span class="k">last</span> <span class="j">NBRATOM</span><span class="sc">;</span> | 
|  | 3239 3226       <span class="s">}</span> | 
|  | 3240 3227       <span class="c"># Match next neighbor atom...</span> | 
|  | 3241 3228       <span class="k">next</span> <span class="j">NBRATOM</span><span class="sc">;</span> | 
|  | 3242 3229     <span class="s">}</span> | 
|  | 3243 3230   <span class="s">}</span> | 
|  | 3244 3231   <span class="k">return</span> <span class="s">(</span><span class="i">$NbrSpecsMatched</span><span class="cm">,</span> <span class="i">$NbrSpecMatchCount</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3245 3232 <span class="s">}</span> | 
|  | 3246 3233 | 
|  | 3247 3234 <span class="c"># Match central atom's missing hydrogens with any unmatched atom and bond</span> | 
|  | 3248 3235 <span class="c"># specifications...</span> | 
|  | 3249 3236 <span class="c">#</span> | 
|  | 3250 <a name="_MatchAtomNeighborhoodUsingMissingHydrogens-"></a>3237 <span class="k">sub </span><span class="m">_MatchAtomNeighborhoodUsingMissingHydrogens</span> <span class="s">{</span> | 
|  | 3251 3238   <span class="k">my</span><span class="s">(</span><span class="i">$CentralAtom</span><span class="cm">,</span> <span class="i">$NbrSpecCount</span><span class="cm">,</span> <span class="i">$NbrSpecMatchCount</span><span class="cm">,</span> <span class="i">$NbrSpecAlreadyMatchedRef</span><span class="cm">,</span> <span class="i">$NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">$NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpecsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3252 3239   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$NbrAtom</span><span class="cm">,</span> <span class="i">$NbrAtomSpec</span><span class="cm">,</span> <span class="i">$NbrBondSpec</span><span class="cm">,</span> <span class="i">$NumOfMissingHydrogens</span><span class="cm">,</span> <span class="i">$MissingHydrogensIndex</span><span class="cm">,</span> <span class="i">$NbrSpecsMatched</span><span class="cm">,</span> <span class="i">$AtomSpecMatched</span><span class="cm">,</span> <span class="i">$AtomSpec</span><span class="cm">,</span> <span class="i">$AtomSymbol</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3253 3240 | 
|  | 3254 3241   <span class="i">$NbrSpecsMatched</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3255 3242 | 
|  | 3256 3243   <span class="i">$NumOfMissingHydrogens</span> = <span class="i">$CentralAtom</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3257 3244   <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">$NbrSpecCount</span> - <span class="i">$NbrSpecMatchCount</span><span class="s">)</span> > <span class="i">$NumOfMissingHydrogens</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3258 3245     <span class="c"># It won't match...</span> | 
|  | 3259 3246     <span class="k">return</span> <span class="s">(</span><span class="i">$NbrSpecsMatched</span><span class="cm">,</span> <span class="i">$NbrSpecMatchCount</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3260 3247   <span class="s">}</span> | 
|  | 3261 3248 | 
|  | 3262 3249   <span class="j">MISSINGHYDROGENNBR:</span> <span class="k">for</span> <span class="i">$MissingHydrogensIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfMissingHydrogens</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3263 3250     <span class="j">NBRATOMSPEC:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NbrSpecCount</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3264 3251       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$NbrSpecAlreadyMatchedRef</span>->{<span class="i">$Index</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 3265 3252         <span class="k">next</span> <span class="j">NBRATOMSPEC</span><span class="sc">;</span> | 
|  | 3266 3253       <span class="s">}</span> | 
|  | 3267 3254       <span class="i">$NbrAtomSpec</span> = <span class="i">$NbrAtomSpecsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 3268 3255       <span class="i">$NbrBondSpec</span> = <span class="i">$NbrBondSpecsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 3269 3256 | 
|  | 3270 3257       <span class="i">$NbrAtomSpec</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 3271 3258 | 
|  | 3272 3259       <span class="c"># Match neighbor atom specification hydrogen atom symbol...</span> | 
|  | 3273 3260       <span class="i">$AtomSpecMatched</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3274 3261       <span class="j">ATOMSPEC:</span> <span class="k">for</span> <span class="i">$AtomSpec</span> <span class="s">(</span><span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$NbrAtomSpec</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3275 3262         <span class="s">(</span><span class="i">$AtomSymbol</span><span class="s">)</span> = <span class="k">split</span> <span class="q">/\./</span><span class="cm">,</span> <span class="i">$AtomSpec</span><span class="sc">;</span> | 
|  | 3276 3263         <span class="k">if</span> <span class="s">(</span><span class="i">$AtomSymbol</span> =~ <span class="q">/^(H|A|\*)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3277 3264           <span class="i">$AtomSpecMatched</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3278 3265           <span class="k">last</span> <span class="j">ATOMSPEC</span><span class="sc">;</span> | 
|  | 3279 3266         <span class="s">}</span> | 
|  | 3280 3267       <span class="s">}</span> | 
|  | 3281 3268       <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomSpecMatched</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3282 3269         <span class="k">next</span> <span class="j">NBRATOMSPEC</span><span class="sc">;</span> | 
|  | 3283 3270       <span class="s">}</span> | 
|  | 3284 3271 | 
|  | 3285 3272       <span class="c"># Match neighbor atom bond specification to singal bond...</span> | 
|  | 3286 3273       <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$NbrBondSpec</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3287 3274         <span class="i">$NbrBondSpec</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 3288 3275         <span class="k">if</span> <span class="s">(</span><span class="i">$NbrBondSpec</span> !~ <span class="q">/^(-|1|s|Single|\~|\*|Any)/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3289 3276           <span class="k">next</span> <span class="j">NBRATOMSPEC</span><span class="sc">;</span> | 
|  | 3290 3277         <span class="s">}</span> | 
|  | 3291 3278       <span class="s">}</span> | 
|  | 3292 3279 | 
|  | 3293 3280       <span class="c"># It's a match for a neighbor atom specification...</span> | 
|  | 3294 3281       <span class="i">$NbrSpecAlreadyMatchedRef</span>->{<span class="i">$Index</span>} = <span class="i">$Index</span><span class="sc">;</span> | 
|  | 3295 3282       <span class="i">$NbrSpecMatchCount</span>++<span class="sc">;</span> | 
|  | 3296 3283 | 
|  | 3297 3284       <span class="k">if</span> <span class="s">(</span><span class="i">$NbrSpecMatchCount</span> == <span class="i">$NbrSpecCount</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3298 3285         <span class="c"># It's match...</span> | 
|  | 3299 3286         <span class="i">$NbrSpecsMatched</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3300 3287         <span class="k">last</span> <span class="j">MISSINGHYDROGENNBR</span><span class="sc">;</span> | 
|  | 3301 3288       <span class="s">}</span> | 
|  | 3302 3289       <span class="c"># Match next missing hydrogen neighbor...</span> | 
|  | 3303 3290       <span class="k">next</span> <span class="j">MISSINGHYDROGENNBR</span><span class="sc">;</span> | 
|  | 3304 3291     <span class="s">}</span> | 
|  | 3305 3292   <span class="s">}</span> | 
|  | 3306 3293 | 
|  | 3307 3294   <span class="k">return</span> <span class="s">(</span><span class="i">$NbrSpecsMatched</span><span class="cm">,</span> <span class="i">$NbrSpecMatchCount</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3308 3295 <span class="s">}</span> | 
|  | 3309 3296 | 
|  | 3310 3297 <span class="c"># Sort atom and bond specifications base on neighbor atom specifications going</span> | 
|  | 3311 3298 <span class="c"># from most to least specific atom specifications.</span> | 
|  | 3312 3299 <span class="c">#</span> | 
|  | 3313 3300 <span class="c"># Atom specifications are sorted at the following two levels:</span> | 
|  | 3314 3301 <span class="c">#</span> | 
|  | 3315 3302 <span class="c">#   o By atom specification count with in each specification going from most specific</span> | 
|  | 3316 3303 <span class="c">#      to least specific, where count is determined by the number of "," in each</span> | 
|  | 3317 3304 <span class="c">#      specification. Wild card containing specifications are considered least specific</span> | 
|  | 3318 3305 <span class="c">#      and end up at the end of the sorted list.</span> | 
|  | 3319 3306 <span class="c">#   o By atomic invariant count with in each sorted list going from most specific to</span> | 
|  | 3320 3307 <span class="c">#      least specific, where count is determined by the number of "." in each atom</span> | 
|  | 3321 3308 <span class="c">#      specification.</span> | 
|  | 3322 3309 <span class="c">#</span> | 
|  | 3323 3310 <span class="c">#A single atom specification,</span> | 
|  | 3324 3311 <span class="c"># without any commas in atom specification, is is considered most specific...</span> | 
|  | 3325 3312 <span class="c">#</span> | 
|  | 3326 <a name="_SortSpecificationsForAtomNeighborhoodMatch-"></a>3313 <span class="k">sub </span><span class="m">_SortSpecificationsForAtomNeighborhoodMatch</span> <span class="s">{</span> | 
|  | 3327 3314   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">$NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpecsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3328 3315   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$NeedToSort</span><span class="cm">,</span> <span class="i">$NumOfNbrAtomSpecs</span><span class="cm">,</span> <span class="i">$NbrAtomSpecCount</span><span class="cm">,</span>  <span class="i">$NbrAtomSpecAtomicInvarintCount</span><span class="cm">,</span> <span class="i">$NbrAtomSpecToMatch</span><span class="cm">,</span> <span class="i">$NbrAtomSpec</span><span class="cm">,</span> <span class="i">$FirstAtomicInvariant</span><span class="cm">,</span> <span class="i">$WildCardInNbrAtomSpec</span><span class="cm">,</span> <span class="i">@NbrAtomSpecs</span><span class="cm">,</span> <span class="i">@NbrAtomSpecAtomicInvariants</span><span class="cm">,</span> <span class="i">@SortedNbrAtomSpecs</span><span class="cm">,</span> <span class="i">@SortedNbrBondSpecs</span><span class="cm">,</span> <span class="i">@SortedNbrOfNbrAtomSpecs</span><span class="cm">,</span> <span class="i">%NbrAtomSpecDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3329 3316 | 
|  | 3330 3317   <span class="i">$NumOfNbrAtomSpecs</span> = <span class="k">defined</span> <span class="i">$NbrAtomSpecsRef</span> ? <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$NbrAtomSpecsRef</span>} <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3331 3318 | 
|  | 3332 3319   <span class="c"># Figure out whether sorting is necessary...</span> | 
|  | 3333 3320   <span class="i">$NeedToSort</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3334 3321   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfNbrAtomSpecs</span> > <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3335 3322     <span class="j">ATOMSPEC:</span> <span class="k">for</span> <span class="i">$NbrAtomSpecToMatch</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$NbrAtomSpecsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 3336 3323       <span class="k">if</span> <span class="s">(</span><span class="i">$NbrAtomSpecToMatch</span> =~ <span class="q">/(,|\.|A|\*)/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3337 3324         <span class="i">$NeedToSort</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3338 3325         <span class="k">last</span> <span class="j">ATOMSPEC</span><span class="sc">;</span> | 
|  | 3339 3326       <span class="s">}</span> | 
|  | 3340 3327     <span class="s">}</span> | 
|  | 3341 3328   <span class="s">}</span> | 
|  | 3342 3329   <span class="k">if</span> <span class="s">(</span>!<span class="i">$NeedToSort</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3343 3330     <span class="c"># Nothing to do...</span> | 
|  | 3344 3331     <span class="k">return</span> <span class="s">(</span><span class="i">$NbrAtomSpecsRef</span><span class="cm">,</span> <span class="i">$NbrBondSpecsRef</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpecsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3345 3332   <span class="s">}</span> | 
|  | 3346 3333 | 
|  | 3347 3334   <span class="i">%NbrAtomSpecDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3348 3335 | 
|  | 3349 3336   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfNbrAtomSpecs</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3350 3337     <span class="i">$NbrAtomSpecToMatch</span> = <span class="i">$NbrAtomSpecsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 3351 3338     <span class="i">$NbrAtomSpecToMatch</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 3352 3339 | 
|  | 3353 3340     <span class="i">@NbrAtomSpecs</span> = <span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$NbrAtomSpecToMatch</span><span class="sc">;</span> | 
|  | 3354 3341     <span class="i">$NbrAtomSpecCount</span> = <span class="k">scalar</span> <span class="i">@NbrAtomSpecs</span><span class="sc">;</span> | 
|  | 3355 3342 | 
|  | 3356 3343     <span class="c"># Does neighbor specification contains a wild card in atom symbol specification?</span> | 
|  | 3357 3344     <span class="c">#</span> | 
|  | 3358 3345     <span class="k">if</span> <span class="s">(</span><span class="i">$NbrAtomSpecToMatch</span> =~ <span class="q">/(A|\*)/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3359 3346       <span class="i">$WildCardInNbrAtomSpec</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3360 3347       <span class="j">NBRATOMSPEC:</span> <span class="k">for</span> <span class="i">$NbrAtomSpec</span> <span class="s">(</span><span class="i">@NbrAtomSpecs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3361 3348         <span class="s">(</span><span class="i">$FirstAtomicInvariant</span><span class="s">)</span> = <span class="k">split</span> <span class="q">/\./</span><span class="cm">,</span> <span class="i">$NbrAtomSpec</span><span class="sc">;</span> | 
|  | 3362 3349         <span class="k">if</span> <span class="s">(</span><span class="i">$FirstAtomicInvariant</span> =~ <span class="q">/^!/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3363 3350           <span class="i">$FirstAtomicInvariant</span> =~ <span class="q">s/^!//</span><span class="sc">;</span> | 
|  | 3364 3351         <span class="s">}</span> | 
|  | 3365 3352         <span class="i">$WildCardInNbrAtomSpec</span> = <span class="i">$This</span><span class="i">->_IsWildCardAtomSymbolAtomicInvariant</span><span class="s">(</span><span class="i">$FirstAtomicInvariant</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3366 3353         <span class="k">if</span> <span class="s">(</span><span class="i">$WildCardInNbrAtomSpec</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3367 3354           <span class="k">last</span> <span class="j">NBRATOMSPEC</span><span class="sc">;</span> | 
|  | 3368 3355         <span class="s">}</span> | 
|  | 3369 3356       <span class="s">}</span> | 
|  | 3370 3357       <span class="k">if</span> <span class="s">(</span><span class="i">$WildCardInNbrAtomSpec</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3371 3358         <span class="c"># Set NbrAtomSpecCount arbitrarily high to make the spec containing wild</span> | 
|  | 3372 3359         <span class="c"># card last on the sorted list while maintaining its original order in the list...</span> | 
|  | 3373 3360         <span class="i">$NbrAtomSpecCount</span> = <span class="n">999</span><span class="sc">;</span> | 
|  | 3374 3361       <span class="s">}</span> | 
|  | 3375 3362     <span class="s">}</span> | 
|  | 3376 3363 | 
|  | 3377 3364     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$NbrAtomSpecDataMap</span>{<span class="i">$NbrAtomSpecCount</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 3378 3365       <span class="i">%</span>{<span class="i">$NbrAtomSpecDataMap</span>{<span class="i">$NbrAtomSpecCount</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3379 3366     <span class="s">}</span> | 
|  | 3380 3367 | 
|  | 3381 3368     <span class="c"># Use first NbrAtomSpec available in @NbrAtomSpecs to determine atomic invariant count</span> | 
|  | 3382 3369     <span class="c"># with in each NbrAtomSpecToMatch, as @NbrAtomSpecs derived from $NbrAtomSpecToMatch</span> | 
|  | 3383 3370     <span class="c"># simply corresponds to a list of possible matches...</span> | 
|  | 3384 3371     <span class="c">#</span> | 
|  | 3385 3372     <span class="s">(</span><span class="i">$NbrAtomSpec</span><span class="s">)</span> = <span class="i">@NbrAtomSpecs</span><span class="sc">;</span> | 
|  | 3386 3373     <span class="i">@NbrAtomSpecAtomicInvariants</span> = <span class="k">split</span> <span class="q">/\./</span><span class="cm">,</span> <span class="i">$NbrAtomSpec</span><span class="sc">;</span> | 
|  | 3387 3374     <span class="i">$NbrAtomSpecAtomicInvarintCount</span> = <span class="k">scalar</span> <span class="i">@NbrAtomSpecAtomicInvariants</span><span class="sc">;</span> | 
|  | 3388 3375 | 
|  | 3389 3376     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$NbrAtomSpecDataMap</span>{<span class="i">$NbrAtomSpecCount</span>}{<span class="i">$NbrAtomSpecAtomicInvarintCount</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 3390 3377       <span class="i">@</span>{<span class="i">$NbrAtomSpecDataMap</span>{<span class="i">$NbrAtomSpecCount</span>}{<span class="i">$NbrAtomSpecAtomicInvarintCount</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3391 3378     <span class="s">}</span> | 
|  | 3392 3379     <span class="k">push</span> <span class="i">@</span>{<span class="i">$NbrAtomSpecDataMap</span>{<span class="i">$NbrAtomSpecCount</span>}{<span class="i">$NbrAtomSpecAtomicInvarintCount</span>}}<span class="cm">,</span> <span class="i">$Index</span><span class="sc">;</span> | 
|  | 3393 3380 | 
|  | 3394 3381   <span class="s">}</span> | 
|  | 3395 3382 | 
|  | 3396 3383   <span class="i">@SortedNbrAtomSpecs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@SortedNbrBondSpecs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3397 3384   <span class="i">@SortedNbrOfNbrAtomSpecs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3398 3385 | 
|  | 3399 3386   <span class="k">for</span> <span class="i">$NbrAtomSpecCount</span> <span class="s">(</span> <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> <=> <span class="i">$b</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%NbrAtomSpecDataMap</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3400 3387     <span class="k">for</span> <span class="i">$NbrAtomSpecAtomicInvarintCount</span> <span class="s">(</span> <span class="k">sort</span> <span class="s">{</span> <span class="i">$b</span> <=> <span class="i">$a</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$NbrAtomSpecDataMap</span>{<span class="i">$NbrAtomSpecCount</span>}}<span class="s">)</span> <span class="s">{</span> | 
|  | 3401 3388       <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$NbrAtomSpecDataMap</span>{<span class="i">$NbrAtomSpecCount</span>}{<span class="i">$NbrAtomSpecAtomicInvarintCount</span>}}<span class="s">)</span> <span class="s">{</span> | 
|  | 3402 3389         <span class="k">push</span> <span class="i">@SortedNbrAtomSpecs</span><span class="cm">,</span> <span class="i">$NbrAtomSpecsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 3403 3390         <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$NbrBondSpecsRef</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3404 3391           <span class="k">push</span> <span class="i">@SortedNbrBondSpecs</span><span class="cm">,</span> <span class="i">$NbrBondSpecsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 3405 3392         <span class="s">}</span> | 
|  | 3406 3393         <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$NbrOfNbrAtomSpecsRef</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3407 3394           <span class="k">push</span> <span class="i">@SortedNbrOfNbrAtomSpecs</span><span class="cm">,</span> <span class="i">$NbrOfNbrAtomSpecsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 3408 3395         <span class="s">}</span> | 
|  | 3409 3396       <span class="s">}</span> | 
|  | 3410 3397     <span class="s">}</span> | 
|  | 3411 3398   <span class="s">}</span> | 
|  | 3412 3399 | 
|  | 3413 3400   <span class="k">return</span> <span class="s">(</span>\<span class="i">@SortedNbrAtomSpecs</span><span class="cm">,</span> <span class="k">defined</span> <span class="i">$NbrBondSpecsRef</span> ? \<span class="i">@SortedNbrBondSpecs</span> <span class="co">:</span> <span class="k">undef</span><span class="cm">,</span> <span class="k">defined</span> <span class="i">$NbrOfNbrAtomSpecsRef</span> ? \<span class="i">@SortedNbrOfNbrAtomSpecs</span> <span class="co">:</span> <span class="k">undef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3414 3401 <span class="s">}</span> | 
|  | 3415 3402 | 
|  | 3416 3403 <span class="c"># Check whether atom matches supported atom specification...</span> | 
|  | 3417 3404 <span class="c">#</span> | 
|  | 3418 <a name="_DoesAtomSpecificationMatch-"></a>3405 <span class="k">sub </span><span class="m">_DoesAtomSpecificationMatch</span> <span class="s">{</span> | 
|  | 3419 3406   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomSpecificationToMatch</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3420 3407   <span class="k">my</span><span class="s">(</span><span class="i">$AtomSpecification</span><span class="cm">,</span> <span class="i">$AtomicInvariant</span><span class="cm">,</span> <span class="i">$AtomSpecificationMatched</span><span class="cm">,</span> <span class="i">$AtomicInvariantMatched</span><span class="cm">,</span> <span class="i">$FirstMatch</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3421 3408 | 
|  | 3422 3409   <span class="c"># Anything to match...</span> | 
|  | 3423 3410   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$AtomSpecificationToMatch</span><span class="s">)</span> && <span class="i">$AtomSpecificationToMatch</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3424 3411     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3425 3412   <span class="s">}</span> | 
|  | 3426 3413 | 
|  | 3427 3414   <span class="c"># Take out any spaces...</span> | 
|  | 3428 3415   <span class="i">$AtomSpecificationToMatch</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 3429 3416 | 
|  | 3430 3417   <span class="c"># Match specified atom specifications. For multiple atom specifications in a comma delimited string,</span> | 
|  | 3431 3418   <span class="c"># only one atom specification needs to match for a successful match. It's up to the caller to make</span> | 
|  | 3432 3419   <span class="c"># sure that the specificaton list is ordered from least to most specific atom specification...</span> | 
|  | 3433 3420   <span class="c">#</span> | 
|  | 3434 3421   <span class="k">for</span> <span class="i">$AtomSpecification</span> <span class="s">(</span><span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$AtomSpecificationToMatch</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3435 3422     <span class="i">$AtomSpecificationMatched</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3436 3423     <span class="i">$FirstMatch</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3437 3424 | 
|  | 3438 3425     <span class="c"># Match all atom symbol atomic invariants...</span> | 
|  | 3439 3426     <span class="j">ATOMICINVARIANT:</span> <span class="k">for</span> <span class="i">$AtomicInvariant</span> <span class="s">(</span><span class="k">split</span> <span class="q">/\./</span><span class="cm">,</span> <span class="i">$AtomSpecification</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3440 3427       <span class="k">if</span> <span class="s">(</span><span class="i">$FirstMatch</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3441 3428         <span class="c"># Match atom symbol atomic invariant...</span> | 
|  | 3442 3429         <span class="i">$FirstMatch</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3443 3430         <span class="i">$AtomicInvariantMatched</span> = <span class="i">$This</span><span class="i">->_MatchAtomSymbolAtomicInvariant</span><span class="s">(</span><span class="i">$AtomicInvariant</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3444 3431       <span class="s">}</span> | 
|  | 3445 3432       <span class="k">else</span> <span class="s">{</span> | 
|  | 3446 3433         <span class="c"># Match non atom symbol atomic invariant...</span> | 
|  | 3447 3434         <span class="i">$AtomicInvariantMatched</span> = <span class="i">$This</span><span class="i">->_MatchNonAtomSymbolAtomicInvariant</span><span class="s">(</span><span class="i">$AtomicInvariant</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3448 3435       <span class="s">}</span> | 
|  | 3449 3436 | 
|  | 3450 3437       <span class="k">if</span> <span class="s">(</span>!<span class="i">$AtomicInvariantMatched</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3451 3438         <span class="c"># No need to match other atomic invariants...</span> | 
|  | 3452 3439         <span class="i">$AtomSpecificationMatched</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3453 3440         <span class="k">last</span> <span class="j">ATOMICINVARIANT</span><span class="sc">;</span> | 
|  | 3454 3441       <span class="s">}</span> | 
|  | 3455 3442     <span class="s">}</span> | 
|  | 3456 3443 | 
|  | 3457 3444     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomSpecificationMatched</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3458 3445       <span class="c"># No need to match other atom specifications...</span> | 
|  | 3459 3446       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3460 3447     <span class="s">}</span> | 
|  | 3461 3448   <span class="s">}</span> | 
|  | 3462 3449 | 
|  | 3463 3450   <span class="c"># Nothing matched...</span> | 
|  | 3464 3451   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3465 3452 <span class="s">}</span> | 
|  | 3466 3453 | 
|  | 3467 3454 <span class="c"># Check whether atom matches atom symbol atomic invariant...</span> | 
|  | 3468 3455 <span class="c">#</span> | 
|  | 3469 <a name="_MatchAtomSymbolAtomicInvariant-"></a>3456 <span class="k">sub </span><span class="m">_MatchAtomSymbolAtomicInvariant</span> <span class="s">{</span> | 
|  | 3470 3457   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomicInvariant</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3471 3458   <span class="k">my</span><span class="s">(</span><span class="i">$NegateMatch</span><span class="cm">,</span> <span class="i">$Status</span><span class="cm">,</span> <span class="i">$AtomicNumber</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3472 3459 | 
|  | 3473 3460   <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3474 3461   <span class="i">$NegateMatch</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3475 3462 | 
|  | 3476 3463   <span class="c"># Does match needs to be negated?</span> | 
|  | 3477 3464   <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^!/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3478 3465     <span class="i">$NegateMatch</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3479 3466     <span class="i">$AtomicInvariant</span> =~ <span class="q">s/^!//</span><span class="sc">;</span> | 
|  | 3480 3467   <span class="s">}</span> | 
|  | 3481 3468 | 
|  | 3482 3469   <span class="j">ATOMICINVARIANT:</span> <span class="s">{</span> | 
|  | 3483 3470     <span class="c"># Any atom match...</span> | 
|  | 3484 3471     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->_IsWildCardAtomSymbolAtomicInvariant</span><span class="s">(</span><span class="i">$AtomicInvariant</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3485 3472       <span class="i">$Status</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3486 3473       <span class="k">last</span> <span class="j">ATOMICINVARIANT</span><span class="sc">;</span> | 
|  | 3487 3474     <span class="s">}</span> | 
|  | 3488 3475 | 
|  | 3489 3476     <span class="c"># Atomic number match...</span> | 
|  | 3490 3477     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^#/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3491 3478       <span class="i">$AtomicNumber</span> = <span class="i">$AtomicInvariant</span><span class="sc">;</span> <span class="i">$AtomicNumber</span> =~ <span class="q">s/^#//</span><span class="sc">;</span> | 
|  | 3492 3479       <span class="i">$Status</span> = <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomicNumber</span>} == <span class="i">$AtomicNumber</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3493 3480       <span class="k">last</span> <span class="j">ATOMICINVARIANT</span><span class="sc">;</span> | 
|  | 3494 3481     <span class="s">}</span> | 
|  | 3495 3482 | 
|  | 3496 3483     <span class="c"># Atom symbol match...</span> | 
|  | 3497 3484     <span class="i">$Status</span> = <span class="s">(</span><span class="i">$This</span>->{<span class="w">AtomSymbol</span>} =~ <span class="q">/^$AtomicInvariant$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3498 3485   <span class="s">}</span> | 
|  | 3499 3486 | 
|  | 3500 3487   <span class="k">if</span> <span class="s">(</span><span class="i">$NegateMatch</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3501 3488     <span class="i">$Status</span> = <span class="i">$Status</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3502 3489   <span class="s">}</span> | 
|  | 3503 3490 | 
|  | 3504 3491   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 3505 3492 <span class="s">}</span> | 
|  | 3506 3493 | 
|  | 3507 3494 <span class="c"># Is it a wild card atom symbol atomic invariant?</span> | 
|  | 3508 3495 <span class="c">#</span> | 
|  | 3509 <a name="_IsWildCardAtomSymbolAtomicInvariant-"></a>3496 <span class="k">sub </span><span class="m">_IsWildCardAtomSymbolAtomicInvariant</span> <span class="s">{</span> | 
|  | 3510 3497   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomicInvariant</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3511 3498 | 
|  | 3512 3499   <span class="k">return</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^(A|\*)$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3513 3500 <span class="s">}</span> | 
|  | 3514 3501 | 
|  | 3515 3502 <span class="c"># Check whether atom matches non atom symbol atomic invariants...</span> | 
|  | 3516 3503 <span class="c">#</span> | 
|  | 3517 <a name="_MatchNonAtomSymbolAtomicInvariant-"></a>3504 <span class="k">sub </span><span class="m">_MatchNonAtomSymbolAtomicInvariant</span> <span class="s">{</span> | 
|  | 3518 3505   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomicInvariant</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3519 3506   <span class="k">my</span><span class="s">(</span><span class="i">$NegateMatch</span><span class="cm">,</span> <span class="i">$Status</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$UnknownName</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3520 3507 | 
|  | 3521 3508   <span class="s">(</span><span class="i">$Status</span><span class="cm">,</span> <span class="i">$NegateMatch</span><span class="cm">,</span> <span class="i">$UnknownName</span><span class="s">)</span> = <span class="s">(</span><span class="q">'0'</span><span class="s">)</span> x <span class="n">3</span><span class="sc">;</span> | 
|  | 3522 3509 | 
|  | 3523 3510   <span class="c"># Does match needs to be negated?</span> | 
|  | 3524 3511   <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/^!/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3525 3512     <span class="i">$NegateMatch</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3526 3513     <span class="i">$AtomicInvariant</span> =~ <span class="q">s/^!//</span><span class="sc">;</span> | 
|  | 3527 3514   <span class="s">}</span> | 
|  | 3528 3515 | 
|  | 3529 3516   <span class="c"># Extract atomic invariant name and any value...</span> | 
|  | 3530 3517   <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicInvariant</span> =~ <span class="q">/[0-9\*]+/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3531 3518     <span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">$AtomicInvariant</span> =~ <span class="q">/^([a-zA-Z]+)([0-9\-\+\*\>\<\=]+)$/</span><span class="sc">;</span> | 
|  | 3532 3519   <span class="s">}</span> | 
|  | 3533 3520   <span class="k">else</span> <span class="s">{</span> | 
|  | 3534 3521     <span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="s">(</span><span class="i">$AtomicInvariant</span><span class="cm">,</span> <span class="k">undef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3535 3522   <span class="s">}</span> | 
|  | 3536 3523 | 
|  | 3537 3524   <span class="j">NAME:</span> <span class="s">{</span> | 
|  | 3538 3525     <span class="c"># Match number of non-hydrogen atom neighbors</span> | 
|  | 3539 3526     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^X$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3540 3527       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->GetNumOfNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3541 3528       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3542 3529     <span class="s">}</span> | 
|  | 3543 3530 | 
|  | 3544 3531     <span class="c"># Match total number of atom neighbors including missing hydrogens...</span> | 
|  | 3545 3532     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^T$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3546 3533       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="s">(</span><span class="i">$This</span><span class="i">->GetNumOfNonHydrogenAtomNeighbors</span><span class="s">(</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->GetNumOfHydrogens</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3547 3534       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3548 3535     <span class="s">}</span> | 
|  | 3549 3536 | 
|  | 3550 3537     <span class="c"># Match formal charge...</span> | 
|  | 3551 3538     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^FC$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3552 3539       <span class="k">my</span> <span class="i">$FormalCharge</span> = <span class="i">$This</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3553 3540       <span class="i">$Status</span> = <span class="i">$This</span><span class="i">->_MatchNonAtomSymbolAtomicInvariantValue</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3554 3541       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3555 3542     <span class="s">}</span> | 
|  | 3556 3543 | 
|  | 3557 3544     <span class="c"># Match aromatic annotation indicating whether atom is aromatic...</span> | 
|  | 3558 3545     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^Ar$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3559 3546       <span class="i">$Status</span> = <span class="i">$This</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3560 3547       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3561 3548     <span class="s">}</span> | 
|  | 3562 3549 | 
|  | 3563 3550     <span class="c"># Match number of implicit and explicit hydrogens...</span> | 
|  | 3564 3551     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^H$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3565 3552       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="s">(</span><span class="i">$This</span><span class="i">->GetNumOfHydrogens</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3566 3553       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3567 3554     <span class="s">}</span> | 
|  | 3568 3555 | 
|  | 3569 3556     <span class="c"># Match ring atom annotation indicating whether atom is in ring...</span> | 
|  | 3570 3557     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^RA$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3571 3558       <span class="i">$Status</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> ? <span class="i">$This</span><span class="i">->IsInRingOfSize</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> <span class="co">:</span> <span class="s">(</span><span class="i">$This</span><span class="i">->IsInRing</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3572 3559       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3573 3560     <span class="s">}</span> | 
|  | 3574 3561 | 
|  | 3575 3562     <span class="c"># Match number of rings for atom..</span> | 
|  | 3576 3563     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^TR$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3577 3564       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="s">(</span><span class="i">$Value</span> == <span class="i">$This</span><span class="i">->GetNumOfRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3578 3565       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3579 3566     <span class="s">}</span> | 
|  | 3580 3567 | 
|  | 3581 3568     <span class="c"># Match sum of bond orders to non-hydrogen atom neighbors...</span> | 
|  | 3582 3569     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^BO$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3583 3570       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->GetSumOfBondOrdersToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3584 3571       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3585 3572     <span class="s">}</span> | 
|  | 3586 3573 | 
|  | 3587 3574     <span class="c"># Match largest bond order of non-hydrogen atom neighbors...</span> | 
|  | 3588 3575     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^LBO$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3589 3576       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->GetLargestBondOrderToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3590 3577       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3591 3578     <span class="s">}</span> | 
|  | 3592 3579 | 
|  | 3593 3580     <span class="c"># Match number of single bonds to non-hydrogen atom neighbors...</span> | 
|  | 3594 3581     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^SB$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3595 3582       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->GetNumOfSingleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3596 3583       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3597 3584     <span class="s">}</span> | 
|  | 3598 3585 | 
|  | 3599 3586     <span class="c"># Match total number of single bonds to atom neighbors including missing and explicit hydrogens...</span> | 
|  | 3600 3587     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^TSB$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3601 3588       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="s">(</span><span class="i">$This</span><span class="i">->GetNumOfSingleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->GetNumOfHydrogens</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3602 3589       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3603 3590     <span class="s">}</span> | 
|  | 3604 3591 | 
|  | 3605 3592     <span class="c"># Match number of double bonds to non-hydrogen atom neighbors...</span> | 
|  | 3606 3593     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^DB$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3607 3594       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->GetNumOfDoubleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3608 3595       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3609 3596     <span class="s">}</span> | 
|  | 3610 3597 | 
|  | 3611 3598     <span class="c"># Match number of triple bonds to non-hydrogen atom neighbors...</span> | 
|  | 3612 3599     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^TB$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3613 3600       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->GetNumOfTripleBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3614 3601       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3615 3602     <span class="s">}</span> | 
|  | 3616 3603 | 
|  | 3617 3604     <span class="c"># Match number of aromatic bonds to non-hydrogen atom neighbors...</span> | 
|  | 3618 3605     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^AB$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3619 3606       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->GetNumOfAromaticBondsToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3620 3607       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3621 3608     <span class="s">}</span> | 
|  | 3622 3609 | 
|  | 3623 3610 | 
|  | 3624 3611     <span class="c"># Match mass number indicating isotope other than most abundant isotope...</span> | 
|  | 3625 3612     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^MN$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3626 3613       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->GetMassNumber</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Value</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3627 3614       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3628 3615     <span class="s">}</span> | 
|  | 3629 3616 | 
|  | 3630 3617     <span class="c"># Match spin multiplicity...</span> | 
|  | 3631 3618     <span class="k">if</span> <span class="s">(</span><span class="i">$Name</span> =~ <span class="q">/^SM$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3632 3619       <span class="k">my</span> <span class="i">$SpinMultiplicity</span> = <span class="i">$This</span><span class="i">->GetSpinMultiplicity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3633 3620       <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$SpinMultiplicity</span><span class="s">)</span> <span class="s">{</span> <span class="i">$SpinMultiplicity</span> = <span class="n">0</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 3634 3621       <span class="i">$Status</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <span class="k">defined</span><span class="s">(</span><span class="i">$SpinMultiplicity</span><span class="s">)</span> && <span class="i">$Value</span> == <span class="i">$SpinMultiplicity</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3635 3622       <span class="k">last</span> <span class="j">NAME</span><span class="sc">;</span> | 
|  | 3636 3623     <span class="s">}</span> | 
|  | 3637 3624 | 
|  | 3638 3625     <span class="i">$UnknownName</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3639 3626     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_MatchNonAtomSymbolAtomicInvariant: Unknown atomic invariant $AtomicInvariant..."</span><span class="sc">;</span> | 
|  | 3640 3627   <span class="s">}</span> | 
|  | 3641 3628 | 
|  | 3642 3629   <span class="k">if</span> <span class="s">(</span>!<span class="i">$UnknownName</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3643 3630     <span class="k">if</span> <span class="s">(</span><span class="i">$NegateMatch</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3644 3631       <span class="i">$Status</span> = <span class="i">$Status</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3645 3632     <span class="s">}</span> | 
|  | 3646 3633   <span class="s">}</span> | 
|  | 3647 3634 | 
|  | 3648 3635   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 3649 3636 <span class="s">}</span> | 
|  | 3650 3637 | 
|  | 3651 3638 <span class="c"># Match atomic invariant value...</span> | 
|  | 3652 3639 <span class="c">#</span> | 
|  | 3653 3640 <span class="c"># Specified value format:</span> | 
|  | 3654 3641 <span class="c">#   . +* : Any positive value</span> | 
|  | 3655 3642 <span class="c">#   . -* : Any negative value</span> | 
|  | 3656 3643 <span class="c">#   . >ValidNumber or >=ValidNumber</span> | 
|  | 3657 3644 <span class="c">#   . <ValidNumber or <=ValidNumber</span> | 
|  | 3658 3645 <span class="c">#   . Any valid number</span> | 
|  | 3659 3646 <span class="c">#</span> | 
|  | 3660 <a name="_MatchNonAtomSymbolAtomicInvariantValue-"></a>3647 <span class="k">sub </span><span class="m">_MatchNonAtomSymbolAtomicInvariantValue</span> <span class="s">{</span> | 
|  | 3661 3648   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$TargetValue</span><span class="cm">,</span> <span class="i">$SpecifiedValue</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3662 3649   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3663 3650 | 
|  | 3664 3651   <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3665 3652 | 
|  | 3666 3653   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$TargetValue</span><span class="s">)</span> && <span class="k">defined</span><span class="s">(</span><span class="i">$SpecifiedValue</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3667 3654     <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 3668 3655   <span class="s">}</span> | 
|  | 3669 3656 | 
|  | 3670 3657   <span class="j">VALUE:</span> <span class="s">{</span> | 
|  | 3671 3658     <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedValue</span> =~ <span class="q">/^\+\*/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3672 3659       <span class="i">$Status</span> = <span class="s">(</span><span class="i">$TargetValue</span> > <span class="n">0</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3673 3660       <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span> | 
|  | 3674 3661     <span class="s">}</span> | 
|  | 3675 3662     <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedValue</span> =~ <span class="q">/^\-\*/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3676 3663       <span class="i">$Status</span> = <span class="s">(</span><span class="i">$TargetValue</span> < <span class="n">0</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3677 3664       <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span> | 
|  | 3678 3665     <span class="s">}</span> | 
|  | 3679 3666     <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedValue</span> =~ <span class="q">/^>/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3680 3667       <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedValue</span> =~ <span class="q">/^>=/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3681 3668         <span class="i">$SpecifiedValue</span> =~ <span class="q">s/^>=//</span><span class="sc">;</span> | 
|  | 3682 3669         <span class="i">$Status</span> = <span class="s">(</span><span class="i">$SpecifiedValue</span> >= <span class="i">$TargetValue</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3683 3670       <span class="s">}</span> | 
|  | 3684 3671       <span class="k">else</span> <span class="s">{</span> | 
|  | 3685 3672         <span class="i">$SpecifiedValue</span> =~ <span class="q">s/^>//</span><span class="sc">;</span> | 
|  | 3686 3673         <span class="i">$Status</span> = <span class="s">(</span><span class="i">$SpecifiedValue</span> > <span class="i">$TargetValue</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3687 3674       <span class="s">}</span> | 
|  | 3688 3675       <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span> | 
|  | 3689 3676     <span class="s">}</span> | 
|  | 3690 3677     <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedValue</span> =~ <span class="q">/^</</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3691 3678       <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedValue</span> =~ <span class="q">/^<=/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3692 3679         <span class="i">$SpecifiedValue</span> =~ <span class="q">s/^<=//</span><span class="sc">;</span> | 
|  | 3693 3680         <span class="i">$Status</span> = <span class="s">(</span><span class="i">$SpecifiedValue</span> <= <span class="i">$TargetValue</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3694 3681       <span class="s">}</span> | 
|  | 3695 3682       <span class="k">else</span> <span class="s">{</span> | 
|  | 3696 3683         <span class="i">$SpecifiedValue</span> =~ <span class="q">s/^<//</span><span class="sc">;</span> | 
|  | 3697 3684         <span class="i">$Status</span> = <span class="s">(</span><span class="i">$SpecifiedValue</span> < <span class="i">$TargetValue</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3698 3685       <span class="s">}</span> | 
|  | 3699 3686       <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span> | 
|  | 3700 3687     <span class="s">}</span> | 
|  | 3701 3688     <span class="c"># Default is do perform an equality match...</span> | 
|  | 3702 3689     <span class="i">$Status</span> = <span class="s">(</span><span class="i">$SpecifiedValue</span> == <span class="i">$TargetValue</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3703 3690   <span class="s">}</span> | 
|  | 3704 3691 | 
|  | 3705 3692   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 3706 3693 <span class="s">}</span> | 
|  | 3707 3694 | 
|  | 3708 3695 <span class="c"># Check whether atoms match  bond specifications...</span> | 
|  | 3709 3696 <span class="c">#</span> | 
|  | 3710 <a name="_DoesBondSpecificationMatch-"></a>3697 <span class="k">sub </span><span class="m">_DoesBondSpecificationMatch</span> <span class="s">{</span> | 
|  | 3711 3698   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$BondedAtom</span><span class="cm">,</span> <span class="i">$BondSpecificationToMatch</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3712 3699   <span class="k">my</span><span class="s">(</span><span class="i">$BondSpecification</span><span class="cm">,</span> <span class="i">$BondSymbolSpecification</span><span class="cm">,</span> <span class="i">$BondSpecificationMatched</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3713 3700 | 
|  | 3714 3701   <span class="c"># Anything to match...</span> | 
|  | 3715 3702   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$BondSpecificationToMatch</span><span class="s">)</span> && <span class="i">$BondSpecificationToMatch</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3716 3703     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3717 3704   <span class="s">}</span> | 
|  | 3718 3705 | 
|  | 3719 3706   <span class="c"># Take out any spaces...</span> | 
|  | 3720 3707   <span class="i">$BondSpecificationToMatch</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 3721 3708 | 
|  | 3722 3709   <span class="c"># Match specified bond specifications. For multiple bond specifications in a comma delimited string,</span> | 
|  | 3723 3710   <span class="c"># only one bond specification needs to match for a successful match...</span> | 
|  | 3724 3711   <span class="c">#</span> | 
|  | 3725 3712   <span class="k">for</span> <span class="i">$BondSpecification</span> <span class="s">(</span><span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$BondSpecificationToMatch</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3726 3713     <span class="i">$BondSpecificationMatched</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3727 3714 | 
|  | 3728 3715     <span class="c"># Match all specified bond symbol specifications...</span> | 
|  | 3729 3716     <span class="j">BONDSYMBOL:</span> <span class="k">for</span> <span class="i">$BondSymbolSpecification</span> <span class="s">(</span><span class="k">split</span> <span class="q">/\./</span><span class="cm">,</span> <span class="i">$BondSpecification</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3730 3717       <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_MatchBondSymbolSpecification</span><span class="s">(</span><span class="i">$BondedAtom</span><span class="cm">,</span> <span class="i">$BondSymbolSpecification</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3731 3718         <span class="c"># No need to match other bond symbol specifications...</span> | 
|  | 3732 3719         <span class="i">$BondSpecificationMatched</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3733 3720         <span class="k">last</span> <span class="j">BONDSYMBOL</span><span class="sc">;</span> | 
|  | 3734 3721       <span class="s">}</span> | 
|  | 3735 3722     <span class="s">}</span> | 
|  | 3736 3723     <span class="k">if</span> <span class="s">(</span><span class="i">$BondSpecificationMatched</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3737 3724       <span class="c"># No need to try matching other bond specifications...</span> | 
|  | 3738 3725       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3739 3726     <span class="s">}</span> | 
|  | 3740 3727   <span class="s">}</span> | 
|  | 3741 3728 | 
|  | 3742 3729   <span class="c"># Nothing matched...</span> | 
|  | 3743 3730   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3744 3731 <span class="s">}</span> | 
|  | 3745 3732 | 
|  | 3746 3733 <span class="c"># Check whether atoms match  bond symbol specification...</span> | 
|  | 3747 3734 <span class="c">#</span> | 
|  | 3748 <a name="_MatchBondSymbolSpecification-"></a>3735 <span class="k">sub </span><span class="m">_MatchBondSymbolSpecification</span> <span class="s">{</span> | 
|  | 3749 3736   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$BondedAtom</span><span class="cm">,</span> <span class="i">$BondSymbolSpecification</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3750 3737   <span class="k">my</span><span class="s">(</span><span class="i">$NegateMatch</span><span class="cm">,</span> <span class="i">$Status</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$BondSymbol</span><span class="cm">,</span> <span class="i">$UnknownBondSymbol</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3751 3738 | 
|  | 3752 3739   <span class="s">(</span><span class="i">$Status</span><span class="cm">,</span> <span class="i">$NegateMatch</span><span class="cm">,</span> <span class="i">$UnknownBondSymbol</span><span class="s">)</span> = <span class="s">(</span><span class="q">'0'</span><span class="s">)</span> x <span class="n">3</span><span class="sc">;</span> | 
|  | 3753 3740 | 
|  | 3754 3741   <span class="c"># Does match needs to be negated?</span> | 
|  | 3755 3742   <span class="k">if</span> <span class="s">(</span><span class="i">$BondSymbolSpecification</span> =~ <span class="q">/^!/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3756 3743     <span class="i">$NegateMatch</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3757 3744     <span class="i">$BondSymbolSpecification</span> =~ <span class="q">s/^!//</span><span class="sc">;</span> | 
|  | 3758 3745   <span class="s">}</span> | 
|  | 3759 3746   <span class="i">$BondSymbol</span> = <span class="i">$BondSymbolSpecification</span><span class="sc">;</span> | 
|  | 3760 3747   <span class="i">$Bond</span> = <span class="i">$This</span><span class="i">->GetBondToAtom</span><span class="s">(</span><span class="i">$BondedAtom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3761 3748 | 
|  | 3762 3749   <span class="j">BONDSYMBOL:</span> <span class="s">{</span> | 
|  | 3763 3750     <span class="k">if</span> <span class="s">(</span><span class="i">$BondSymbol</span> =~ <span class="q">/^(-|1|s|Single)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$Bond</span><span class="i">->IsSingle</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> <span class="k">last</span> <span class="j">BONDSYMBOL</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 3764 3751     <span class="k">if</span> <span class="s">(</span><span class="i">$BondSymbol</span> =~ <span class="q">/^(=|2|d|Double)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$Bond</span><span class="i">->IsDouble</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> <span class="k">last</span> <span class="j">BONDSYMBOL</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 3765 3752     <span class="k">if</span> <span class="s">(</span><span class="i">$BondSymbol</span> =~ <span class="q">/^(#|3|t|Triple)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$Bond</span><span class="i">->IsTriple</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> <span class="k">last</span> <span class="j">BONDSYMBOL</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 3766 3753     <span class="k">if</span> <span class="s">(</span><span class="i">$BondSymbol</span> =~ <span class="q">/^(:|a|Ar|Aromatic)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$Bond</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> <span class="k">last</span> <span class="j">BONDSYMBOL</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 3767 3754 | 
|  | 3768 3755     <span class="k">if</span> <span class="s">(</span><span class="i">$BondSymbol</span> =~ <span class="q">/^(\@|RB|Ring)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$Bond</span><span class="i">->IsInRing</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> <span class="k">last</span> <span class="j">BONDSYMBOL</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 3769 3756 | 
|  | 3770 3757     <span class="k">if</span> <span class="s">(</span><span class="i">$BondSymbol</span> =~ <span class="q">/^(\~|\*|Any)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="n">1</span><span class="sc">;</span> <span class="k">last</span> <span class="j">BONDSYMBOL</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 3771 3758 | 
|  | 3772 3759     <span class="i">$UnknownBondSymbol</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 3773 3760     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_MatchBondSpecification: Unknown bond specification $BondSymbolSpecification..."</span><span class="sc">;</span> | 
|  | 3774 3761   <span class="s">}</span> | 
|  | 3775 3762 | 
|  | 3776 3763   <span class="k">if</span> <span class="s">(</span>!<span class="i">$UnknownBondSymbol</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3777 3764     <span class="k">if</span> <span class="s">(</span><span class="i">$NegateMatch</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3778 3765       <span class="i">$Status</span> = <span class="i">$Status</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3779 3766     <span class="s">}</span> | 
|  | 3780 3767   <span class="s">}</span> | 
|  | 3781 3768 | 
|  | 3782 3769   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 3783 3770 <span class="s">}</span> | 
|  | 3784 3771 | 
|  | 3785 3772 <span class="c"># Is it a saturated atom?</span> | 
|  | 3786 3773 <span class="c">#</span> | 
|  | 3787 <a name="IsSaturated-"></a>3774 <span class="k">sub </span><span class="m">IsSaturated</span> <span class="s">{</span> | 
|  | 3788 3775   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3789 3776 | 
|  | 3790 3777   <span class="k">return</span> !<span class="i">$This</span><span class="i">->IsUnsaturated</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3791 3778 <span class="s">}</span> | 
|  | 3792 3779 | 
|  | 3793 3780 <span class="c"># Is it an unsaturated atom containing at least one non-single bond?</span> | 
|  | 3794 3781 <span class="c">#</span> | 
|  | 3795 <a name="IsUnsaturated-"></a>3782 <span class="k">sub </span><span class="m">IsUnsaturated</span> <span class="s">{</span> | 
|  | 3796 3783   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3797 3784   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfSingleBonds</span><span class="cm">,</span> <span class="i">$NumOfDoubleBonds</span><span class="cm">,</span> <span class="i">$NumOfTripleBonds</span><span class="cm">,</span> <span class="i">$NumOfAromaticBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3798 3785 | 
|  | 3799 3786   <span class="s">(</span><span class="i">$NumOfSingleBonds</span><span class="cm">,</span> <span class="i">$NumOfDoubleBonds</span><span class="cm">,</span> <span class="i">$NumOfTripleBonds</span><span class="cm">,</span> <span class="i">$NumOfAromaticBonds</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetNumOfBondTypesToNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3800 3787 | 
|  | 3801 3788   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfDoubleBonds</span> || <span class="i">$NumOfTripleBonds</span> || <span class="i">$NumOfAromaticBonds</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3802 3789 <span class="s">}</span> | 
|  | 3803 3790 | 
|  | 3804 3791 <span class="c"># Is atom in a ring?</span> | 
|  | 3805 3792 <span class="c">#</span> | 
|  | 3806 <a name="IsInRing-"></a>3793 <span class="k">sub </span><span class="m">IsInRing</span> <span class="s">{</span> | 
|  | 3807 3794   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3808 3795 | 
|  | 3809 3796   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3810 3797   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3811 3798     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3812 3799   <span class="s">}</span> | 
|  | 3813 3800   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3814 3801   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3815 3802 | 
|  | 3816 3803   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_IsAtomInRing</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3817 3804 <span class="s">}</span> | 
|  | 3818 3805 | 
|  | 3819 3806 <span class="c"># Is atom not in a ring?</span> | 
|  | 3820 3807 <span class="c">#</span> | 
|  | 3821 <a name="IsNotInRing-"></a>3808 <span class="k">sub </span><span class="m">IsNotInRing</span> <span class="s">{</span> | 
|  | 3822 3809   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3823 3810 | 
|  | 3824 3811   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3825 3812   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3826 3813     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3827 3814   <span class="s">}</span> | 
|  | 3828 3815   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3829 3816   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3830 3817 | 
|  | 3831 3818   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_IsAtomNotInRing</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3832 3819 <span class="s">}</span> | 
|  | 3833 3820 | 
|  | 3834 3821 <span class="c"># Is atom only in one ring?</span> | 
|  | 3835 3822 <span class="c">#</span> | 
|  | 3836 <a name="IsOnlyInOneRing-"></a>3823 <span class="k">sub </span><span class="m">IsOnlyInOneRing</span> <span class="s">{</span> | 
|  | 3837 3824   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3838 3825 | 
|  | 3839 3826   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3840 3827   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3841 3828     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3842 3829   <span class="s">}</span> | 
|  | 3843 3830   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3844 3831   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3845 3832 | 
|  | 3846 3833   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_IsAtomInOnlyOneRing</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3847 3834 <span class="s">}</span> | 
|  | 3848 3835 | 
|  | 3849 3836 <span class="c"># Is atom in a ring of specific size?</span> | 
|  | 3850 3837 <span class="c">#</span> | 
|  | 3851 <a name="IsInRingOfSize-"></a>3838 <span class="k">sub </span><span class="m">IsInRingOfSize</span> <span class="s">{</span> | 
|  | 3852 3839   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3853 3840 | 
|  | 3854 3841   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3855 3842   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3856 3843     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3857 3844   <span class="s">}</span> | 
|  | 3858 3845   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3859 3846   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3860 3847 | 
|  | 3861 3848   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_IsAtomInRingOfSize</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3862 3849 <span class="s">}</span> | 
|  | 3863 3850 | 
|  | 3864 3851 <span class="c"># Get size of smallest ring containing the atom...</span> | 
|  | 3865 3852 <span class="c">#</span> | 
|  | 3866 <a name="GetSizeOfSmallestRing-"></a>3853 <span class="k">sub </span><span class="m">GetSizeOfSmallestRing</span> <span class="s">{</span> | 
|  | 3867 3854   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3868 3855 | 
|  | 3869 3856   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3870 3857   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3871 3858     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3872 3859   <span class="s">}</span> | 
|  | 3873 3860   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3874 3861   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3875 3862 | 
|  | 3876 3863   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetSizeOfSmallestAtomRing</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3877 3864 <span class="s">}</span> | 
|  | 3878 3865 | 
|  | 3879 3866 <span class="c"># Get size of largest ring containing the atom...</span> | 
|  | 3880 3867 <span class="c">#</span> | 
|  | 3881 <a name="GetSizeOfLargestRing-"></a>3868 <span class="k">sub </span><span class="m">GetSizeOfLargestRing</span> <span class="s">{</span> | 
|  | 3882 3869   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3883 3870 | 
|  | 3884 3871   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3885 3872   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3886 3873     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3887 3874   <span class="s">}</span> | 
|  | 3888 3875   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3889 3876   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3890 3877 | 
|  | 3891 3878   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetSizeOfLargestAtomRing</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3892 3879 <span class="s">}</span> | 
|  | 3893 3880 | 
|  | 3894 3881 <span class="c"># Get number of  rings containing the atom...</span> | 
|  | 3895 3882 <span class="c">#</span> | 
|  | 3896 <a name="GetNumOfRings-"></a>3883 <span class="k">sub </span><span class="m">GetNumOfRings</span> <span class="s">{</span> | 
|  | 3897 3884   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3898 3885 | 
|  | 3899 3886   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3900 3887   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3901 3888     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3902 3889   <span class="s">}</span> | 
|  | 3903 3890   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3904 3891   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3905 3892 | 
|  | 3906 3893   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetNumOfAtomRings</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3907 3894 <span class="s">}</span> | 
|  | 3908 3895 | 
|  | 3909 3896 <span class="c"># Get number of  rings with odd size containing the atom...</span> | 
|  | 3910 3897 <span class="c">#</span> | 
|  | 3911 <a name="GetNumOfRingsWithOddSize-"></a>3898 <span class="k">sub </span><span class="m">GetNumOfRingsWithOddSize</span> <span class="s">{</span> | 
|  | 3912 3899   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3913 3900 | 
|  | 3914 3901   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3915 3902   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3916 3903     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3917 3904   <span class="s">}</span> | 
|  | 3918 3905   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3919 3906   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3920 3907 | 
|  | 3921 3908   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetNumOfAtomRingsWithOddSize</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3922 3909 <span class="s">}</span> | 
|  | 3923 3910 | 
|  | 3924 3911 <span class="c"># Get number of  rings with even size containing the atom...</span> | 
|  | 3925 3912 <span class="c">#</span> | 
|  | 3926 <a name="GetNumOfRingsWithEvenSize-"></a>3913 <span class="k">sub </span><span class="m">GetNumOfRingsWithEvenSize</span> <span class="s">{</span> | 
|  | 3927 3914   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3928 3915 | 
|  | 3929 3916   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3930 3917   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3931 3918     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3932 3919   <span class="s">}</span> | 
|  | 3933 3920   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3934 3921   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3935 3922 | 
|  | 3936 3923   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetNumOfAtomRingsWithEvenSize</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3937 3924 <span class="s">}</span> | 
|  | 3938 3925 | 
|  | 3939 3926 <span class="c"># Get number of  rings with specified size containing the atom...</span> | 
|  | 3940 3927 <span class="c">#</span> | 
|  | 3941 <a name="GetNumOfRingsWithSize-"></a>3928 <span class="k">sub </span><span class="m">GetNumOfRingsWithSize</span> <span class="s">{</span> | 
|  | 3942 3929   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3943 3930 | 
|  | 3944 3931   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3945 3932   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3946 3933     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3947 3934   <span class="s">}</span> | 
|  | 3948 3935   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3949 3936   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3950 3937 | 
|  | 3951 3938   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetNumOfAtomRingsWithSize</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3952 3939 | 
|  | 3953 3940 <span class="s">}</span> | 
|  | 3954 3941 | 
|  | 3955 3942 <span class="c"># Get number of  rings with size less than specified containing the atom...</span> | 
|  | 3956 3943 <span class="c">#</span> | 
|  | 3957 <a name="GetNumOfRingsWithSizeLessThan-"></a>3944 <span class="k">sub </span><span class="m">GetNumOfRingsWithSizeLessThan</span> <span class="s">{</span> | 
|  | 3958 3945   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3959 3946 | 
|  | 3960 3947   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3961 3948   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3962 3949     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3963 3950   <span class="s">}</span> | 
|  | 3964 3951   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3965 3952   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3966 3953 | 
|  | 3967 3954   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetNumOfAtomRingsWithSizeLessThan</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3968 3955 <span class="s">}</span> | 
|  | 3969 3956 | 
|  | 3970 3957 <span class="c"># Get number of  rings with size greater than specified size containing the atom...</span> | 
|  | 3971 3958 <span class="c">#</span> | 
|  | 3972 <a name="GetNumOfRingsWithSizeGreaterThan-"></a>3959 <span class="k">sub </span><span class="m">GetNumOfRingsWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 3973 3960   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3974 3961 | 
|  | 3975 3962   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3976 3963   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3977 3964     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3978 3965   <span class="s">}</span> | 
|  | 3979 3966   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3980 3967   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3981 3968 | 
|  | 3982 3969   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetNumOfAtomRingsWithSizeGreaterThan</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3983 3970 <span class="s">}</span> | 
|  | 3984 3971 | 
|  | 3985 3972 <span class="c"># Get all rings an array of references to arrays containing ring atoms...</span> | 
|  | 3986 3973 <span class="c">#</span> | 
|  | 3987 <a name="GetRings-"></a>3974 <span class="k">sub </span><span class="m">GetRings</span> <span class="s">{</span> | 
|  | 3988 3975   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3989 3976 | 
|  | 3990 3977   <span class="c"># Is this atom in a molecule?</span> | 
|  | 3991 3978   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3992 3979     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 3993 3980   <span class="s">}</span> | 
|  | 3994 3981   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3995 3982   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3996 3983 | 
|  | 3997 3984   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetAtomRings</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3998 3985 <span class="s">}</span> | 
|  | 3999 3986 | 
|  | 4000 3987 <span class="c"># Get smallest ring as an array containing ring atoms...</span> | 
|  | 4001 3988 <span class="c">#</span> | 
|  | 4002 <a name="GetSmallestRing-"></a>3989 <span class="k">sub </span><span class="m">GetSmallestRing</span> <span class="s">{</span> | 
|  | 4003 3990   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4004 3991 | 
|  | 4005 3992   <span class="c"># Is this atom in a molecule?</span> | 
|  | 4006 3993   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4007 3994     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 4008 3995   <span class="s">}</span> | 
|  | 4009 3996   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4010 3997   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4011 3998 | 
|  | 4012 3999   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetSmallestAtomRing</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4013 4000 <span class="s">}</span> | 
|  | 4014 4001 | 
|  | 4015 4002 <span class="c"># Get largest ring as an array containing ring atoms...</span> | 
|  | 4016 4003 <span class="c">#</span> | 
|  | 4017 <a name="GetLargestRing-"></a>4004 <span class="k">sub </span><span class="m">GetLargestRing</span> <span class="s">{</span> | 
|  | 4018 4005   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4019 4006 | 
|  | 4020 4007   <span class="c"># Is this atom in a molecule?</span> | 
|  | 4021 4008   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4022 4009     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 4023 4010   <span class="s">}</span> | 
|  | 4024 4011   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4025 4012   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4026 4013 | 
|  | 4027 4014   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetLargestAtomRing</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4028 4015 <span class="s">}</span> | 
|  | 4029 4016 | 
|  | 4030 4017 <span class="c"># Get odd size rings an array of references to arrays containing ring atoms...</span> | 
|  | 4031 4018 <span class="c">#</span> | 
|  | 4032 <a name="GetRingsWithOddSize-"></a>4019 <span class="k">sub </span><span class="m">GetRingsWithOddSize</span> <span class="s">{</span> | 
|  | 4033 4020   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4034 4021 | 
|  | 4035 4022   <span class="c"># Is this atom in a molecule?</span> | 
|  | 4036 4023   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4037 4024     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 4038 4025   <span class="s">}</span> | 
|  | 4039 4026   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4040 4027   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4041 4028 | 
|  | 4042 4029   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetAtomRingsWithOddSize</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4043 4030 <span class="s">}</span> | 
|  | 4044 4031 | 
|  | 4045 4032 <span class="c"># Get even size rings an array of references to arrays containing ring atoms...</span> | 
|  | 4046 4033 <span class="c">#</span> | 
|  | 4047 <a name="GetRingsWithEvenSize-"></a>4034 <span class="k">sub </span><span class="m">GetRingsWithEvenSize</span> <span class="s">{</span> | 
|  | 4048 4035   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4049 4036 | 
|  | 4050 4037   <span class="c"># Is this atom in a molecule?</span> | 
|  | 4051 4038   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4052 4039     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 4053 4040   <span class="s">}</span> | 
|  | 4054 4041   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4055 4042   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4056 4043 | 
|  | 4057 4044   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetAtomRingsWithEvenSize</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4058 4045 <span class="s">}</span> | 
|  | 4059 4046 | 
|  | 4060 4047 <span class="c"># Get rings with specified size as an array of references to arrays containing ring atoms...</span> | 
|  | 4061 4048 <span class="c">#</span> | 
|  | 4062 <a name="GetRingsWithSize-"></a>4049 <span class="k">sub </span><span class="m">GetRingsWithSize</span> <span class="s">{</span> | 
|  | 4063 4050   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4064 4051 | 
|  | 4065 4052   <span class="c"># Is this atom in a molecule?</span> | 
|  | 4066 4053   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4067 4054     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 4068 4055   <span class="s">}</span> | 
|  | 4069 4056   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4070 4057   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4071 4058 | 
|  | 4072 4059   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetAtomRingsWithSize</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4073 4060 <span class="s">}</span> | 
|  | 4074 4061 | 
|  | 4075 4062 <span class="c"># Get rings with size less than specfied size as an array of references to arrays containing ring atoms...</span> | 
|  | 4076 4063 <span class="c">#</span> | 
|  | 4077 <a name="GetRingsWithSizeLessThan-"></a>4064 <span class="k">sub </span><span class="m">GetRingsWithSizeLessThan</span> <span class="s">{</span> | 
|  | 4078 4065   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4079 4066 | 
|  | 4080 4067   <span class="c"># Is this atom in a molecule?</span> | 
|  | 4081 4068   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4082 4069     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 4083 4070   <span class="s">}</span> | 
|  | 4084 4071   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4085 4072   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4086 4073 | 
|  | 4087 4074   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetAtomRingsWithSizeLessThan</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4088 4075 <span class="s">}</span> | 
|  | 4089 4076 | 
|  | 4090 4077 <span class="c"># Get rings with size greater than specfied size as an array of references to arrays containing ring atoms...</span> | 
|  | 4091 4078 <span class="c">#</span> | 
|  | 4092 <a name="GetRingsWithSizeGreaterThan-"></a>4079 <span class="k">sub </span><span class="m">GetRingsWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 4093 4080   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4094 4081 | 
|  | 4095 4082   <span class="c"># Is this atom in a molecule?</span> | 
|  | 4096 4083   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4097 4084     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 4098 4085   <span class="s">}</span> | 
|  | 4099 4086   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4100 4087   <span class="i">$Molecule</span> = <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4101 4088 | 
|  | 4102 4089   <span class="k">return</span> <span class="i">$Molecule</span><span class="i">->_GetAtomRingsWithSizeGreaterThan</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4103 4090 <span class="s">}</span> | 
|  | 4104 4091 | 
|  | 4105 4092 <span class="c"># Get next object ID...</span> | 
|  | 4106 <a name="_GetNewObjectID-"></a>4093 <span class="k">sub </span><span class="m">_GetNewObjectID</span> <span class="s">{</span> | 
|  | 4107 4094   <span class="i">$ObjectID</span>++<span class="sc">;</span> | 
|  | 4108 4095   <span class="k">return</span> <span class="i">$ObjectID</span><span class="sc">;</span> | 
|  | 4109 4096 <span class="s">}</span> | 
|  | 4110 4097 | 
|  | 4111 4098 <span class="c"># Return a string containing vertices, edges and other properties...</span> | 
|  | 4112 <a name="StringifyAtom-"></a>4099 <span class="k">sub </span><span class="m">StringifyAtom</span> <span class="s">{</span> | 
|  | 4113 4100   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4114 4101   <span class="k">my</span><span class="s">(</span><span class="i">$AtomString</span><span class="cm">,</span> <span class="i">$ID</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$AtomSymbol</span><span class="cm">,</span> <span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$XYZVector</span><span class="cm">,</span> <span class="i">$AtomicWeight</span><span class="cm">,</span> <span class="i">$ExactMass</span><span class="cm">,</span> <span class="i">$NumOfNeighbors</span><span class="cm">,</span> <span class="i">$NumOfBonds</span><span class="cm">,</span> <span class="i">$Valence</span><span class="cm">,</span> <span class="i">$MissingHydrogens</span><span class="cm">,</span> <span class="i">$TotalHydrogens</span><span class="cm">,</span> <span class="i">$ImplicitHydrogens</span><span class="cm">,</span> <span class="i">$ExplicitHydrogens</span><span class="cm">,</span> <span class="i">$FormalCharge</span><span class="cm">,</span> <span class="i">$Charge</span><span class="cm">,</span> <span class="i">$SpinMultiplicity</span><span class="cm">,</span> <span class="i">$FreeRadicalElectrons</span><span class="cm">,</span> <span class="i">$StereoCenter</span><span class="cm">,</span> <span class="i">$StereoCenterStatus</span><span class="cm">,</span> <span class="i">$StereoChemistry</span><span class="cm">,</span> <span class="i">$StereochemistryString</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$NumOfRings</span><span class="cm">,</span> <span class="i">$AromaticAtom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4115 4102 | 
|  | 4116 4103   <span class="i">$ID</span> = <span class="i">$This</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4117 4104   <span class="i">$Name</span> = <span class="i">$This</span><span class="i">->GetName</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4118 4105   <span class="i">$AtomSymbol</span> = <span class="i">$This</span><span class="i">->GetAtomSymbol</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4119 4106   <span class="i">$AtomicNumber</span> = <span class="i">$This</span><span class="i">->GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4120 4107   <span class="i">$XYZVector</span> = <span class="i">$This</span><span class="i">->GetXYZVector</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4121 4108 | 
|  | 4122 4109   <span class="i">$AtomicWeight</span> = <span class="i">$This</span><span class="i">->GetAtomicWeight</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4123 4110   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$AtomicWeight</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4124 4111     <span class="i">$AtomicWeight</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4125 4112   <span class="s">}</span> | 
|  | 4126 4113   <span class="i">$ExactMass</span> = <span class="i">$This</span><span class="i">->GetExactMass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4127 4114   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ExactMass</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4128 4115     <span class="i">$ExactMass</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4129 4116   <span class="s">}</span> | 
|  | 4130 4117   <span class="i">$NumOfNeighbors</span> = <span class="i">$This</span><span class="i">->GetNumOfNeighbors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4131 4118   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$NumOfNeighbors</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4132 4119     <span class="i">$NumOfNeighbors</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4133 4120   <span class="s">}</span> | 
|  | 4134 4121   <span class="i">$NumOfBonds</span> = <span class="i">$This</span><span class="i">->GetNumOfBonds</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4135 4122   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$NumOfBonds</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4136 4123     <span class="i">$NumOfBonds</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4137 4124   <span class="s">}</span> | 
|  | 4138 4125   <span class="i">$Valence</span> = <span class="i">$This</span><span class="i">->GetValence</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4139 4126   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Valence</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4140 4127     <span class="i">$Valence</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4141 4128   <span class="s">}</span> | 
|  | 4142 4129 | 
|  | 4143 4130   <span class="i">$MissingHydrogens</span> = <span class="i">$This</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4144 4131   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$MissingHydrogens</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4145 4132     <span class="i">$MissingHydrogens</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4146 4133   <span class="s">}</span> | 
|  | 4147 4134   <span class="i">$TotalHydrogens</span> = <span class="i">$This</span><span class="i">->GetNumOfHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4148 4135   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$TotalHydrogens</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4149 4136     <span class="i">$TotalHydrogens</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4150 4137   <span class="s">}</span> | 
|  | 4151 4138   <span class="i">$ImplicitHydrogens</span> = <span class="i">$This</span><span class="i">->GetNumOfImplicitHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4152 4139   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ImplicitHydrogens</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4153 4140     <span class="i">$ImplicitHydrogens</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4154 4141   <span class="s">}</span> | 
|  | 4155 4142   <span class="i">$ExplicitHydrogens</span> = <span class="i">$This</span><span class="i">->GetNumOfExplicitHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4156 4143   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ExplicitHydrogens</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4157 4144     <span class="i">$ExplicitHydrogens</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4158 4145   <span class="s">}</span> | 
|  | 4159 4146 | 
|  | 4160 4147   <span class="i">$FormalCharge</span> = <span class="i">$This</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4161 4148   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$FormalCharge</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4162 4149     <span class="i">$FormalCharge</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4163 4150   <span class="s">}</span> | 
|  | 4164 4151   <span class="i">$Charge</span> = <span class="i">$This</span><span class="i">->GetCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4165 4152   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Charge</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4166 4153     <span class="i">$Charge</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4167 4154   <span class="s">}</span> | 
|  | 4168 4155 | 
|  | 4169 4156   <span class="i">$SpinMultiplicity</span> = <span class="i">$This</span><span class="i">->GetSpinMultiplicity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4170 4157   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$SpinMultiplicity</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4171 4158     <span class="i">$SpinMultiplicity</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4172 4159   <span class="s">}</span> | 
|  | 4173 4160   <span class="i">$FreeRadicalElectrons</span> = <span class="i">$This</span><span class="i">->GetFreeRadicalElectrons</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4174 4161   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$FreeRadicalElectrons</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4175 4162     <span class="i">$FreeRadicalElectrons</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4176 4163   <span class="s">}</span> | 
|  | 4177 4164 | 
|  | 4178 4165   <span class="i">$RingAtom</span> = <span class="i">$This</span><span class="i">->IsInRing</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4179 4166   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$RingAtom</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4180 4167     <span class="i">$RingAtom</span> = <span class="i">$RingAtom</span>  ? <span class="q">'Yes'</span> <span class="co">:</span> <span class="q">'No'</span><span class="sc">;</span> | 
|  | 4181 4168     <span class="i">$NumOfRings</span> = <span class="i">$This</span><span class="i">->GetNumOfRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4182 4169   <span class="s">}</span> | 
|  | 4183 4170   <span class="k">else</span> <span class="s">{</span> | 
|  | 4184 4171     <span class="i">$RingAtom</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4185 4172     <span class="i">$NumOfRings</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4186 4173   <span class="s">}</span> | 
|  | 4187 4174 | 
|  | 4188 4175   <span class="i">$AromaticAtom</span> = <span class="i">$This</span><span class="i">->GetAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4189 4176   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$AromaticAtom</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4190 4177     <span class="i">$AromaticAtom</span> = <span class="i">$AromaticAtom</span>  ? <span class="q">'Yes'</span> <span class="co">:</span> <span class="q">'No'</span><span class="sc">;</span> | 
|  | 4191 4178   <span class="s">}</span> | 
|  | 4192 4179   <span class="k">else</span> <span class="s">{</span> | 
|  | 4193 4180     <span class="i">$AromaticAtom</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4194 4181   <span class="s">}</span> | 
|  | 4195 4182 | 
|  | 4196 4183   <span class="i">$StereochemistryString</span> = <span class="q">''</span><span class="sc">;</span> | 
|  | 4197 4184   <span class="i">$StereoCenter</span> = <span class="i">$This</span><span class="i">->GetStereoCenter</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4198 4185   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$StereoCenter</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4199 4186     <span class="i">$StereoCenterStatus</span> = <span class="i">$This</span><span class="i">->IsStereoCenter</span><span class="s">(</span><span class="s">)</span> ? <span class="q">'Yes'</span> <span class="co">:</span> <span class="q">'No'</span><span class="sc">;</span> | 
|  | 4200 4187     <span class="i">$StereoChemistry</span> = <span class="i">$This</span><span class="i">->GetStereochemistry</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4201 4188     <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$StereoChemistry</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4202 4189       <span class="i">$StereoChemistry</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4203 4190     <span class="s">}</span> | 
|  | 4204 4191     <span class="i">$StereochemistryString</span> = <span class="q">"StereoCenter: $StereoCenterStatus; Stereochemistry: $StereoChemistry"</span><span class="sc">;</span> | 
|  | 4205 4192   <span class="s">}</span> | 
|  | 4206 4193 | 
|  | 4207 4194   <span class="i">$AtomString</span> = <span class="q">"Atom: ID: $ID; Name: \"$Name\"; AtomSymbol: \"$AtomSymbol\"; AtomicNumber: $AtomicNumber; XYZ: $XYZVector; AtomicWeight: $AtomicWeight; ExactMass: $ExactMass; NumOfNeighbors: $NumOfNeighbors;  NumOfBonds: $NumOfBonds; Valence: $Valence; MissingHydrogens: $MissingHydrogens; TotalHydrogens: $TotalHydrogens; ImplicitHydrogens: $ImplicitHydrogens; ExplicitHydrogens: $ExplicitHydrogens; FormalCharge: $FormalCharge; Charge: $Charge; SpinMultiplicity: $SpinMultiplicity; FreeRadicalElectrons: $FreeRadicalElectrons; RingAtom: $RingAtom; NumOfAtomRings: $NumOfRings; AromaticAtom: $AromaticAtom"</span><span class="sc">;</span> | 
|  | 4208 4195 | 
|  | 4209 4196   <span class="k">if</span> <span class="s">(</span><span class="i">$StereochemistryString</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4210 4197     <span class="i">$AtomString</span> .= <span class="q">"; $StereochemistryString"</span><span class="sc">;</span> | 
|  | 4211 4198   <span class="s">}</span> | 
|  | 4212 4199 | 
|  | 4213 4200   <span class="k">return</span> <span class="i">$AtomString</span><span class="sc">;</span> | 
|  | 4214 4201 <span class="s">}</span> | 
|  | 4215 4202 | 
|  | 4216 4203 <span class="c"># Load appropriate atom data files from <MayaChemTools>/lib directory used by various</span> | 
|  | 4217 4204 <span class="c"># object methods in the current class...</span> | 
|  | 4218 4205 <span class="c">#</span> | 
|  | 4219 <a name="_LoadAtomClassData-"></a>4206 <span class="k">sub </span><span class="m">_LoadAtomClassData</span> <span class="s">{</span> | 
|  | 4220 4207   <span class="k">my</span><span class="s">(</span><span class="i">$MayaChemToolsLibDir</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4221 4208 | 
|  | 4222 4209   <span class="i">$MayaChemToolsLibDir</span> = <span class="i">GetMayaChemToolsLibDirName</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4223 4210 | 
|  | 4224 4211   <span class="i">_LoadAtomValenceModelData</span><span class="s">(</span><span class="i">$MayaChemToolsLibDir</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4225 4212 | 
|  | 4226 4213 <span class="s">}</span> | 
|  | 4227 4214 | 
|  | 4228 4215 <span class="c">#</span> | 
|  | 4229 4216 <span class="c"># Load data for supported valence models...</span> | 
|  | 4230 4217 <span class="c">#</span> | 
|  | 4231 <a name="_LoadAtomValenceModelData-"></a>4218 <span class="k">sub </span><span class="m">_LoadAtomValenceModelData</span> <span class="s">{</span> | 
|  | 4232 4219   <span class="k">my</span><span class="s">(</span><span class="i">$MayaChemToolsLibDir</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4233 4220   <span class="k">my</span><span class="s">(</span><span class="i">$MDLValenceModelDataFile</span><span class="cm">,</span> <span class="i">$DaylightValenceModelDataFile</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4234 4221 | 
|  | 4235 4222   <span class="i">%MDLValenceModelDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4236 4223   <span class="i">%DaylightValenceModelDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4237 4224 | 
|  | 4238 4225   <span class="i">$MDLValenceModelDataFile</span> = <span class="i">$MayaChemToolsLibDir</span> . <span class="q">"/data/MDLValenceModelData.csv"</span><span class="sc">;</span> | 
|  | 4239 4226   <span class="i">$DaylightValenceModelDataFile</span> = <span class="i">$MayaChemToolsLibDir</span> . <span class="q">"/data/DaylightValenceModelData.csv"</span><span class="sc">;</span> | 
|  | 4240 4227 | 
|  | 4241 4228   <span class="k">if</span> <span class="s">(</span>! <span class="k">-e</span> <span class="q">"$MDLValenceModelDataFile"</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4242 4229     <span class="w">croak</span> <span class="q">"Error: ${ClassName}::_LoadAtomValenceModelData: MayaChemTools package file, $MDLValenceModelDataFile, is missing: Possible installation problems..."</span><span class="sc">;</span> | 
|  | 4243 4230   <span class="s">}</span> | 
|  | 4244 4231 | 
|  | 4245 4232   <span class="k">if</span> <span class="s">(</span>! <span class="k">-e</span> <span class="q">"$DaylightValenceModelDataFile"</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4246 4233     <span class="w">croak</span> <span class="q">"Error: ${ClassName}::_LoadAtomValenceModelData: MayaChemTools package file, $DaylightValenceModelDataFile, is missing: Possible installation problems..."</span><span class="sc">;</span> | 
|  | 4247 4234   <span class="s">}</span> | 
|  | 4248 4235 | 
|  | 4249 4236   <span class="i">_LoadValenceModelDataFile</span><span class="s">(</span><span class="i">$MDLValenceModelDataFile</span><span class="cm">,</span> \<span class="i">%MDLValenceModelDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4250 4237   <span class="i">_LoadValenceModelDataFile</span><span class="s">(</span><span class="i">$DaylightValenceModelDataFile</span><span class="cm">,</span> \<span class="i">%DaylightValenceModelDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4251 4238 | 
|  | 4252 4239 <span class="s">}</span> | 
|  | 4253 4240 | 
|  | 4254 4241 <span class="c">#</span> | 
|  | 4255 4242 <span class="c"># Load valence model data file...</span> | 
|  | 4256 4243 <span class="c">#</span> | 
|  | 4257 <a name="_LoadValenceModelDataFile-"></a>4244 <span class="k">sub </span><span class="m">_LoadValenceModelDataFile</span> <span class="s">{</span> | 
|  | 4258 4245   <span class="k">my</span><span class="s">(</span><span class="i">$DataFile</span><span class="cm">,</span> <span class="i">$DataMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4259 4246 | 
|  | 4260 4247   <span class="c"># File format:</span> | 
|  | 4261 4248   <span class="c">#</span> | 
|  | 4262 4249   <span class="c"># "AtomicNumber","ElementSymbol","FormalCharge","CommomValences"</span> | 
|  | 4263 4250   <span class="c">#</span> | 
|  | 4264 4251   <span class="k">my</span><span class="s">(</span><span class="i">$InDelim</span><span class="cm">,</span> <span class="i">$Line</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">@ColLabels</span><span class="cm">,</span> <span class="i">@LineWords</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4265 4252 | 
|  | 4266 4253   <span class="i">$InDelim</span> = <span class="q">"\,"</span><span class="sc">;</span> | 
|  | 4267 4254   <span class="k">open</span> <span class="w">DATAFILE</span><span class="cm">,</span> <span class="q">"$DataFile"</span> <span class="k">or</span> <span class="w">croak</span> <span class="q">"Couldn't open $DataFile: $! ..."</span><span class="sc">;</span> | 
|  | 4268 4255 | 
|  | 4269 4256   <span class="c"># Skip lines up to column labels...</span> | 
|  | 4270 4257   <span class="j">LINE:</span> <span class="k">while</span> <span class="s">(</span><span class="i">$Line</span> = <span class="i">GetTextLine</span><span class="s">(</span>\<span class="i">*DATAFILE</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4271 4258     <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> !~ <span class="q">/^#/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4272 4259       <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 4273 4260     <span class="s">}</span> | 
|  | 4274 4261   <span class="s">}</span> | 
|  | 4275 4262   <span class="i">@ColLabels</span>= <span class="i">quotewords</span><span class="s">(</span><span class="i">$InDelim</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4276 4263   <span class="i">$NumOfCols</span> = <span class="i">@ColLabels</span><span class="sc">;</span> | 
|  | 4277 4264 | 
|  | 4278 4265   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$FormalCharge</span><span class="cm">,</span> <span class="i">$CommonValences</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4279 4266 | 
|  | 4280 4267   <span class="c"># Process element data...</span> | 
|  | 4281 4268   <span class="j">LINE:</span> <span class="k">while</span> <span class="s">(</span><span class="i">$Line</span> = <span class="i">GetTextLine</span><span class="s">(</span>\<span class="i">*DATAFILE</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4282 4269     <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> =~ <span class="q">/^#/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4283 4270       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 4284 4271     <span class="s">}</span> | 
|  | 4285 4272     <span class="i">@LineWords</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4286 4273     <span class="i">@LineWords</span> = <span class="i">quotewords</span><span class="s">(</span><span class="i">$InDelim</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4287 4274     <span class="k">if</span> <span class="s">(</span><span class="i">@LineWords</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4288 4275       <span class="w">croak</span> <span class="q">"Error: ${ClassName}::_LoadValenceModelDataFile: The number of data fields, @LineWords, in $DataFile must be $NumOfCols.\nLine: $Line..."</span><span class="sc">;</span> | 
|  | 4289 4276     <span class="s">}</span> | 
|  | 4290 4277 | 
|  | 4291 4278     <span class="s">(</span><span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$FormalCharge</span><span class="cm">,</span> <span class="i">$CommonValences</span><span class="s">)</span> = <span class="i">@LineWords</span><span class="sc">;</span> | 
|  | 4292 4279 | 
|  | 4293 4280     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$DataMapRef</span>->{<span class="i">$AtomicNumber</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4294 4281       <span class="c"># Additional data for an element...</span> | 
|  | 4295 4282       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$DataMapRef</span>->{<span class="i">$AtomicNumber</span>}{<span class="i">$FormalCharge</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4296 4283         <span class="c"># Duplicate data entries for an element...</span> | 
|  | 4297 4284         <span class="w">carp</span> <span class="q">"Warning: ${ClassName}::_LoadValenceModelDataFile: Ignoring valence data for element with atomic number $AtomicNumber and formal charge $FormalCharge in data file $DataFile: It has already been loaded.\nLine: $Line..."</span><span class="sc">;</span> | 
|  | 4298 4285         <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 4299 4286       <span class="s">}</span> | 
|  | 4300 4287     <span class="s">}</span> | 
|  | 4301 4288     <span class="k">else</span> <span class="s">{</span> | 
|  | 4302 4289       <span class="c"># Data for a new element...</span> | 
|  | 4303 4290       <span class="i">%</span>{<span class="i">$DataMapRef</span>->{<span class="i">$AtomicNumber</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4304 4291     <span class="s">}</span> | 
|  | 4305 4292 | 
|  | 4306 4293     <span class="i">%</span>{<span class="i">$DataMapRef</span>->{<span class="i">$AtomicNumber</span>}{<span class="i">$FormalCharge</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4307 4294     <span class="i">$DataMapRef</span>->{<span class="i">$AtomicNumber</span>}{<span class="i">$FormalCharge</span>}{<span class="w">ElementSymbol</span>} = <span class="i">$ElementSymbol</span><span class="sc">;</span> | 
|  | 4308 4295 | 
|  | 4309 4296     <span class="i">@</span>{<span class="i">$DataMapRef</span>->{<span class="i">$AtomicNumber</span>}{<span class="i">$FormalCharge</span>}{<span class="w">CommonValences</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4310 4297     <span class="i">@</span>{<span class="i">$DataMapRef</span>->{<span class="i">$AtomicNumber</span>}{<span class="i">$FormalCharge</span>}{<span class="w">CommonValences</span>}} = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> <=> <span class="i">$b</span> <span class="s">}</span> <span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$CommonValences</span><span class="sc">;</span> | 
|  | 4311 4298   <span class="s">}</span> | 
|  | 4312 4299   <span class="k">close</span> <span class="w">DATAFILE</span><span class="sc">;</span> | 
|  | 4313 4300 <span class="s">}</span> | 
|  | 4314 4301 | 
|  | 4315 <a name="EOF-"></a></pre> | 
|  | 4316 <p> </p> | 
|  | 4317 <br /> | 
|  | 4318 <center> | 
|  | 4319 <img src="../../../images/h2o2.png"> | 
|  | 4320 </center> | 
|  | 4321 </body> | 
|  | 4322 </html> |