| 0 | 1 <html> | 
|  | 2 <head> | 
|  | 3 <title>MayaChemTools:Code:Molecule.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-Molecule-"></a>   1 <span class="k">package </span><span class="i">Molecule</span><span class="sc">;</span> | 
|  | 15    2 <span class="c">#</span> | 
|  | 16    3 <span class="c"># $RCSfile: Molecule.pm,v $</span> | 
|  | 17    4 <span class="c"># $Date: 2015/02/28 20:47:18 $</span> | 
|  | 18    5 <span class="c"># $Revision: 1.59 $</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">MathUtil</span><span class="sc">;</span> | 
|  | 49   36 <span class="k">use</span> <span class="w">PeriodicTable</span><span class="sc">;</span> | 
|  | 50   37 <span class="k">use</span> <span class="w">Text::ParseWords</span><span class="sc">;</span> | 
|  | 51   38 <span class="k">use</span> <span class="w">TextUtil</span><span class="sc">;</span> | 
|  | 52   39 <span class="k">use</span> <span class="w">FileUtil</span><span class="sc">;</span> | 
|  | 53   40 <span class="k">use</span> <span class="w">Graph</span><span class="sc">;</span> | 
|  | 54   41 <span class="k">use</span> <span class="w">Atom</span><span class="sc">;</span> | 
|  | 55   42 <span class="k">use</span> <span class="w">Bond</span><span class="sc">;</span> | 
|  | 56   43 <span class="k">use</span> <span class="w">MolecularFormula</span><span class="sc">;</span> | 
|  | 57   44 | 
|  | 58   45 <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> | 
|  | 59   46 | 
|  | 60   47 <span class="i">@ISA</span> = <span class="q">qw(Graph ObjectProperty Exporter)</span><span class="sc">;</span> | 
|  | 61   48 <span class="i">@EXPORT</span> = <span class="q">qw(IsMolecule)</span><span class="sc">;</span> | 
|  | 62   49 <span class="i">@EXPORT_OK</span> = <span class="q">qw(FormatElementalCompositionInformation GetSupportedAromaticityModels IsSupportedAromaticityModel)</span><span class="sc">;</span> | 
|  | 63   50 | 
|  | 64   51 <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> | 
|  | 65   52 | 
|  | 66   53 <span class="c"># Setup class variables...</span> | 
|  | 67   54 <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">%AromaticityModelsDataMap</span><span class="cm">,</span> <span class="i">%CanonicalAromaticityModelNamesMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 68   55 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 69   56 | 
|  | 70   57 <span class="c"># Overload Perl functions...</span> | 
|  | 71   58 <span class="k">use</span> <span class="w">overload</span> <span class="q">'""'</span> <span class="cm">=></span> <span class="q">'StringifyMolecule'</span><span class="sc">;</span> | 
|  | 72   59 | 
|  | 73   60 <span class="c"># Class constructor...</span> | 
|  | 74 <a name="new-"></a>  61 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span> | 
|  | 75   62   <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> | 
|  | 76   63 | 
|  | 77   64   <span class="c"># Initialize object...</span> | 
|  | 78   65   <span class="k">my</span> <span class="i">$This</span> = <span class="i">$Class</span><span class="i">->SUPER::new</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 79   66   <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> | 
|  | 80   67   <span class="i">$This</span><span class="i">->_InitializeMolecule</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 81   68 | 
|  | 82   69   <span class="k">if</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%NamesAndValues</span><span class="s">)</span> <span class="s">{</span> <span class="i">$This</span><span class="i">->_InitializeMoleculeProperties</span><span class="s">(</span><span class="i">%NamesAndValues</span><span class="s">)</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 83   70 | 
|  | 84   71   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 85   72 <span class="s">}</span> | 
|  | 86   73 | 
|  | 87   74 <span class="c"># Initialize object data...</span> | 
|  | 88 <a name="_InitializeMolecule-"></a>  75 <span class="k">sub </span><span class="m">_InitializeMolecule</span> <span class="s">{</span> | 
|  | 89   76   <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> | 
|  | 90   77   <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> | 
|  | 91   78 | 
|  | 92   79   <span class="c"># All other property names and values along with all Set/Get<PropertyName> methods</span> | 
|  | 93   80   <span class="c"># are implemented on-demand using ObjectProperty class.</span> | 
|  | 94   81   <span class="i">$This</span>->{<span class="w">ID</span>} = <span class="i">$ObjectID</span><span class="sc">;</span> | 
|  | 95   82   <span class="i">$This</span>->{<span class="w">Name</span>} = <span class="q">"Molecule ${ObjectID}"</span><span class="sc">;</span> | 
|  | 96   83 <span class="s">}</span> | 
|  | 97   84 | 
|  | 98   85 <span class="c"># Initialize molecule properties...</span> | 
|  | 99 <a name="_InitializeMoleculeProperties-"></a>  86 <span class="k">sub </span><span class="m">_InitializeMoleculeProperties</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="s">}</span> | 
|  | 108   95 | 
|  | 109   96 <span class="c"># Initialize class ...</span> | 
|  | 110 <a name="_InitializeClass-"></a>  97 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span> | 
|  | 111   98   <span class="c">#Class name...</span> | 
|  | 112   99   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span> | 
|  | 113  100 | 
|  | 114  101   <span class="c"># ID to keep track of objects...</span> | 
|  | 115  102   <span class="i">$ObjectID</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 116  103 | 
|  | 117  104   <span class="c"># Load molecule class data...</span> | 
|  | 118  105   <span class="i">_LoadMoleculeClassData</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 119  106 <span class="s">}</span> | 
|  | 120  107 | 
|  | 121  108 <span class="c"># Setup an explicit SetID method to block setting of ID by AUTOLOAD function...</span> | 
|  | 122 <a name="SetID-"></a> 109 <span class="k">sub </span><span class="m">SetID</span> <span class="s">{</span> | 
|  | 123  110   <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> | 
|  | 124  111 | 
|  | 125  112   <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> | 
|  | 126  113 | 
|  | 127  114   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 128  115 <span class="s">}</span> | 
|  | 129  116 | 
|  | 130  117 <span class="c"># Add an atom...</span> | 
|  | 131 <a name="AddAtom-"></a> 118 <span class="k">sub </span><span class="m">AddAtom</span> <span class="s">{</span> | 
|  | 132  119   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 133  120 | 
|  | 134  121   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Atom</span><span class="s">)</span> <span class="s">{</span> | 
|  | 135  122     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddAtom: No atom added: Atom must be specified..."</span><span class="sc">;</span> | 
|  | 136  123     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 137  124   <span class="s">}</span> | 
|  | 138  125   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 139  126     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddAtom: No atom added: Atom already exists..."</span><span class="sc">;</span> | 
|  | 140  127     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 141  128   <span class="s">}</span> | 
|  | 142  129   <span class="k">return</span> <span class="i">$This</span><span class="i">->_AddAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 143  130 <span class="s">}</span> | 
|  | 144  131 | 
|  | 145  132 <span class="c"># Add an atom...</span> | 
|  | 146 <a name="_AddAtom-"></a> 133 <span class="k">sub </span><span class="m">_AddAtom</span> <span class="s">{</span> | 
|  | 147  134   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 148  135 | 
|  | 149  136   <span class="c"># Assign atom to this molecule...</span> | 
|  | 150  137   <span class="i">$Atom</span><span class="i">->_SetMolecule</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 151  138 | 
|  | 152  139   <span class="c"># Add it to the graph as a vertex...</span> | 
|  | 153  140   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 154  141   <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 155  142   <span class="i">$This</span><span class="i">->AddVertex</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 156  143   <span class="i">$This</span><span class="i">->SetVertexProperty</span><span class="s">(</span><span class="q">'Atom'</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 157  144 | 
|  | 158  145   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 159  146 <span class="s">}</span> | 
|  | 160  147 | 
|  | 161  148 <span class="c"># Add atoms...</span> | 
|  | 162 <a name="AddAtoms-"></a> 149 <span class="k">sub </span><span class="m">AddAtoms</span> <span class="s">{</span> | 
|  | 163  150   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 164  151 | 
|  | 165  152   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 166  153     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddAtoms: No atoms added: Atoms list must be specified..."</span><span class="sc">;</span> | 
|  | 167  154     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 168  155   <span class="s">}</span> | 
|  | 169  156   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 170  157   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 171  158     <span class="i">$This</span><span class="i">->AddAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 172  159   <span class="s">}</span> | 
|  | 173  160   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 174  161 <span class="s">}</span> | 
|  | 175  162 | 
|  | 176  163 <span class="c"># Create an atom and add it to molecule...</span> | 
|  | 177 <a name="NewAtom-"></a> 164 <span class="k">sub </span><span class="m">NewAtom</span> <span class="s">{</span> | 
|  | 178  165   <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> | 
|  | 179  166   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 180  167 | 
|  | 181  168   <span class="i">$Atom</span> = <span class="i">new</span> <span class="i">Atom</span><span class="s">(</span><span class="i">%NamesAndValues</span><span class="s">)</span><span class="sc">;</span> | 
|  | 182  169   <span class="i">$This</span><span class="i">->AddAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 183  170 | 
|  | 184  171   <span class="k">return</span> <span class="i">$Atom</span><span class="sc">;</span> | 
|  | 185  172 <span class="s">}</span> | 
|  | 186  173 | 
|  | 187  174 <span class="c"># Delete an atom...</span> | 
|  | 188 <a name="DeleteAtom-"></a> 175 <span class="k">sub </span><span class="m">DeleteAtom</span> <span class="s">{</span> | 
|  | 189  176   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 190  177 | 
|  | 191  178   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Atom</span><span class="s">)</span> <span class="s">{</span> | 
|  | 192  179     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteAtom: No atom deleted: Atom must be specified..."</span><span class="sc">;</span> | 
|  | 193  180     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 194  181   <span class="s">}</span> | 
|  | 195  182   <span class="c"># Does the atom exist in  molecule?</span> | 
|  | 196  183   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 197  184     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteAtom: No atom deleted: Atom doesn't exist..."</span><span class="sc">;</span> | 
|  | 198  185     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 199  186   <span class="s">}</span> | 
|  | 200  187   <span class="k">return</span> <span class="i">$This</span><span class="i">->_DeleteAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 201  188 <span class="s">}</span> | 
|  | 202  189 | 
|  | 203  190 <span class="c"># Delete atom...</span> | 
|  | 204 <a name="_DeleteAtom-"></a> 191 <span class="k">sub </span><span class="m">_DeleteAtom</span> <span class="s">{</span> | 
|  | 205  192   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 206  193 | 
|  | 207  194   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 208  195   <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 209  196   <span class="i">$This</span><span class="i">->DeleteVertex</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 210  197 | 
|  | 211  198   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 212  199 <span class="s">}</span> | 
|  | 213  200 | 
|  | 214  201 <span class="c"># Delete atoms...</span> | 
|  | 215 <a name="DeleteAtoms-"></a> 202 <span class="k">sub </span><span class="m">DeleteAtoms</span> <span class="s">{</span> | 
|  | 216  203   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 217  204 | 
|  | 218  205   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 219  206     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteAtoms: No atoms added: Atoms list must be specified..."</span><span class="sc">;</span> | 
|  | 220  207     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 221  208   <span class="s">}</span> | 
|  | 222  209   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 223  210   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 224  211     <span class="i">$This</span><span class="i">->DeleteAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 225  212   <span class="s">}</span> | 
|  | 226  213 | 
|  | 227  214   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 228  215 <span class="s">}</span> | 
|  | 229  216 | 
|  | 230  217 <span class="c"># Is this atom present?</span> | 
|  | 231 <a name="HasAtom-"></a> 218 <span class="k">sub </span><span class="m">HasAtom</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">$Atom</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="k">defined</span> <span class="i">$Atom</span><span class="s">)</span> <span class="s">{</span> | 
|  | 235  222     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 236  223   <span class="s">}</span> | 
|  | 237  224   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</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> | 
|  | 238  225     <span class="c"># It's not in molecule...</span> | 
|  | 239  226     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 240  227   <span class="s">}</span> | 
|  | 241  228   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 242  229   <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 243  230   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertex</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 244  231     <span class="c"># It's not in molecule...</span> | 
|  | 245  232     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 246  233   <span class="s">}</span> | 
|  | 247  234   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 248  235   <span class="i">$Molecule</span> = <span class="i">$Atom</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Molecule'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 249  236 | 
|  | 250  237   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasVertex</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Molecule</span><span class="i">->GetID</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> | 
|  | 251  238 <span class="s">}</span> | 
|  | 252  239 | 
|  | 253  240 <span class="c"># Return an array of atoms. In scalar context,  it returns number of atoms. Additionally,</span> | 
|  | 254  241 <span class="c"># atoms array can be filtered by any user specifiable Atom class method...</span> | 
|  | 255  242 <span class="c">#</span> | 
|  | 256 <a name="GetAtoms-"></a> 243 <span class="k">sub </span><span class="m">GetAtoms</span> <span class="s">{</span> | 
|  | 257  244   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomCheckMethodName</span><span class="cm">,</span> <span class="i">$NegateMethodResult</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 258  245   <span class="k">my</span><span class="s">(</span><span class="i">@Atoms</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 259  246 | 
|  | 260  247   <span class="i">@Atoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 261  248 | 
|  | 262  249   <span class="i">@AtomIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 263  250   <span class="k">if</span> <span class="s">(</span>!<span class="i">@AtomIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 264  251     <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Atoms</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@Atoms</span><span class="sc">;</span> | 
|  | 265  252   <span class="s">}</span> | 
|  | 266  253 | 
|  | 267  254   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetVerticesProperty</span><span class="s">(</span><span class="q">'Atom'</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 268  255 | 
|  | 269  256   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$AtomCheckMethodName</span><span class="s">)</span> <span class="s">{</span> | 
|  | 270  257     <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Atoms</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@Atoms</span><span class="sc">;</span> | 
|  | 271  258   <span class="s">}</span> | 
|  | 272  259   <span class="i">$NegateMethodResult</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$NegateMethodResult</span><span class="s">)</span> &&  <span class="i">$NegateMethodResult</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 273  260 | 
|  | 274  261   <span class="c"># Filter out atoms...</span> | 
|  | 275  262   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="cm">,</span> <span class="i">$KeepAtom</span><span class="cm">,</span> <span class="i">@FilteredAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 276  263   <span class="i">@FilteredAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 277  264   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 278  265     <span class="i">$KeepAtom</span> = <span class="i">$NegateMethodResult</span> ? <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->$AtomCheckMethodName</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="co">:</span> <span class="i">$Atom</span><span class="i">->$AtomCheckMethodName</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 279  266     <span class="k">if</span> <span class="s">(</span><span class="i">$KeepAtom</span><span class="s">)</span> <span class="s">{</span> | 
|  | 280  267       <span class="k">push</span> <span class="i">@FilteredAtoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="sc">;</span> | 
|  | 281  268     <span class="s">}</span> | 
|  | 282  269   <span class="s">}</span> | 
|  | 283  270   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@FilteredAtoms</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@FilteredAtoms</span><span class="sc">;</span> | 
|  | 284  271 <span class="s">}</span> | 
|  | 285  272 | 
|  | 286  273 <span class="c"># Return an array of bonds. In scalar context, it returns number of bonds...</span> | 
|  | 287 <a name="GetBonds-"></a> 274 <span class="k">sub </span><span class="m">GetBonds</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   <span class="k">my</span><span class="s">(</span><span class="i">@Bonds</span><span class="cm">,</span> <span class="i">@EdgesAtomsIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 290  277 | 
|  | 291  278   <span class="i">@Bonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@EdgesAtomsIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 292  279 | 
|  | 293  280   <span class="i">@EdgesAtomsIDs</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 294  281   <span class="k">if</span> <span class="s">(</span><span class="i">@EdgesAtomsIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 295  282     <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetEdgesProperty</span><span class="s">(</span><span class="q">'Bond'</span><span class="cm">,</span> <span class="i">@EdgesAtomsIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 296  283   <span class="s">}</span> | 
|  | 297  284   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Bonds</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@Bonds</span><span class="sc">;</span> | 
|  | 298  285 <span class="s">}</span> | 
|  | 299  286 | 
|  | 300  287 <span class="c"># Get number of atoms in molecule...</span> | 
|  | 301 <a name="GetNumOfAtoms-"></a> 288 <span class="k">sub </span><span class="m">GetNumOfAtoms</span> <span class="s">{</span> | 
|  | 302  289   <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> | 
|  | 303  290   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 304  291 | 
|  | 305  292   <span class="i">$NumOfAtoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 306  293 | 
|  | 307  294   <span class="k">return</span> <span class="i">$NumOfAtoms</span><span class="sc">;</span> | 
|  | 308  295 <span class="s">}</span> | 
|  | 309  296 | 
|  | 310  297 <span class="c"># Get number of bonds in molecule...</span> | 
|  | 311 <a name="GetNumOfBonds-"></a> 298 <span class="k">sub </span><span class="m">GetNumOfBonds</span> <span class="s">{</span> | 
|  | 312  299   <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> | 
|  | 313  300   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 314  301 | 
|  | 315  302   <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> | 
|  | 316  303 | 
|  | 317  304   <span class="k">return</span> <span class="i">$NumOfBonds</span><span class="sc">;</span> | 
|  | 318  305 <span class="s">}</span> | 
|  | 319  306 | 
|  | 320  307 <span class="c"># Get number of heavy atoms in molecule...</span> | 
|  | 321 <a name="GetNumOfHeavyAtoms-"></a> 308 <span class="k">sub </span><span class="m">GetNumOfHeavyAtoms</span> <span class="s">{</span> | 
|  | 322  309   <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> | 
|  | 323  310 | 
|  | 324  311   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 325  312 <span class="s">}</span> | 
|  | 326  313 | 
|  | 327  314 <span class="c"># Get number of non-hydrogen atoms in molecule...</span> | 
|  | 328 <a name="GetNumOfNonHydrogenAtoms-"></a> 315 <span class="k">sub </span><span class="m">GetNumOfNonHydrogenAtoms</span> <span class="s">{</span> | 
|  | 329  316   <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> | 
|  | 330  317   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfNonHydrogenAtoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 331  318 | 
|  | 332  319   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 333  320   <span class="i">$NumOfNonHydrogenAtoms</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 334  321   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 335  322     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 336  323       <span class="i">$NumOfNonHydrogenAtoms</span>++<span class="sc">;</span> | 
|  | 337  324     <span class="s">}</span> | 
|  | 338  325   <span class="s">}</span> | 
|  | 339  326   <span class="k">return</span> <span class="i">$NumOfNonHydrogenAtoms</span><span class="sc">;</span> | 
|  | 340  327 <span class="s">}</span> | 
|  | 341  328 | 
|  | 342  329 <span class="c"># Get number of hydrogen atoms in molecule...</span> | 
|  | 343 <a name="GetNumOfHydrogenAtoms-"></a> 330 <span class="k">sub </span><span class="m">GetNumOfHydrogenAtoms</span> <span class="s">{</span> | 
|  | 344  331   <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> | 
|  | 345  332   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfHydrogenAtoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 346  333 | 
|  | 347  334   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 348  335   <span class="i">$NumOfHydrogenAtoms</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 349  336   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 350  337     <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 351  338       <span class="i">$NumOfHydrogenAtoms</span>++<span class="sc">;</span> | 
|  | 352  339     <span class="s">}</span> | 
|  | 353  340   <span class="s">}</span> | 
|  | 354  341   <span class="k">return</span> <span class="i">$NumOfHydrogenAtoms</span><span class="sc">;</span> | 
|  | 355  342 <span class="s">}</span> | 
|  | 356  343 | 
|  | 357  344 <span class="c"># Get number of missing hydrogen atoms in molecule...</span> | 
|  | 358 <a name="GetNumOfMissingHydrogenAtoms-"></a> 345 <span class="k">sub </span><span class="m">GetNumOfMissingHydrogenAtoms</span> <span class="s">{</span> | 
|  | 359  346   <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> | 
|  | 360  347   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfMissingHydrogenAtoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 361  348 | 
|  | 362  349   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 363  350   <span class="i">$NumOfMissingHydrogenAtoms</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 364  351   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 365  352     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 366  353       <span class="i">$NumOfMissingHydrogenAtoms</span> += <span class="i">$Atom</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 367  354     <span class="s">}</span> | 
|  | 368  355   <span class="s">}</span> | 
|  | 369  356   <span class="k">return</span> <span class="i">$NumOfMissingHydrogenAtoms</span><span class="sc">;</span> | 
|  | 370  357 <span class="s">}</span> | 
|  | 371  358 | 
|  | 372  359 <span class="c"># Add bond...</span> | 
|  | 373 <a name="AddBond-"></a> 360 <span class="k">sub </span><span class="m">AddBond</span> <span class="s">{</span> | 
|  | 374  361   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 375  362   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 376  363 | 
|  | 377  364   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 378  365   <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">$Atom1</span><span class="s">)</span> && <span class="k">defined</span><span class="s">(</span><span class="i">$Atom2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 379  366     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddBond: No bond added: Both atoms must be specified..."</span><span class="sc">;</span> | 
|  | 380  367     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 381  368   <span class="s">}</span> | 
|  | 382  369   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$Atom1</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$Atom2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 383  370     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddBond: No bond added: Both atoms must be present..."</span><span class="sc">;</span> | 
|  | 384  371     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 385  372   <span class="s">}</span> | 
|  | 386  373   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 387  374     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddBond: No bond added: Bond already exists..."</span><span class="sc">;</span> | 
|  | 388  375     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 389  376   <span class="s">}</span> | 
|  | 390  377   <span class="k">return</span> <span class="i">$This</span><span class="i">->_AddBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 391  378 <span class="s">}</span> | 
|  | 392  379 | 
|  | 393  380 <span class="c"># Add bond...</span> | 
|  | 394 <a name="_AddBond-"></a> 381 <span class="k">sub </span><span class="m">_AddBond</span> <span class="s">{</span> | 
|  | 395  382   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 396  383 | 
|  | 397  384   <span class="c"># Assign bond to this molecule...</span> | 
|  | 398  385   <span class="i">$Bond</span><span class="i">->_SetMolecule</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 399  386 | 
|  | 400  387   <span class="c"># Add it to the graph as an edge...</span> | 
|  | 401  388   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 402  389   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 403  390   <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">$AtomID2</span> = <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 404  391   <span class="i">$This</span><span class="i">->AddEdge</span><span class="s">(</span><span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 405  392   <span class="i">$This</span><span class="i">->SetEdgeProperty</span><span class="s">(</span><span class="q">'Bond'</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 406  393 | 
|  | 407  394   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 408  395 <span class="s">}</span> | 
|  | 409  396 | 
|  | 410  397 <span class="c"># Add Bonds...</span> | 
|  | 411 <a name="AddBonds-"></a> 398 <span class="k">sub </span><span class="m">AddBonds</span> <span class="s">{</span> | 
|  | 412  399   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Bonds</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 413  400 | 
|  | 414  401   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Bonds</span><span class="s">)</span> <span class="s">{</span> | 
|  | 415  402     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddBonds: No bonds added: Bonds list must be specified..."</span><span class="sc">;</span> | 
|  | 416  403     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 417  404   <span class="s">}</span> | 
|  | 418  405   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 419  406   <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> | 
|  | 420  407     <span class="i">$This</span><span class="i">->AddBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 421  408   <span class="s">}</span> | 
|  | 422  409   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 423  410 <span class="s">}</span> | 
|  | 424  411 | 
|  | 425  412 <span class="c"># Create a bond and add it to molecule...</span> | 
|  | 426 <a name="NewBond-"></a> 413 <span class="k">sub </span><span class="m">NewBond</span> <span class="s">{</span> | 
|  | 427  414   <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> | 
|  | 428  415   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 429  416 | 
|  | 430  417   <span class="i">$Bond</span> = <span class="i">new</span> <span class="i">Bond</span><span class="s">(</span><span class="i">%NamesAndValues</span><span class="s">)</span><span class="sc">;</span> | 
|  | 431  418   <span class="i">$This</span><span class="i">->AddBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 432  419 | 
|  | 433  420   <span class="k">return</span> <span class="i">$Bond</span><span class="sc">;</span> | 
|  | 434  421 <span class="s">}</span> | 
|  | 435  422 | 
|  | 436  423 <span class="c"># Delete a bond...</span> | 
|  | 437 <a name="DeleteBond-"></a> 424 <span class="k">sub </span><span class="m">DeleteBond</span> <span class="s">{</span> | 
|  | 438  425   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 439  426 | 
|  | 440  427   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Bond</span><span class="s">)</span> <span class="s">{</span> | 
|  | 441  428     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteBond: No bond deleted: Bond must be specified..."</span><span class="sc">;</span> | 
|  | 442  429     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 443  430   <span class="s">}</span> | 
|  | 444  431   <span class="c"># Does the bond exist in molecule?</span> | 
|  | 445  432   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 446  433     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteBond: No bond deleted: Bond doesn't exist..."</span><span class="sc">;</span> | 
|  | 447  434     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 448  435   <span class="s">}</span> | 
|  | 449  436   <span class="k">return</span> <span class="i">$This</span><span class="i">->_DeleteBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 450  437 <span class="s">}</span> | 
|  | 451  438 | 
|  | 452  439 <span class="c"># Delete bond...</span> | 
|  | 453 <a name="_DeleteBond-"></a> 440 <span class="k">sub </span><span class="m">_DeleteBond</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">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 455  442 | 
|  | 456  443   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 457  444   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 458  445   <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">$AtomID2</span> = <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 459  446   <span class="i">$This</span><span class="i">->DeleteEdge</span><span class="s">(</span><span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 460  447 | 
|  | 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"># Delete bonds...</span> | 
|  | 465 <a name="DeleteBonds-"></a> 452 <span class="k">sub </span><span class="m">DeleteBonds</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">@Bonds</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="i">@Bonds</span><span class="s">)</span> <span class="s">{</span> | 
|  | 469  456     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteBonds: No bonds added: Bonds list must be specified..."</span><span class="sc">;</span> | 
|  | 470  457     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 471  458   <span class="s">}</span> | 
|  | 472  459   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 473  460   <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> | 
|  | 474  461     <span class="i">$This</span><span class="i">->DeleteBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 475  462   <span class="s">}</span> | 
|  | 476  463 | 
|  | 477  464   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 478  465 <span class="s">}</span> | 
|  | 479  466 | 
|  | 480  467 <span class="c"># Has bond...</span> | 
|  | 481 <a name="HasBond-"></a> 468 <span class="k">sub </span><span class="m">HasBond</span> <span class="s">{</span> | 
|  | 482  469   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 483  470   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 484  471 | 
|  | 485  472   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 486  473   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$Atom1</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$Atom2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 487  474     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 488  475   <span class="s">}</span> | 
|  | 489  476   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Bond</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> | 
|  | 490  477     <span class="c"># It's not in molecule...</span> | 
|  | 491  478     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 492  479   <span class="s">}</span> | 
|  | 493  480   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="cm">,</span> <span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 494  481   <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">$AtomID2</span> = <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 495  482   <span class="i">$Molecule</span> = <span class="i">$Bond</span><span class="i">->GetMolecule</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 496  483 | 
|  | 497  484   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasEdge</span><span class="s">(</span><span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Molecule</span><span class="i">->GetID</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> | 
|  | 498  485 <span class="s">}</span> | 
|  | 499  486 | 
|  | 500  487 <span class="c"># Get atom neighbors...</span> | 
|  | 501 <a name="_GetAtomNeighbors-"></a> 488 <span class="k">sub </span><span class="m">_GetAtomNeighbors</span> <span class="s">{</span> | 
|  | 502  489   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 503  490 | 
|  | 504  491   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 505  492 | 
|  | 506  493   <span class="i">@Atoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 507  494   <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 508  495   <span class="i">@AtomIDs</span> = <span class="i">$This</span><span class="i">->GetNeighbors</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 509  496   <span class="k">if</span> <span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 510  497     <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetVerticesProperty</span><span class="s">(</span><span class="q">'Atom'</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 511  498   <span class="s">}</span> | 
|  | 512  499   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Atoms</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@Atoms</span><span class="sc">;</span> | 
|  | 513  500 <span class="s">}</span> | 
|  | 514  501 | 
|  | 515  502 <span class="c"># Get atom bonds...</span> | 
|  | 516 <a name="_GetAtomBonds-"></a> 503 <span class="k">sub </span><span class="m">_GetAtomBonds</span> <span class="s">{</span> | 
|  | 517  504   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 518  505   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="cm">,</span> <span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 519  506 | 
|  | 520  507   <span class="i">@Bonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 521  508   <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 522  509   <span class="i">@AtomIDs</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 523  510   <span class="k">if</span> <span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 524  511     <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">->GetEdgesProperty</span><span class="s">(</span><span class="q">'Bond'</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 525  512   <span class="s">}</span> | 
|  | 526  513   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Bonds</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@Bonds</span><span class="sc">;</span> | 
|  | 527  514 <span class="s">}</span> | 
|  | 528  515 | 
|  | 529  516 <span class="c"># Get bond to specified atom...</span> | 
|  | 530 <a name="_GetBondToAtom-"></a> 517 <span class="k">sub </span><span class="m">_GetBondToAtom</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">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 532  519   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 533  520 | 
|  | 534  521   <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 535  522   <span class="i">$AtomID2</span> = <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 536  523 | 
|  | 537  524   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetEdgeProperty</span><span class="s">(</span><span class="q">'Bond'</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 538  525 <span class="s">}</span> | 
|  | 539  526 | 
|  | 540  527 <span class="c"># Are two specified atoms bonded?</span> | 
|  | 541 <a name="_IsBondedToAtom-"></a> 528 <span class="k">sub </span><span class="m">_IsBondedToAtom</span> <span class="s">{</span> | 
|  | 542  529   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 543  530   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 544  531 | 
|  | 545  532   <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 546  533   <span class="i">$AtomID2</span> = <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 547  534 | 
|  | 548  535   <span class="k">return</span> <span class="i">$This</span><span class="i">->HasEdgeProperty</span><span class="s">(</span><span class="q">'Bond'</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 549  536 <span class="s">}</span> | 
|  | 550  537 | 
|  | 551  538 <span class="c"># Add hydrogens to each atoms in molecule and return total number of hydrogens added...</span> | 
|  | 552 <a name="AddHydrogens-"></a> 539 <span class="k">sub </span><span class="m">AddHydrogens</span> <span class="s">{</span> | 
|  | 553  540   <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> | 
|  | 554  541 | 
|  | 555  542   <span class="k">return</span> <span class="i">$This</span><span class="i">->_AddHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 556  543 <span class="s">}</span> | 
|  | 557  544 | 
|  | 558  545 <span class="c"># Add hydrogens to polar atoms (N, O, P, S) in molecule and return total number of hydrogens added...</span> | 
|  | 559 <a name="AddPolarHydrogens-"></a> 546 <span class="k">sub </span><span class="m">AddPolarHydrogens</span> <span class="s">{</span> | 
|  | 560  547   <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> | 
|  | 561  548   <span class="k">my</span><span class="s">(</span><span class="i">$PolarHydrogensOnly</span><span class="s">)</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 562  549 | 
|  | 563  550   <span class="k">return</span> <span class="i">$This</span><span class="i">->_AddHydrogens</span><span class="s">(</span><span class="i">$PolarHydrogensOnly</span><span class="s">)</span><span class="sc">;</span> | 
|  | 564  551 <span class="s">}</span> | 
|  | 565  552 | 
|  | 566  553 <span class="c"># Add all the hydrogens or hydrogens for polar atoms only...</span> | 
|  | 567  554 <span class="c">#</span> | 
|  | 568  555 <span class="c"># Note:</span> | 
|  | 569  556 <span class="c">#   . The current release of MayaChemTools doesn't assign any hydrogen positions.</span> | 
|  | 570  557 <span class="c">#</span> | 
|  | 571 <a name="_AddHydrogens-"></a> 558 <span class="k">sub </span><span class="m">_AddHydrogens</span> <span class="s">{</span> | 
|  | 572  559   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PolarHydrogensOnly</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 573  560   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="cm">,</span> <span class="i">$NumOfHydrogensAdded</span><span class="cm">,</span> <span class="i">$HydrogenPositionsWarning</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 574  561 | 
|  | 575  562   <span class="k">if</span> <span class="s">(</span>! <span class="k">defined</span> <span class="i">$PolarHydrogensOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 576  563     <span class="i">$PolarHydrogensOnly</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 577  564   <span class="s">}</span> | 
|  | 578  565 | 
|  | 579  566   <span class="i">$NumOfHydrogensAdded</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 580  567   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 581  568   <span class="i">$HydrogenPositionsWarning</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 582  569 | 
|  | 583  570   <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 584  571     <span class="k">if</span> <span class="s">(</span><span class="i">$PolarHydrogensOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 585  572       <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->IsPolarAtom</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 586  573         <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span> | 
|  | 587  574       <span class="s">}</span> | 
|  | 588  575     <span class="s">}</span> | 
|  | 589  576     <span class="i">$NumOfHydrogensAdded</span> += <span class="i">$Atom</span><span class="i">->AddHydrogens</span><span class="s">(</span><span class="i">$HydrogenPositionsWarning</span><span class="s">)</span><span class="sc">;</span> | 
|  | 590  577   <span class="s">}</span> | 
|  | 591  578   <span class="k">return</span> <span class="i">$NumOfHydrogensAdded</span><span class="sc">;</span> | 
|  | 592  579 <span class="s">}</span> | 
|  | 593  580 | 
|  | 594  581 <span class="c"># Delete all hydrogens atoms in molecule and return total number of hydrogens removed...</span> | 
|  | 595 <a name="DeleteHydrogens-"></a> 582 <span class="k">sub </span><span class="m">DeleteHydrogens</span> <span class="s">{</span> | 
|  | 596  583   <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> | 
|  | 597  584 | 
|  | 598  585   <span class="k">return</span> <span class="i">$This</span><span class="i">->_DeleteHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 599  586 <span class="s">}</span> | 
|  | 600  587 | 
|  | 601  588 <span class="c"># Delete hydrogens to polar atoms (N, O, P, S) in molecule and return total number of hydrogens removed...</span> | 
|  | 602 <a name="DeletePolarHydrogens-"></a> 589 <span class="k">sub </span><span class="m">DeletePolarHydrogens</span> <span class="s">{</span> | 
|  | 603  590   <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> | 
|  | 604  591   <span class="k">my</span><span class="s">(</span><span class="i">$PolarHydrogensOnly</span><span class="s">)</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 605  592 | 
|  | 606  593   <span class="k">return</span> <span class="i">$This</span><span class="i">->_DeleteHydrogens</span><span class="s">(</span><span class="i">$PolarHydrogensOnly</span><span class="s">)</span><span class="sc">;</span> | 
|  | 607  594 <span class="s">}</span> | 
|  | 608  595 | 
|  | 609  596 <span class="c"># Delete all hydrogens atoms in molecule and return total number of hydrogens removed...</span> | 
|  | 610 <a name="_DeleteHydrogens-"></a> 597 <span class="k">sub </span><span class="m">_DeleteHydrogens</span> <span class="s">{</span> | 
|  | 611  598   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PolarHydrogensOnly</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 612  599   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="cm">,</span> <span class="i">$NumOfHydrogensRemoved</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 613  600 | 
|  | 614  601   <span class="k">if</span> <span class="s">(</span>! <span class="k">defined</span> <span class="i">$PolarHydrogensOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 615  602     <span class="i">$PolarHydrogensOnly</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 616  603   <span class="s">}</span> | 
|  | 617  604 | 
|  | 618  605   <span class="i">$NumOfHydrogensRemoved</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 619  606   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 620  607 | 
|  | 621  608   <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 622  609     <span class="k">if</span> <span class="s">(</span><span class="i">$PolarHydrogensOnly</span><span class="s">)</span> <span class="s">{</span> | 
|  | 623  610       <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->IsPolarHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 624  611         <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span> | 
|  | 625  612       <span class="s">}</span> | 
|  | 626  613     <span class="s">}</span> | 
|  | 627  614     <span class="k">elsif</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 628  615       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span> | 
|  | 629  616     <span class="s">}</span> | 
|  | 630  617     <span class="i">$This</span><span class="i">->_DeleteAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 631  618     <span class="i">$NumOfHydrogensRemoved</span>++<span class="sc">;</span> | 
|  | 632  619   <span class="s">}</span> | 
|  | 633  620   <span class="k">return</span> <span class="i">$NumOfHydrogensRemoved</span><span class="sc">;</span> | 
|  | 634  621 <span class="s">}</span> | 
|  | 635  622 | 
|  | 636  623 <span class="c"># Get molecular weight by summing up atomic weights of all the atoms...</span> | 
|  | 637 <a name="GetMolecularWeight-"></a> 624 <span class="k">sub </span><span class="m">GetMolecularWeight</span> <span class="s">{</span> | 
|  | 638  625   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 639  626   <span class="k">my</span><span class="s">(</span><span class="i">$MolecularWeight</span><span class="cm">,</span> <span class="i">$AtomicWeight</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 640  627 | 
|  | 641  628   <span class="i">$IncludeMissingHydrogens</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> ? <span class="i">$IncludeMissingHydrogens</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 642  629 | 
|  | 643  630   <span class="i">$MolecularWeight</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 644  631   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 645  632   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 646  633     <span class="i">$AtomicWeight</span> = <span class="i">$Atom</span><span class="i">->GetAtomicWeight</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 647  634     <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> | 
|  | 648  635       <span class="i">$MolecularWeight</span> += <span class="i">$AtomicWeight</span><span class="sc">;</span> | 
|  | 649  636     <span class="s">}</span> | 
|  | 650  637   <span class="s">}</span> | 
|  | 651  638 | 
|  | 652  639   <span class="k">if</span> <span class="s">(</span>!<span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> <span class="s">{</span> | 
|  | 653  640     <span class="k">return</span> <span class="i">$MolecularWeight</span><span class="sc">;</span> | 
|  | 654  641   <span class="s">}</span> | 
|  | 655  642 | 
|  | 656  643   <span class="c"># Account for missing hydrogen atoms...</span> | 
|  | 657  644   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfMissingHydrogenAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 658  645 | 
|  | 659  646   <span class="i">$NumOfMissingHydrogenAtoms</span> = <span class="i">$This</span><span class="i">->GetNumOfMissingHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 660  647   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfMissingHydrogenAtoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 661  648     <span class="i">$MolecularWeight</span> += <span class="i">$NumOfMissingHydrogenAtoms</span> * <span class="i">PeriodicTable::GetElementAtomicWeight</span><span class="s">(</span><span class="q">'H'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 662  649   <span class="s">}</span> | 
|  | 663  650 | 
|  | 664  651   <span class="k">return</span> <span class="i">$MolecularWeight</span><span class="sc">;</span> | 
|  | 665  652 <span class="s">}</span> | 
|  | 666  653 | 
|  | 667  654 <span class="c"># Get exact mass by summing up exact masses of all the atoms...</span> | 
|  | 668 <a name="GetExactMass-"></a> 655 <span class="k">sub </span><span class="m">GetExactMass</span> <span class="s">{</span> | 
|  | 669  656   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 670  657   <span class="k">my</span><span class="s">(</span><span class="i">$ExactMass</span><span class="cm">,</span> <span class="i">$AtomicMass</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 671  658 | 
|  | 672  659   <span class="i">$IncludeMissingHydrogens</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> ? <span class="i">$IncludeMissingHydrogens</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 673  660 | 
|  | 674  661   <span class="i">$ExactMass</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 675  662   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 676  663   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 677  664     <span class="i">$AtomicMass</span> = <span class="i">$Atom</span><span class="i">->GetExactMass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 678  665     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$AtomicMass</span><span class="s">)</span> <span class="s">{</span> | 
|  | 679  666       <span class="i">$ExactMass</span> += <span class="i">$AtomicMass</span><span class="sc">;</span> | 
|  | 680  667     <span class="s">}</span> | 
|  | 681  668   <span class="s">}</span> | 
|  | 682  669 | 
|  | 683  670   <span class="k">if</span> <span class="s">(</span>!<span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> <span class="s">{</span> | 
|  | 684  671     <span class="k">return</span> <span class="i">$ExactMass</span><span class="sc">;</span> | 
|  | 685  672   <span class="s">}</span> | 
|  | 686  673 | 
|  | 687  674   <span class="c"># Account for missing hydrogen atoms...</span> | 
|  | 688  675   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfMissingHydrogenAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 689  676 | 
|  | 690  677   <span class="i">$NumOfMissingHydrogenAtoms</span> = <span class="i">$This</span><span class="i">->GetNumOfMissingHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 691  678   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfMissingHydrogenAtoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 692  679     <span class="i">$ExactMass</span> += <span class="i">$NumOfMissingHydrogenAtoms</span> * <span class="i">PeriodicTable::GetElementMostAbundantNaturalIsotopeMass</span><span class="s">(</span><span class="q">'H'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 693  680   <span class="s">}</span> | 
|  | 694  681 | 
|  | 695  682   <span class="k">return</span> <span class="i">$ExactMass</span><span class="sc">;</span> | 
|  | 696  683 <span class="s">}</span> | 
|  | 697  684 | 
|  | 698  685 <span class="c"># Get net formal charge on the molecule using one of the following two methods:</span> | 
|  | 699  686 <span class="c">#   . Using explicitly set FormalCharge property</span> | 
|  | 700  687 <span class="c">#   . Adding up formal charge on each atom in the molecule</span> | 
|  | 701  688 <span class="c">#</span> | 
|  | 702  689 <span class="c"># Caveats:</span> | 
|  | 703  690 <span class="c">#   . FormalCharge is different from Charge property of the molecule which corresponds to</span> | 
|  | 704  691 <span class="c">#     sum of partial atomic charges explicitly set for each atom using a specific methodology.</span> | 
|  | 705  692 <span class="c">#</span> | 
|  | 706 <a name="GetFormalCharge-"></a> 693 <span class="k">sub </span><span class="m">GetFormalCharge</span> <span class="s">{</span> | 
|  | 707  694   <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> | 
|  | 708  695 | 
|  | 709  696   <span class="c"># Is FormalCharge property explicitly set?</span> | 
|  | 710  697   <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> | 
|  | 711  698     <span class="k">return</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> | 
|  | 712  699   <span class="s">}</span> | 
|  | 713  700   <span class="k">my</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="cm">,</span> <span class="i">$AtomicFormalCharge</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 714  701 | 
|  | 715  702   <span class="i">$FormalCharge</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 716  703   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 717  704   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 718  705     <span class="i">$AtomicFormalCharge</span> = <span class="i">$Atom</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 719  706     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$AtomicFormalCharge</span><span class="s">)</span> <span class="s">{</span> | 
|  | 720  707       <span class="i">$FormalCharge</span> += <span class="i">$AtomicFormalCharge</span><span class="sc">;</span> | 
|  | 721  708     <span class="s">}</span> | 
|  | 722  709   <span class="s">}</span> | 
|  | 723  710   <span class="k">return</span> <span class="i">$FormalCharge</span><span class="sc">;</span> | 
|  | 724  711 <span class="s">}</span> | 
|  | 725  712 | 
|  | 726  713 <span class="c"># Get net charge on the molecule using one of the following two methods:</span> | 
|  | 727  714 <span class="c">#   . Using explicitly set Charge property</span> | 
|  | 728  715 <span class="c">#   . Adding up charge on each atom in the molecule</span> | 
|  | 729  716 <span class="c">#</span> | 
|  | 730  717 <span class="c"># Caveats:</span> | 
|  | 731  718 <span class="c">#   . FormalCharge is different from Charge property of the molecule which corresponds to</span> | 
|  | 732  719 <span class="c">#     sum of partial atomic charges explicitly set for each atom using a specific methodology.</span> | 
|  | 733  720 <span class="c">#</span> | 
|  | 734 <a name="GetCharge-"></a> 721 <span class="k">sub </span><span class="m">GetCharge</span> <span class="s">{</span> | 
|  | 735  722   <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> | 
|  | 736  723 | 
|  | 737  724   <span class="c"># Is Charge property explicitly set?</span> | 
|  | 738  725   <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">'Charge'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 739  726     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Charge'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 740  727   <span class="s">}</span> | 
|  | 741  728   <span class="k">my</span><span class="s">(</span><span class="i">$Charge</span><span class="cm">,</span> <span class="i">$AtomicCharge</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 742  729 | 
|  | 743  730   <span class="i">$Charge</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 744  731   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 745  732   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 746  733     <span class="i">$AtomicCharge</span> = <span class="i">$Atom</span><span class="i">->GetCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 747  734     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$AtomicCharge</span><span class="s">)</span> <span class="s">{</span> | 
|  | 748  735       <span class="i">$Charge</span> += <span class="i">$AtomicCharge</span><span class="sc">;</span> | 
|  | 749  736     <span class="s">}</span> | 
|  | 750  737   <span class="s">}</span> | 
|  | 751  738   <span class="k">return</span> <span class="i">$Charge</span><span class="sc">;</span> | 
|  | 752  739 <span class="s">}</span> | 
|  | 753  740 | 
|  | 754  741 <span class="c"># Get total SpinMultiplicity for the molecule using one of the following two methods:</span> | 
|  | 755  742 <span class="c">#   . Using explicitly set SpinMultiplicity property</span> | 
|  | 756  743 <span class="c">#   . Adding up SpinMultiplicity on each atom in the molecule</span> | 
|  | 757  744 <span class="c">#</span> | 
|  | 758  745 <span class="c">#</span> | 
|  | 759 <a name="GetSpinMultiplicity-"></a> 746 <span class="k">sub </span><span class="m">GetSpinMultiplicity</span> <span class="s">{</span> | 
|  | 760  747   <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> | 
|  | 761  748 | 
|  | 762  749   <span class="c"># Is SpinMultiplicity property explicitly set?</span> | 
|  | 763  750   <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> | 
|  | 764  751     <span class="k">return</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> | 
|  | 765  752   <span class="s">}</span> | 
|  | 766  753   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicSpinMultiplicity</span><span class="cm">,</span> <span class="i">$SpinMultiplicity</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 767  754 | 
|  | 768  755   <span class="i">$SpinMultiplicity</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 769  756   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 770  757   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 771  758     <span class="i">$AtomicSpinMultiplicity</span> = <span class="i">$Atom</span><span class="i">->GetSpinMultiplicity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 772  759     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$AtomicSpinMultiplicity</span><span class="s">)</span> <span class="s">{</span> | 
|  | 773  760       <span class="i">$SpinMultiplicity</span> += <span class="i">$AtomicSpinMultiplicity</span><span class="sc">;</span> | 
|  | 774  761     <span class="s">}</span> | 
|  | 775  762   <span class="s">}</span> | 
|  | 776  763   <span class="k">return</span> <span class="i">$SpinMultiplicity</span><span class="sc">;</span> | 
|  | 777  764 <span class="s">}</span> | 
|  | 778  765 | 
|  | 779  766 <span class="c"># Get total FreeRadicalElectrons for the molecule using one of the following two methods:</span> | 
|  | 780  767 <span class="c">#   . Using explicitly set FreeRadicalElectrons property</span> | 
|  | 781  768 <span class="c">#   . Adding up FreeRadicalElectrons on each atom in the molecule</span> | 
|  | 782  769 <span class="c">#</span> | 
|  | 783  770 <span class="c">#</span> | 
|  | 784 <a name="GetFreeRadicalElectrons-"></a> 771 <span class="k">sub </span><span class="m">GetFreeRadicalElectrons</span> <span class="s">{</span> | 
|  | 785  772   <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> | 
|  | 786  773 | 
|  | 787  774   <span class="c"># Is FreeRadicalElectrons property explicitly set?</span> | 
|  | 788  775   <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> | 
|  | 789  776     <span class="k">return</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> | 
|  | 790  777   <span class="s">}</span> | 
|  | 791  778   <span class="k">my</span><span class="s">(</span><span class="i">$AtomicFreeRadicalElectrons</span><span class="cm">,</span> <span class="i">$FreeRadicalElectrons</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 792  779 | 
|  | 793  780   <span class="i">$FreeRadicalElectrons</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 794  781   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 795  782   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 796  783     <span class="i">$AtomicFreeRadicalElectrons</span> = <span class="i">$Atom</span><span class="i">->GetFreeRadicalElectrons</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 797  784     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$AtomicFreeRadicalElectrons</span><span class="s">)</span> <span class="s">{</span> | 
|  | 798  785       <span class="i">$FreeRadicalElectrons</span> += <span class="i">$AtomicFreeRadicalElectrons</span><span class="sc">;</span> | 
|  | 799  786     <span class="s">}</span> | 
|  | 800  787   <span class="s">}</span> | 
|  | 801  788   <span class="k">return</span> <span class="i">$FreeRadicalElectrons</span><span class="sc">;</span> | 
|  | 802  789 <span class="s">}</span> | 
|  | 803  790 | 
|  | 804  791 <span class="c"># Set valence model...</span> | 
|  | 805  792 <span class="c">#</span> | 
|  | 806 <a name="SetValenceModel-"></a> 793 <span class="k">sub </span><span class="m">SetValenceModel</span> <span class="s">{</span> | 
|  | 807  794   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ValenceModel</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 808  795 | 
|  | 809  796   <span class="k">if</span> <span class="s">(</span><span class="i">$ValenceModel</span> !~ <span class="q">/^(MDLValenceModel|DaylightValenceModel|InternalValenceModel|MayaChemToolsValenceModel)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 810  797     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetValenceModel: The current release of MayaChemTools doesn't support the specified valence model $ValenceModel. Supported valence models: MDLValenceModel, DaylightValenceModel, InternalValenceModel or MayaChemToolsValenceModel. Using internal valence model..."</span><span class="sc">;</span> | 
|  | 811  798     <span class="i">$ValenceModel</span> = <span class="q">'InternalValenceModel'</span><span class="sc">;</span> | 
|  | 812  799   <span class="s">}</span> | 
|  | 813  800 | 
|  | 814  801   <span class="i">$This</span><span class="i">->SetProperty</span><span class="s">(</span><span class="q">'ValenceModel'</span><span class="cm">,</span> <span class="i">$ValenceModel</span><span class="s">)</span><span class="sc">;</span> | 
|  | 815  802 | 
|  | 816  803   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 817  804 <span class="s">}</span> | 
|  | 818  805 | 
|  | 819  806 <span class="c"># Get valence model...</span> | 
|  | 820  807 <span class="c">#</span> | 
|  | 821 <a name="GetValenceModel-"></a> 808 <span class="k">sub </span><span class="m">GetValenceModel</span> <span class="s">{</span> | 
|  | 822  809   <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> | 
|  | 823  810 | 
|  | 824  811   <span class="c"># Is ValenceModel property explicitly set?</span> | 
|  | 825  812   <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">'ValenceModel'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 826  813     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'ValenceModel'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 827  814   <span class="s">}</span> | 
|  | 828  815 | 
|  | 829  816   <span class="c"># Used internal valence model as default model...</span> | 
|  | 830  817   <span class="k">return</span> <span class="q">'InternalValenceModel'</span><span class="sc">;</span> | 
|  | 831  818 <span class="s">}</span> | 
|  | 832  819 | 
|  | 833  820 <span class="c"># Get molecular formula by collecting information about all atoms in the molecule and</span> | 
|  | 834  821 <span class="c"># composing the formula using Hills ordering system:</span> | 
|  | 835  822 <span class="c">#   . C shows up first and H follows assuming C is present</span> | 
|  | 836  823 <span class="c">#   . All other standard elements are sorted alphanumerically</span> | 
|  | 837  824 <span class="c">#   . All other non-stanard atom symbols are also sorted alphanumerically and follow standard elements</span> | 
|  | 838  825 <span class="c">#</span> | 
|  | 839  826 <span class="c"># Caveats:</span> | 
|  | 840  827 <span class="c">#   . By default, missing hydrogens and nonelements are also included</span> | 
|  | 841  828 <span class="c">#   . Elements for disconnected fragments are combined into the same formula</span> | 
|  | 842  829 <span class="c">#</span> | 
|  | 843  830 <span class="c"># Handle formula generation for disconnected structures. e.g: molecule generated by</span> | 
|  | 844  831 <span class="c"># [Na+].[O-]c1ccccc1</span> | 
|  | 845  832 <span class="c">#</span> | 
|  | 846 <a name="GetMolecularFormula-"></a> 833 <span class="k">sub </span><span class="m">GetMolecularFormula</span> <span class="s">{</span> | 
|  | 847  834   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$IncludeMissingHydrogens</span><span class="cm">,</span> <span class="i">$IncludeNonElements</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 848  835   <span class="k">my</span><span class="s">(</span><span class="i">$MolecularFormula</span><span class="cm">,</span> <span class="i">$AtomSymbol</span><span class="cm">,</span> <span class="i">$ElementsCountRef</span><span class="cm">,</span> <span class="i">$NonElementsCountRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 849  836 | 
|  | 850  837   <span class="i">$IncludeMissingHydrogens</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> ? <span class="i">$IncludeMissingHydrogens</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 851  838   <span class="i">$IncludeNonElements</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$IncludeNonElements</span><span class="s">)</span> ? <span class="i">$IncludeNonElements</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 852  839 | 
|  | 853  840   <span class="c"># Get elements count and setup molecular formula...</span> | 
|  | 854  841   <span class="s">(</span><span class="i">$ElementsCountRef</span><span class="cm">,</span> <span class="i">$NonElementsCountRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetElementsAndNonElements</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span><span class="sc">;</span> | 
|  | 855  842   <span class="i">$MolecularFormula</span> = <span class="q">''</span><span class="sc">;</span> | 
|  | 856  843 | 
|  | 857  844   <span class="c"># Count C and H first...</span> | 
|  | 858  845   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ElementsCountRef</span>->{<span class="w">C</span>} <span class="s">)</span> <span class="s">{</span> | 
|  | 859  846     <span class="i">$MolecularFormula</span> .= <span class="q">'C'</span> . <span class="s">(</span><span class="i">$ElementsCountRef</span>->{<span class="w">C</span>} > <span class="n">1</span> ? <span class="i">$ElementsCountRef</span>->{<span class="w">C</span>} <span class="co">:</span> <span class="q">''</span><span class="s">)</span><span class="sc">;</span> | 
|  | 860  847     <span class="k">delete</span> <span class="i">$ElementsCountRef</span>->{<span class="w">C</span>}<span class="sc">;</span> | 
|  | 861  848 | 
|  | 862  849     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ElementsCountRef</span>->{<span class="w">H</span>} <span class="s">)</span> <span class="s">{</span> | 
|  | 863  850       <span class="i">$MolecularFormula</span> .= <span class="q">'H'</span> . <span class="s">(</span><span class="i">$ElementsCountRef</span>->{<span class="w">H</span>} > <span class="n">1</span> ? <span class="i">$ElementsCountRef</span>->{<span class="w">H</span>} <span class="co">:</span> <span class="q">''</span><span class="s">)</span><span class="sc">;</span> | 
|  | 864  851       <span class="k">delete</span> <span class="i">$ElementsCountRef</span>->{<span class="w">H</span>}<span class="sc">;</span> | 
|  | 865  852     <span class="s">}</span> | 
|  | 866  853   <span class="s">}</span> | 
|  | 867  854 | 
|  | 868  855   <span class="c"># Sort elements...</span> | 
|  | 869  856   <span class="k">for</span> <span class="i">$AtomSymbol</span> <span class="s">(</span><span class="k">sort</span> <span class="s">{</span><span class="i">$a</span> <span class="k">cmp</span> <span class="i">$b</span><span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$ElementsCountRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 870  857     <span class="i">$MolecularFormula</span> .= <span class="i">$AtomSymbol</span> . <span class="s">(</span><span class="i">$ElementsCountRef</span>->{<span class="i">$AtomSymbol</span>} > <span class="n">1</span> ? <span class="i">$ElementsCountRef</span>->{<span class="i">$AtomSymbol</span>} <span class="co">:</span> <span class="q">''</span><span class="s">)</span><span class="sc">;</span> | 
|  | 871  858   <span class="s">}</span> | 
|  | 872  859 | 
|  | 873  860   <span class="c"># Sort non-elements...</span> | 
|  | 874  861   <span class="k">if</span> <span class="s">(</span><span class="i">$IncludeNonElements</span><span class="s">)</span> <span class="s">{</span> | 
|  | 875  862     <span class="k">for</span> <span class="i">$AtomSymbol</span> <span class="s">(</span><span class="k">sort</span> <span class="s">{</span><span class="i">$a</span> <span class="k">cmp</span> <span class="i">$b</span><span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$NonElementsCountRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 876  863       <span class="i">$MolecularFormula</span> .= <span class="i">$AtomSymbol</span> . <span class="s">(</span><span class="i">$NonElementsCountRef</span>->{<span class="i">$AtomSymbol</span>} > <span class="n">1</span> ? <span class="i">$NonElementsCountRef</span>->{<span class="i">$AtomSymbol</span>} <span class="co">:</span> <span class="q">''</span><span class="s">)</span><span class="sc">;</span> | 
|  | 877  864     <span class="s">}</span> | 
|  | 878  865   <span class="s">}</span> | 
|  | 879  866 | 
|  | 880  867   <span class="c"># Check formal charge...</span> | 
|  | 881  868   <span class="k">my</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 882  869   <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> | 
|  | 883  870   <span class="k">if</span> <span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span> <span class="s">{</span> | 
|  | 884  871     <span class="c"># Setup formal charge string...</span> | 
|  | 885  872     <span class="k">my</span><span class="s">(</span><span class="i">$FormalChargeString</span><span class="s">)</span><span class="sc">;</span> | 
|  | 886  873     <span class="k">if</span> <span class="s">(</span><span class="i">$FormalCharge</span> == <span class="n">1</span> <span class="s">)</span> <span class="s">{</span> | 
|  | 887  874       <span class="i">$FormalChargeString</span> =  <span class="q">"+"</span><span class="sc">;</span> | 
|  | 888  875     <span class="s">}</span> | 
|  | 889  876     <span class="k">elsif</span> <span class="s">(</span><span class="i">$FormalCharge</span> == <span class="n">-1</span> <span class="s">)</span> <span class="s">{</span> | 
|  | 890  877       <span class="i">$FormalChargeString</span> =  <span class="q">"-"</span><span class="sc">;</span> | 
|  | 891  878     <span class="s">}</span> | 
|  | 892  879     <span class="k">else</span> <span class="s">{</span> | 
|  | 893  880       <span class="i">$FormalChargeString</span> = <span class="s">(</span><span class="i">$FormalCharge</span> > <span class="n">0</span><span class="s">)</span> ? <span class="s">(</span><span class="q">"+"</span> . <span class="k">abs</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span><span class="s">)</span> <span class="co">:</span> <span class="s">(</span><span class="q">"-"</span> . <span class="k">abs</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 894  881     <span class="s">}</span> | 
|  | 895  882     <span class="i">$MolecularFormula</span> = <span class="q">"${MolecularFormula}${FormalChargeString}"</span><span class="sc">;</span> | 
|  | 896  883   <span class="s">}</span> | 
|  | 897  884 | 
|  | 898  885   <span class="k">return</span> <span class="i">$MolecularFormula</span><span class="sc">;</span> | 
|  | 899  886 <span class="s">}</span> | 
|  | 900  887 | 
|  | 901  888 <span class="c"># Count elements and non-elements in molecule and return references to hashes</span> | 
|  | 902  889 <span class="c"># containing count of elements and non-elements respectively. By default, missing</span> | 
|  | 903  890 <span class="c"># hydrogens are not added to the element hash.</span> | 
|  | 904  891 <span class="c">#</span> | 
|  | 905  892 <span class="c">#</span> | 
|  | 906 <a name="GetElementsAndNonElements-"></a> 893 <span class="k">sub </span><span class="m">GetElementsAndNonElements</span> <span class="s">{</span> | 
|  | 907  894   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 908  895   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="cm">,</span> <span class="i">$AtomicNumber</span><span class="cm">,</span> <span class="i">$AtomSymbol</span><span class="cm">,</span> <span class="i">$NumOfMissingHydrogens</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="cm">,</span> <span class="i">%ElementsCount</span><span class="cm">,</span> <span class="i">%NonElementsCount</span><span class="s">)</span><span class="sc">;</span> | 
|  | 909  896 | 
|  | 910  897   <span class="i">$IncludeMissingHydrogens</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> ? <span class="i">$IncludeMissingHydrogens</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 911  898 | 
|  | 912  899   <span class="i">%ElementsCount</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">%NonElementsCount</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 913  900   <span class="i">$NumOfMissingHydrogens</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 914  901 | 
|  | 915  902   <span class="c"># Count elements and non elements...</span> | 
|  | 916  903   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 917  904   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 918  905     <span class="i">$AtomicNumber</span> = <span class="i">$Atom</span><span class="i">->GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 919  906     <span class="i">$AtomSymbol</span> = <span class="i">$Atom</span><span class="i">->GetAtomSymbol</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 920  907     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 921  908       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ElementsCount</span>{<span class="i">$AtomSymbol</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 922  909         <span class="i">$ElementsCount</span>{<span class="i">$AtomSymbol</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 923  910       <span class="s">}</span> | 
|  | 924  911       <span class="k">else</span> <span class="s">{</span> | 
|  | 925  912         <span class="i">$ElementsCount</span>{<span class="i">$AtomSymbol</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 926  913       <span class="s">}</span> | 
|  | 927  914       <span class="k">if</span> <span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> <span class="s">{</span> | 
|  | 928  915         <span class="i">$NumOfMissingHydrogens</span> += <span class="i">$Atom</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 929  916       <span class="s">}</span> | 
|  | 930  917     <span class="s">}</span> | 
|  | 931  918     <span class="k">else</span> <span class="s">{</span> | 
|  | 932  919       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$NonElementsCount</span>{<span class="i">$AtomSymbol</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 933  920         <span class="i">$NonElementsCount</span>{<span class="i">$AtomSymbol</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 934  921       <span class="s">}</span> | 
|  | 935  922       <span class="k">else</span> <span class="s">{</span> | 
|  | 936  923         <span class="i">$NonElementsCount</span>{<span class="i">$AtomSymbol</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 937  924       <span class="s">}</span> | 
|  | 938  925     <span class="s">}</span> | 
|  | 939  926   <span class="s">}</span> | 
|  | 940  927   <span class="k">if</span> <span class="s">(</span><span class="i">$IncludeMissingHydrogens</span> && <span class="i">$NumOfMissingHydrogens</span><span class="s">)</span> <span class="s">{</span> | 
|  | 941  928     <span class="i">$AtomSymbol</span> = <span class="q">'H'</span><span class="sc">;</span> | 
|  | 942  929     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ElementsCount</span>{<span class="i">$AtomSymbol</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 943  930       <span class="i">$ElementsCount</span>{<span class="i">$AtomSymbol</span>} += <span class="i">$NumOfMissingHydrogens</span><span class="sc">;</span> | 
|  | 944  931     <span class="s">}</span> | 
|  | 945  932     <span class="k">else</span> <span class="s">{</span> | 
|  | 946  933       <span class="i">$ElementsCount</span>{<span class="i">$AtomSymbol</span>} = <span class="i">$NumOfMissingHydrogens</span><span class="sc">;</span> | 
|  | 947  934     <span class="s">}</span> | 
|  | 948  935   <span class="s">}</span> | 
|  | 949  936 | 
|  | 950  937   <span class="k">return</span> <span class="s">(</span>\<span class="i">%ElementsCount</span><span class="cm">,</span> \<span class="i">%NonElementsCount</span><span class="s">)</span><span class="sc">;</span> | 
|  | 951  938 <span class="s">}</span> | 
|  | 952  939 | 
|  | 953  940 <span class="c"># Get number of element and non-elements in molecule. By default, missing</span> | 
|  | 954  941 <span class="c"># hydrogens are not added to element count.</span> | 
|  | 955  942 <span class="c">#</span> | 
|  | 956 <a name="GetNumOfElementsAndNonElements-"></a> 943 <span class="k">sub </span><span class="m">GetNumOfElementsAndNonElements</span> <span class="s">{</span> | 
|  | 957  944   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 958  945   <span class="k">my</span><span class="s">(</span><span class="i">$ElementCount</span><span class="cm">,</span> <span class="i">$NonElementCount</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 959  946 | 
|  | 960  947   <span class="i">$IncludeMissingHydrogens</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> ? <span class="i">$IncludeMissingHydrogens</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 961  948 | 
|  | 962  949   <span class="s">(</span><span class="i">$ElementCount</span><span class="cm">,</span> <span class="i">$NonElementCount</span><span class="s">)</span> = <span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 963  950 | 
|  | 964  951   <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 965  952     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 966  953       <span class="i">$NonElementCount</span>++<span class="sc">;</span> | 
|  | 967  954       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span> | 
|  | 968  955     <span class="s">}</span> | 
|  | 969  956     <span class="c"># Process element...</span> | 
|  | 970  957     <span class="i">$ElementCount</span>++<span class="sc">;</span> | 
|  | 971  958     <span class="k">if</span> <span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> <span class="s">{</span> | 
|  | 972  959       <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 973  960         <span class="i">$ElementCount</span> += <span class="i">$Atom</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 974  961       <span class="s">}</span> | 
|  | 975  962     <span class="s">}</span> | 
|  | 976  963   <span class="s">}</span> | 
|  | 977  964 | 
|  | 978  965   <span class="k">return</span> <span class="s">(</span><span class="i">$ElementCount</span><span class="cm">,</span> <span class="i">$NonElementCount</span><span class="s">)</span><span class="sc">;</span> | 
|  | 979  966 <span class="s">}</span> | 
|  | 980  967 | 
|  | 981  968 <span class="c"># Calculate elemental composition and return reference to arrays</span> | 
|  | 982  969 <span class="c"># containing elements and their percent composition.</span> | 
|  | 983  970 <span class="c">#</span> | 
|  | 984  971 <span class="c"># Caveats:</span> | 
|  | 985  972 <span class="c">#   . By default, missing hydrogens are included</span> | 
|  | 986  973 <span class="c">#   . Non elemnents are ignored</span> | 
|  | 987  974 <span class="c">#   . Mass number are ignored</span> | 
|  | 988  975 <span class="c">#</span> | 
|  | 989 <a name="GetElementalComposition-"></a> 976 <span class="k">sub </span><span class="m">GetElementalComposition</span> <span class="s">{</span> | 
|  | 990  977   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 991  978   <span class="k">my</span><span class="s">(</span><span class="i">$MolecularFormula</span><span class="cm">,</span> <span class="i">$IncludeNonElements</span><span class="cm">,</span> <span class="i">$ElementsCountRef</span><span class="cm">,</span> <span class="i">$NonElementsCountRef</span><span class="cm">,</span> <span class="i">$ElementsRef</span><span class="cm">,</span> <span class="i">$ElementsCompositionRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 992  979 | 
|  | 993  980   <span class="i">$IncludeMissingHydrogens</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> ? <span class="i">$IncludeMissingHydrogens</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 994  981 | 
|  | 995  982   <span class="i">$IncludeNonElements</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 996  983   <span class="s">(</span><span class="i">$ElementsCountRef</span><span class="cm">,</span> <span class="i">$NonElementsCountRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetElementsAndNonElements</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span><span class="sc">;</span> | 
|  | 997  984 | 
|  | 998  985   <span class="i">$MolecularFormula</span> = <span class="i">$This</span><span class="i">->GetMolecularFormula</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="cm">,</span> <span class="i">$IncludeNonElements</span><span class="s">)</span><span class="sc">;</span> | 
|  | 999  986 | 
|  | 1000  987   <span class="s">(</span><span class="i">$ElementsRef</span><span class="cm">,</span> <span class="i">$ElementsCompositionRef</span><span class="s">)</span> = <span class="i">MolecularFormula::CalculateElementalComposition</span><span class="s">(</span><span class="i">$MolecularFormula</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1001  988 | 
|  | 1002  989   <span class="k">return</span> <span class="s">(</span><span class="i">$ElementsRef</span><span class="cm">,</span> <span class="i">$ElementsCompositionRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1003  990 <span class="s">}</span> | 
|  | 1004  991 | 
|  | 1005  992 <span class="c"># Using refernece to element and its composition arrays, format composition information</span> | 
|  | 1006  993 <span class="c"># as: Element: Composition;...</span> | 
|  | 1007  994 <span class="c">#</span> | 
|  | 1008 <a name="FormatElementalCompositionInformation-"></a> 995 <span class="k">sub </span><span class="m">FormatElementalCompositionInformation</span> <span class="s">{</span> | 
|  | 1009  996   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="cm">,</span> <span class="i">$FourthParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1010  997   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ElementsRef</span><span class="cm">,</span> <span class="i">$ElementCompositionRef</span><span class="cm">,</span> <span class="i">$Precision</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1011  998 | 
|  | 1012  999   <span class="k">if</span> <span class="s">(</span><span class="i">_IsMolecule</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1013 1000     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ElementsRef</span><span class="cm">,</span> <span class="i">$ElementCompositionRef</span><span class="cm">,</span> <span class="i">$Precision</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="cm">,</span> <span class="i">$FourthParameter</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1014 1001   <span class="s">}</span> | 
|  | 1015 1002   <span class="k">else</span> <span class="s">{</span> | 
|  | 1016 1003     <span class="s">(</span><span class="i">$ElementsRef</span><span class="cm">,</span> <span class="i">$ElementCompositionRef</span><span class="cm">,</span> <span class="i">$Precision</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1017 1004   <span class="s">}</span> | 
|  | 1018 1005   <span class="k">my</span><span class="s">(</span><span class="i">$FormattedInfo</span><span class="s">)</span> = <span class="q">''</span><span class="sc">;</span> | 
|  | 1019 1006 | 
|  | 1020 1007   <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">$ElementsRef</span><span class="s">)</span> && <span class="i">@</span>{<span class="i">$ElementsRef</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1021 1008     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->FormatElementalCompositionInformation: Elements list is not defined or empty..."</span><span class="sc">;</span> | 
|  | 1022 1009     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1023 1010   <span class="s">}</span> | 
|  | 1024 1011   <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">$ElementCompositionRef</span><span class="s">)</span> && <span class="i">@</span>{<span class="i">$ElementCompositionRef</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1025 1012     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->FormatElementalCompositionInformation: Elements composition list is not defined or empty..."</span><span class="sc">;</span> | 
|  | 1026 1013     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1027 1014   <span class="s">}</span> | 
|  | 1028 1015 | 
|  | 1029 1016   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Precision</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1030 1017     <span class="i">$Precision</span> = <span class="n">2</span><span class="sc">;</span> | 
|  | 1031 1018   <span class="s">}</span> | 
|  | 1032 1019 | 
|  | 1033 1020   <span class="i">$FormattedInfo</span> = <span class="i">MolecularFormula::FormatCompositionInfomation</span><span class="s">(</span><span class="i">$ElementsRef</span><span class="cm">,</span> <span class="i">$ElementCompositionRef</span><span class="cm">,</span> <span class="i">$Precision</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1034 1021 | 
|  | 1035 1022   <span class="k">return</span> <span class="i">$FormattedInfo</span><span class="sc">;</span> | 
|  | 1036 1023 <span class="s">}</span> | 
|  | 1037 1024 | 
|  | 1038 1025 <span class="c"># Copy molecule and its associated data using Storable::dclone and update:</span> | 
|  | 1039 1026 <span class="c">#</span> | 
|  | 1040 1027 <span class="c">#   o Atom references corresponding atoms and bonds objects</span> | 
|  | 1041 1028 <span class="c">#   o Bond object references</span> | 
|  | 1042 1029 <span class="c">#</span> | 
|  | 1043 1030 <span class="c"># Object IDs for Atoms and Bonds don't get changed. So there is no need to clear</span> | 
|  | 1044 1031 <span class="c"># up any exisiting ring data attached to molecule via graph as vertex IDs.</span> | 
|  | 1045 1032 <span class="c">#</span> | 
|  | 1046 <a name="Copy-"></a>1033 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span> | 
|  | 1047 1034   <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> | 
|  | 1048 1035   <span class="k">my</span><span class="s">(</span><span class="i">$NewMolecule</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$NewAtom</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="cm">,</span> <span class="i">%AtomsIDsToNewAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1049 1036 | 
|  | 1050 1037   <span class="i">$NewMolecule</span> = <span class="i">Storable::dclone</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1051 1038 | 
|  | 1052 1039   <span class="c"># Update atom references stored as vertex property...</span> | 
|  | 1053 1040 | 
|  | 1054 1041   <span class="i">@Atoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1055 1042   <span class="i">%AtomsIDsToNewAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1056 1043 | 
|  | 1057 1044   <span class="i">@AtomIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1058 1045   <span class="k">if</span> <span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1059 1046     <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetVerticesProperty</span><span class="s">(</span><span class="q">'Atom'</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1060 1047   <span class="s">}</span> | 
|  | 1061 1048 | 
|  | 1062 1049   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1063 1050     <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1064 1051 | 
|  | 1065 1052     <span class="c"># Setup a reference to copied atom object...</span> | 
|  | 1066 1053     <span class="i">$NewAtom</span> = <span class="i">$Atom</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1067 1054     <span class="i">$AtomsIDsToNewAtoms</span>{<span class="i">$AtomID</span>} = <span class="i">$NewAtom</span><span class="sc">;</span> | 
|  | 1068 1055 | 
|  | 1069 1056     <span class="c"># Update atom reference to new atom object...</span> | 
|  | 1070 1057     <span class="i">$NewMolecule</span><span class="i">->UpdateVertexProperty</span><span class="s">(</span><span class="q">'Atom'</span><span class="cm">,</span> <span class="i">$NewAtom</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1071 1058   <span class="s">}</span> | 
|  | 1072 1059 | 
|  | 1073 1060   <span class="c"># Update bond object and bond atom references stored as edge property...</span> | 
|  | 1074 1061   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$NewBond</span><span class="cm">,</span> <span class="i">$NewAtom1</span><span class="cm">,</span> <span class="i">$NewAtom2</span><span class="cm">,</span> <span class="i">@EdgesAtomsIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1075 1062   <span class="i">@EdgesAtomsIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1076 1063   <span class="i">@EdgesAtomsIDs</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1077 1064   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> < <span class="i">$#EdgesAtomsIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1078 1065     <span class="i">$AtomID1</span> = <span class="i">$EdgesAtomsIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$AtomID2</span> = <span class="i">$EdgesAtomsIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span> | 
|  | 1079 1066 | 
|  | 1080 1067     <span class="c"># Get reference to bond object...</span> | 
|  | 1081 1068     <span class="i">$Bond</span> = <span class="i">$This</span><span class="i">->GetEdgeProperty</span><span class="s">(</span><span class="q">'Bond'</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1082 1069 | 
|  | 1083 1070     <span class="c"># Make a new bond object and update its atom references...</span> | 
|  | 1084 1071     <span class="i">$NewBond</span> = <span class="i">$Bond</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1085 1072     <span class="i">$NewAtom1</span> = <span class="i">$AtomsIDsToNewAtoms</span>{<span class="i">$AtomID1</span>}<span class="sc">;</span> | 
|  | 1086 1073     <span class="i">$NewAtom2</span> = <span class="i">$AtomsIDsToNewAtoms</span>{<span class="i">$AtomID2</span>}<span class="sc">;</span> | 
|  | 1087 1074     <span class="i">$NewBond</span><span class="i">->SetAtoms</span><span class="s">(</span><span class="i">$NewAtom1</span><span class="cm">,</span> <span class="i">$NewAtom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1088 1075 | 
|  | 1089 1076     <span class="c"># Update bond object reference in the new molecule...</span> | 
|  | 1090 1077     <span class="i">$NewMolecule</span><span class="i">->UpdateEdgeProperty</span><span class="s">(</span><span class="q">'Bond'</span><span class="cm">,</span> <span class="i">$NewBond</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1091 1078   <span class="s">}</span> | 
|  | 1092 1079 | 
|  | 1093 1080   <span class="k">return</span> <span class="i">$NewMolecule</span><span class="sc">;</span> | 
|  | 1094 1081 <span class="s">}</span> | 
|  | 1095 1082 | 
|  | 1096 1083 <span class="c"># Get number of connected components...</span> | 
|  | 1097 1084 <span class="c">#</span> | 
|  | 1098 <a name="GetNumOfConnectedComponents-"></a>1085 <span class="k">sub </span><span class="m">GetNumOfConnectedComponents</span> <span class="s">{</span> | 
|  | 1099 1086   <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> | 
|  | 1100 1087   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfComponents</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1101 1088 | 
|  | 1102 1089   <span class="i">$NumOfComponents</span> = <span class="i">$This</span><span class="i">->GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1103 1090 | 
|  | 1104 1091   <span class="k">return</span> <span class="i">$NumOfComponents</span><span class="sc">;</span> | 
|  | 1105 1092 <span class="s">}</span> | 
|  | 1106 1093 | 
|  | 1107 1094 <span class="c"># Return a reference to an array containing molecules corresponding</span> | 
|  | 1108 1095 <span class="c"># to connected components sorted in decreasing order of component size...</span> | 
|  | 1109 1096 <span class="c">#</span> | 
|  | 1110 <a name="GetConnectedComponents-"></a>1097 <span class="k">sub </span><span class="m">GetConnectedComponents</span> <span class="s">{</span> | 
|  | 1111 1098   <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> | 
|  | 1112 1099   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">@ComponentMolecules</span><span class="cm">,</span> <span class="i">@ConnectedComponents</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1113 1100 | 
|  | 1114 1101   <span class="i">@ConnectedComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1115 1102   <span class="i">@ConnectedComponents</span> = <span class="i">$This</span><span class="i">->GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1116 1103   <span class="i">@ComponentMolecules</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1117 1104 | 
|  | 1118 1105   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#ConnectedComponents</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1119 1106     <span class="k">push</span> <span class="i">@ComponentMolecules</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->_GetConnectedComponent</span><span class="s">(</span>\<span class="i">@ConnectedComponents</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1120 1107   <span class="s">}</span> | 
|  | 1121 1108   <span class="k">return</span> <span class="i">@ComponentMolecules</span><span class="sc">;</span> | 
|  | 1122 1109 <span class="s">}</span> | 
|  | 1123 1110 | 
|  | 1124 1111 <span class="c"># Return a reference to largest connected component as a molecule object...</span> | 
|  | 1125 1112 <span class="c">#</span> | 
|  | 1126 <a name="GetLargestConnectedComponent-"></a>1113 <span class="k">sub </span><span class="m">GetLargestConnectedComponent</span> <span class="s">{</span> | 
|  | 1127 1114   <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> | 
|  | 1128 1115   <span class="k">my</span><span class="s">(</span><span class="i">$LargestComponentIndex</span><span class="cm">,</span> <span class="i">@ConnectedComponents</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1129 1116 | 
|  | 1130 1117   <span class="i">$LargestComponentIndex</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1131 1118   <span class="i">@ConnectedComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1132 1119   <span class="i">@ConnectedComponents</span> = <span class="i">$This</span><span class="i">->GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1133 1120 | 
|  | 1134 1121   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetConnectedComponent</span><span class="s">(</span>\<span class="i">@ConnectedComponents</span><span class="cm">,</span> <span class="i">$LargestComponentIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1135 1122 <span class="s">}</span> | 
|  | 1136 1123 | 
|  | 1137 1124 <span class="c"># Return connected component as a molecule...</span> | 
|  | 1138 1125 <span class="c">#</span> | 
|  | 1139 <a name="_GetConnectedComponent-"></a>1126 <span class="k">sub </span><span class="m">_GetConnectedComponent</span> <span class="s">{</span> | 
|  | 1140 1127   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ConnectedComponentsRef</span><span class="cm">,</span> <span class="i">$ComponentIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1141 1128   <span class="k">my</span><span class="s">(</span><span class="i">$ComponentMolecule</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1142 1129 | 
|  | 1143 1130   <span class="c"># Copy existing molecule...</span> | 
|  | 1144 1131   <span class="i">$ComponentMolecule</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1145 1132 | 
|  | 1146 1133   <span class="c"># Delete all atoms besides the ones in specified component...</span> | 
|  | 1147 1134   <span class="i">$ComponentMolecule</span><span class="i">->_DeleteConnectedComponents</span><span class="s">(</span><span class="i">$ConnectedComponentsRef</span><span class="cm">,</span> <span class="i">$ComponentIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1148 1135 | 
|  | 1149 1136   <span class="c"># Clear any deteced rings...</span> | 
|  | 1150 1137   <span class="k">if</span> <span class="s">(</span><span class="i">$ComponentMolecule</span><span class="i">->HasRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1151 1138     <span class="i">$ComponentMolecule</span><span class="i">->ClearRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1152 1139   <span class="s">}</span> | 
|  | 1153 1140   <span class="k">return</span> <span class="i">$ComponentMolecule</span><span class="sc">;</span> | 
|  | 1154 1141 <span class="s">}</span> | 
|  | 1155 1142 | 
|  | 1156 1143 <span class="c"># Delete atoms corresponding to all connected components except the one specified...</span> | 
|  | 1157 1144 <span class="c">#</span> | 
|  | 1158 <a name="_DeleteConnectedComponents-"></a>1145 <span class="k">sub </span><span class="m">_DeleteConnectedComponents</span> <span class="s">{</span> | 
|  | 1159 1146   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ConnectedComponentsRef</span><span class="cm">,</span> <span class="i">$KeepComponentIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1160 1147   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1161 1148 | 
|  | 1162 1149   <span class="j">INDEX:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$ConnectedComponentsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1163 1150     <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> == <span class="i">$KeepComponentIndex</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1164 1151       <span class="k">next</span> <span class="j">INDEX</span><span class="sc">;</span> | 
|  | 1165 1152     <span class="s">}</span> | 
|  | 1166 1153     <span class="k">for</span> <span class="i">$AtomID</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConnectedComponentsRef</span>->[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span> | 
|  | 1167 1154       <span class="i">$This</span><span class="i">->DeleteVertex</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1168 1155     <span class="s">}</span> | 
|  | 1169 1156   <span class="s">}</span> | 
|  | 1170 1157   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1171 1158 <span class="s">}</span> | 
|  | 1172 1159 | 
|  | 1173 1160 <span class="c"># Return an array containing references to atom arrays corresponding to atoms of</span> | 
|  | 1174 1161 <span class="c"># connected components sorted in order of their decreasing size...</span> | 
|  | 1175 1162 <span class="c">#</span> | 
|  | 1176 <a name="GetConnectedComponentsAtoms-"></a>1163 <span class="k">sub </span><span class="m">GetConnectedComponentsAtoms</span> <span class="s">{</span> | 
|  | 1177 1164   <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> | 
|  | 1178 1165   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">@ComponentsAtoms</span><span class="cm">,</span> <span class="i">@ConnectedComponents</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1179 1166 | 
|  | 1180 1167   <span class="i">@ConnectedComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1181 1168   <span class="i">@ConnectedComponents</span> = <span class="i">$This</span><span class="i">->GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1182 1169 | 
|  | 1183 1170   <span class="i">@ComponentsAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1184 1171   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#ConnectedComponents</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1185 1172     <span class="k">my</span><span class="s">(</span><span class="i">@ComponentAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1186 1173 | 
|  | 1187 1174     <span class="i">@ComponentAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1188 1175     <span class="i">@ComponentAtoms</span> = <span class="i">$This</span><span class="i">->_GetConnectedComponentAtoms</span><span class="s">(</span>\<span class="i">@ConnectedComponents</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1189 1176     <span class="k">push</span> <span class="i">@ComponentsAtoms</span><span class="cm">,</span> \<span class="i">@ComponentAtoms</span><span class="sc">;</span> | 
|  | 1190 1177   <span class="s">}</span> | 
|  | 1191 1178   <span class="k">return</span> <span class="i">@ComponentsAtoms</span><span class="sc">;</span> | 
|  | 1192 1179 <span class="s">}</span> | 
|  | 1193 1180 | 
|  | 1194 1181 <span class="c"># Return an array containing atoms correspondig to largest connected component...</span> | 
|  | 1195 1182 <span class="c">#</span> | 
|  | 1196 <a name="GetLargestConnectedComponentAtoms-"></a>1183 <span class="k">sub </span><span class="m">GetLargestConnectedComponentAtoms</span> <span class="s">{</span> | 
|  | 1197 1184   <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> | 
|  | 1198 1185   <span class="k">my</span><span class="s">(</span><span class="i">$LargestComponentIndex</span><span class="cm">,</span> <span class="i">@ConnectedComponents</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1199 1186 | 
|  | 1200 1187   <span class="i">$LargestComponentIndex</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1201 1188   <span class="i">@ConnectedComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1202 1189   <span class="i">@ConnectedComponents</span> = <span class="i">$This</span><span class="i">->GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1203 1190 | 
|  | 1204 1191   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetConnectedComponentAtoms</span><span class="s">(</span>\<span class="i">@ConnectedComponents</span><span class="cm">,</span> <span class="i">$LargestComponentIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1205 1192 <span class="s">}</span> | 
|  | 1206 1193 | 
|  | 1207 1194 <span class="c"># Return an array containing atoms corresponding to specified connected component...</span> | 
|  | 1208 1195 <span class="c">#</span> | 
|  | 1209 <a name="_GetConnectedComponentAtoms-"></a>1196 <span class="k">sub </span><span class="m">_GetConnectedComponentAtoms</span> <span class="s">{</span> | 
|  | 1210 1197   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ConnectedComponentsRef</span><span class="cm">,</span> <span class="i">$ComponentIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1211 1198   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="cm">,</span> <span class="i">@ComponentAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1212 1199 | 
|  | 1213 1200   <span class="i">@ComponentAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1214 1201   <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1215 1202 | 
|  | 1216 1203   <span class="k">for</span> <span class="i">$AtomID</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConnectedComponentsRef</span>->[<span class="i">$ComponentIndex</span>]}<span class="s">)</span> <span class="s">{</span> | 
|  | 1217 1204     <span class="k">push</span> <span class="i">@AtomIDs</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="sc">;</span> | 
|  | 1218 1205   <span class="s">}</span> | 
|  | 1219 1206   <span class="i">@ComponentAtoms</span> = <span class="i">$This</span><span class="i">->_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1220 1207 | 
|  | 1221 1208   <span class="k">return</span> <span class="i">@ComponentAtoms</span><span class="sc">;</span> | 
|  | 1222 1209 <span class="s">}</span> | 
|  | 1223 1210 | 
|  | 1224 1211 <span class="c"># Except for the largest connected component, delete atoms corresponding to all other</span> | 
|  | 1225 1212 <span class="c"># connected components...</span> | 
|  | 1226 1213 <span class="c">#</span> | 
|  | 1227 <a name="KeepLargestComponent-"></a>1214 <span class="k">sub </span><span class="m">KeepLargestComponent</span> <span class="s">{</span> | 
|  | 1228 1215   <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> | 
|  | 1229 1216   <span class="k">my</span><span class="s">(</span><span class="i">$LargestComponentIndex</span><span class="cm">,</span> <span class="i">@ConnectedComponents</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1230 1217 | 
|  | 1231 1218   <span class="i">@ConnectedComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1232 1219   <span class="i">@ConnectedComponents</span> = <span class="i">$This</span><span class="i">->GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1233 1220   <span class="k">if</span> <span class="s">(</span><span class="i">@ConnectedComponents</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1234 1221     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1235 1222   <span class="s">}</span> | 
|  | 1236 1223   <span class="i">$LargestComponentIndex</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1237 1224   <span class="i">$This</span><span class="i">->_DeleteConnectedComponents</span><span class="s">(</span>\<span class="i">@ConnectedComponents</span><span class="cm">,</span> <span class="i">$LargestComponentIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1238 1225 | 
|  | 1239 1226   <span class="c"># Clear any deteced rings...</span> | 
|  | 1240 1227   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1241 1228     <span class="i">$This</span><span class="i">->ClearRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1242 1229   <span class="s">}</span> | 
|  | 1243 1230 | 
|  | 1244 1231   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1245 1232 <span class="s">}</span> | 
|  | 1246 1233 | 
|  | 1247 1234 <span class="c"># Get an array of topologically sorted atoms starting from a specified atom or</span> | 
|  | 1248 1235 <span class="c"># an arbitrary atom in the molecule...</span> | 
|  | 1249 1236 <span class="c">#</span> | 
|  | 1250 <a name="GetTopologicallySortedAtoms-"></a>1237 <span class="k">sub </span><span class="m">GetTopologicallySortedAtoms</span> <span class="s">{</span> | 
|  | 1251 1238   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1252 1239   <span class="k">my</span><span class="s">(</span><span class="i">@SortedAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1253 1240 | 
|  | 1254 1241   <span class="i">@SortedAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1255 1242   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$StartAtom</span><span class="s">)</span> && !<span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$StartAtom</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1256 1243     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetTopologicallySortedAtoms: No atoms retrieved: Start atom doesn't exist..."</span><span class="sc">;</span> | 
|  | 1257 1244     <span class="k">return</span> <span class="i">@SortedAtoms</span><span class="sc">;</span> | 
|  | 1258 1245   <span class="s">}</span> | 
|  | 1259 1246   <span class="k">my</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1260 1247 | 
|  | 1261 1248   <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1262 1249   <span class="i">$StartAtomID</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$StartAtom</span><span class="s">)</span> ? <span class="i">$StartAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1263 1250 | 
|  | 1264 1251   <span class="i">@AtomIDs</span> = <span class="i">$This</span><span class="i">->GetTopologicallySortedVertices</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1265 1252   <span class="i">@SortedAtoms</span> = <span class="i">$This</span><span class="i">->_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1266 1253 | 
|  | 1267 1254   <span class="k">return</span> <span class="i">@SortedAtoms</span><span class="sc">;</span> | 
|  | 1268 1255 <span class="s">}</span> | 
|  | 1269 1256 | 
|  | 1270 1257 <span class="c"># Detect rings in molecule...</span> | 
|  | 1271 1258 <span class="c">#</span> | 
|  | 1272 <a name="DetectRings-"></a>1259 <span class="k">sub </span><span class="m">DetectRings</span> <span class="s">{</span> | 
|  | 1273 1260   <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> | 
|  | 1274 1261 | 
|  | 1275 1262   <span class="c"># Use graph method to detect all cycles and associate 'em to graph as graph</span> | 
|  | 1276 1263   <span class="c"># and vertex properties...</span> | 
|  | 1277 1264   <span class="k">return</span> <span class="i">$This</span><span class="i">->DetectCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1278 1265 <span class="s">}</span> | 
|  | 1279 1266 | 
|  | 1280 1267 <span class="c"># Clear rings in molecule...</span> | 
|  | 1281 1268 <span class="c">#</span> | 
|  | 1282 <a name="ClearRings-"></a>1269 <span class="k">sub </span><span class="m">ClearRings</span> <span class="s">{</span> | 
|  | 1283 1270   <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> | 
|  | 1284 1271 | 
|  | 1285 1272   <span class="c"># Use graph method to clear all cycles...</span> | 
|  | 1286 1273   <span class="i">$This</span><span class="i">->ClearCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1287 1274 | 
|  | 1288 1275   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1289 1276 <span class="s">}</span> | 
|  | 1290 1277 | 
|  | 1291 1278 <span class="c"># Setup rings type paths to use during all ring related methods. Possible values:</span> | 
|  | 1292 1279 <span class="c"># Independent or All. Default is to use Independent rings.</span> | 
|  | 1293 1280 <span class="c">#</span> | 
|  | 1294 <a name="SetActiveRings-"></a>1281 <span class="k">sub </span><span class="m">SetActiveRings</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">$RingsType</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1296 1283 | 
|  | 1297 1284   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$This</span><span class="i">->SetActiveCyclicPaths</span><span class="s">(</span><span class="i">$RingsType</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1298 1285     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1299 1286   <span class="s">}</span> | 
|  | 1300 1287   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1301 1288 <span class="s">}</span> | 
|  | 1302 1289 | 
|  | 1303 1290 <span class="c"># Is it a supported aromaticity model?</span> | 
|  | 1304 1291 <span class="c">#</span> | 
|  | 1305 <a name="IsSupportedAromaticityModel-"></a>1292 <span class="k">sub </span><span class="m">IsSupportedAromaticityModel</span> <span class="s">{</span> | 
|  | 1306 1293   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1307 1294   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AromaticityModel</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1308 1295 | 
|  | 1309 1296   <span class="k">if</span> <span class="s">(</span><span class="i">_IsMolecule</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1310 1297     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AromaticityModel</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1311 1298   <span class="s">}</span> | 
|  | 1312 1299   <span class="k">else</span> <span class="s">{</span> | 
|  | 1313 1300     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AromaticityModel</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1314 1301   <span class="s">}</span> | 
|  | 1315 1302 | 
|  | 1316 1303   <span class="k">return</span> <span class="k">exists</span> <span class="i">$CanonicalAromaticityModelNamesMap</span>{<span class="k">lc</span><span class="s">(</span><span class="i">$AromaticityModel</span><span class="s">)</span>} ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1317 1304 <span class="s">}</span> | 
|  | 1318 1305 | 
|  | 1319 1306 <span class="c"># Get a list of supported aromaticity model names...</span> | 
|  | 1320 1307 <span class="c">#</span> | 
|  | 1321 <a name="GetSupportedAromaticityModels-"></a>1308 <span class="k">sub </span><span class="m">GetSupportedAromaticityModels</span> <span class="s">{</span> | 
|  | 1322 1309   <span class="k">return</span> <span class="s">(</span><span class="k">sort</span> <span class="k">values</span> <span class="i">%CanonicalAromaticityModelNamesMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1323 1310 <span class="s">}</span> | 
|  | 1324 1311 | 
|  | 1325 1312 <span class="c"># Set aromaticity model...</span> | 
|  | 1326 1313 <span class="c">#</span> | 
|  | 1327 <a name="SetAromaticityModel-"></a>1314 <span class="k">sub </span><span class="m">SetAromaticityModel</span> <span class="s">{</span> | 
|  | 1328 1315   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AromaticityModel</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1329 1316 | 
|  | 1330 1317   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsSupportedAromaticityModel</span><span class="s">(</span><span class="i">$AromaticityModel</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1331 1318     <span class="k">my</span><span class="s">(</span><span class="i">@SupportedModels</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetSupportedAromaticityModels</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1332 1319 | 
|  | 1333 1320     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetAromaticityModel: The current release of MayaChemTools doesn't support the specified aromaticity model $AromaticityModel. Supported aromaticity models defined in AromaticityModelsData.csv file are: @SupportedModels . Using MayaChemToolsAromaticityModel..."</span><span class="sc">;</span> | 
|  | 1334 1321     <span class="i">$AromaticityModel</span> = <span class="q">'MayaChemToolsAromaticityModel'</span><span class="sc">;</span> | 
|  | 1335 1322   <span class="s">}</span> | 
|  | 1336 1323 | 
|  | 1337 1324   <span class="i">$This</span><span class="i">->SetProperty</span><span class="s">(</span><span class="q">'AromaticityModel'</span><span class="cm">,</span> <span class="i">$AromaticityModel</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1338 1325 | 
|  | 1339 1326   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1340 1327 <span class="s">}</span> | 
|  | 1341 1328 | 
|  | 1342 1329 <span class="c"># Get aromaticity model...</span> | 
|  | 1343 1330 <span class="c">#</span> | 
|  | 1344 <a name="GetAromaticityModel-"></a>1331 <span class="k">sub </span><span class="m">GetAromaticityModel</span> <span class="s">{</span> | 
|  | 1345 1332   <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> | 
|  | 1346 1333 | 
|  | 1347 1334   <span class="c"># Is ValenceModel 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">'AromaticityModel'</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">'AromaticityModel'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1350 1337   <span class="s">}</span> | 
|  | 1351 1338 | 
|  | 1352 1339   <span class="c"># Used internal aromaticity model as default model...</span> | 
|  | 1353 1340   <span class="k">return</span> <span class="q">'MayaChemToolsAromaticityModel'</span><span class="sc">;</span> | 
|  | 1354 1341 <span class="s">}</span> | 
|  | 1355 1342 | 
|  | 1356 1343 <span class="c"># Identify aromatic rings and ring systems in a molecule and set aromaticity for</span> | 
|  | 1357 1344 <span class="c"># corresponding atoms and bonds.</span> | 
|  | 1358 1345 <span class="c">#</span> | 
|  | 1359 1346 <span class="c"># What is aromaticity? [ Ref 124 ] It's in the code of the implementer, did you</span> | 
|  | 1360 1347 <span class="c"># say? Agree. The implementation of aromaticity varies widely across different</span> | 
|  | 1361 1348 <span class="c"># packages [ Ref 125 ]; additionally, the implementation details are not always</span> | 
|  | 1362 1349 <span class="c"># completely available, and it's not possible to figure out the exact implementation</span> | 
|  | 1363 1350 <span class="c"># of aromaticity across various packages. Using the publicly available information,</span> | 
|  | 1364 1351 <span class="c"># however, one can try to reproduce the available results to the extent possible,</span> | 
|  | 1365 1352 <span class="c"># along with parameterizing all the control parameters used to implement different</span> | 
|  | 1366 1353 <span class="c"># aromaticity models, and that's exactly what the current release of MayaChemTools</span> | 
|  | 1367 1354 <span class="c"># does.</span> | 
|  | 1368 1355 <span class="c">#</span> | 
|  | 1369 1356 <span class="c"># The implementation of aromaticity corresponding to various aromaticity models in</span> | 
|  | 1370 1357 <span class="c"># MayaChemTools package is driven by an external CSV file AromaticityModelsData.csv,</span> | 
|  | 1371 1358 <span class="c"># which is distributed with the package and is available in lib/data directory. The CSV</span> | 
|  | 1372 1359 <span class="c"># files contains names of supported aromaticity models, along with various control</span> | 
|  | 1373 1360 <span class="c"># parameters and their values. This file is loaded and processed during instantiation</span> | 
|  | 1374 1361 <span class="c"># of Molecule class and data corresponding to specific aromaticity model are used</span> | 
|  | 1375 1362 <span class="c"># to detect aromaticity for that model. Any new aromaticity model added to the</span> | 
|  | 1376 1363 <span class="c"># aromaticity data file, using different combinations of values for existing control</span> | 
|  | 1377 1364 <span class="c"># parameters would work without any changes to the code; the addition of any new</span> | 
|  | 1378 1365 <span class="c"># control parameters, however, requires its implementation in the code used to</span> | 
|  | 1379 1366 <span class="c"># calculate number of pi electrons available towards delocalization in a ring or ring</span> | 
|  | 1380 1367 <span class="c"># systems.</span> | 
|  | 1381 1368 <span class="c">#</span> | 
|  | 1382 1369 <span class="c"># The current release of MayaChemTools package supports these aromaticity</span> | 
|  | 1383 1370 <span class="c"># models: MDLAromaticityModel, TriposAromaticityModel, MMFFAromaticityModel,</span> | 
|  | 1384 1371 <span class="c"># ChemAxonBasicAromaticityModel, ChemAxonGeneralAromaticityModel,</span> | 
|  | 1385 1372 <span class="c"># DaylightAromaticityModel, MayaChemToolsAromaticityModel.</span> | 
|  | 1386 1373 <span class="c">#</span> | 
|  | 1387 1374 <span class="c"># The current list of control parameters available to detect aromaticity corresponding</span> | 
|  | 1388 1375 <span class="c"># to different aromaticity models are: AllowHeteroRingAtoms, HeteroRingAtomsList,</span> | 
|  | 1389 1376 <span class="c"># AllowExocyclicDoubleBonds, AllowHomoNuclearExocyclicDoubleBonds,</span> | 
|  | 1390 1377 <span class="c"># AllowElectronegativeRingAtomExocyclicDoubleBonds, AllowRingAtomFormalCharge,</span> | 
|  | 1391 1378 <span class="c"># AllowHeteroRingAtomFormalCharge, MinimumRingSize. The values for these control</span> | 
|  | 1392 1379 <span class="c"># parameters are specified in AromaticityModelsData.csv file.</span> | 
|  | 1393 1380 <span class="c">#</span> | 
|  | 1394 1381 <span class="c"># Although definition of aromaticity differs across various aromaticity models, a ring</span> | 
|  | 1395 1382 <span class="c"># or a ring system containing 4n + 2 pi electrons (Huckel's rule) corresponding to</span> | 
|  | 1396 1383 <span class="c"># alternate single and double bonds, in general, is considered aromatic.</span> | 
|  | 1397 1384 <span class="c">#</span> | 
|  | 1398 1385 <span class="c"># The available valence free electrons on heterocyclic ring atoms, involved in two single</span> | 
|  | 1399 1386 <span class="c"># ring bonds, are also allowed to participate in pi electron delocalizaiton for most of</span> | 
|  | 1400 1387 <span class="c"># the supported aromaticity models.</span> | 
|  | 1401 1388 <span class="c">#</span> | 
|  | 1402 1389 <span class="c"># The presence of exocyclic terminal double bond on ring atoms involved in pi electron</span> | 
|  | 1403 1390 <span class="c"># delocalization is only allowed for some of the aromaticity models. Additionally, the type</span> | 
|  | 1404 1391 <span class="c"># atoms involved in exocyclic terminal double bonds may result in making a ring or ring</span> | 
|  | 1405 1392 <span class="c"># system non-aromatic.</span> | 
|  | 1406 1393 <span class="c">#</span> | 
|  | 1407 <a name="DetectAromaticity-"></a>1394 <span class="k">sub </span><span class="m">DetectAromaticity</span> <span class="s">{</span> | 
|  | 1408 1395   <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> | 
|  | 1409 1396 | 
|  | 1410 1397   <span class="c"># Delete aromaticity property for atoms and bonds...</span> | 
|  | 1411 1398   <span class="i">$This</span><span class="i">->DeleteAromaticity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1412 1399 | 
|  | 1413 1400   <span class="c"># Any ring out there...</span> | 
|  | 1414 1401   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1415 1402     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1416 1403   <span class="s">}</span> | 
|  | 1417 1404 | 
|  | 1418 1405   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasFusedRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1419 1406     <span class="i">$This</span><span class="i">->_DetectAromaticityUsingFusedRingSets</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1420 1407   <span class="s">}</span> | 
|  | 1421 1408   <span class="k">else</span> <span class="s">{</span> | 
|  | 1422 1409     <span class="i">$This</span><span class="i">->_DetectAromaticityUsingIndividualRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1423 1410   <span class="s">}</span> | 
|  | 1424 1411   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1425 1412 <span class="s">}</span> | 
|  | 1426 1413 | 
|  | 1427 1414 <span class="c"># Go over all rings and set aromaticity property for corresponding ring atoms</span> | 
|  | 1428 1415 <span class="c"># and bonds involved in aromatic rings...</span> | 
|  | 1429 1416 <span class="c">#</span> | 
|  | 1430 <a name="_DetectAromaticityUsingIndividualRings-"></a>1417 <span class="k">sub </span><span class="m">_DetectAromaticityUsingIndividualRings</span> <span class="s">{</span> | 
|  | 1431 1418   <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> | 
|  | 1432 1419 | 
|  | 1433 1420   <span class="k">return</span> <span class="i">$This</span><span class="i">->_DetectRingsAromaticity</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1434 1421 <span class="s">}</span> | 
|  | 1435 1422 | 
|  | 1436 1423 <span class="c"># For each fused ring set, detect aromaticity by treating all of its ring as one aromatic</span> | 
|  | 1437 1424 <span class="c"># system for counting pi electrons to satisfy Huckel's rule; In case of a failure, rings in</span> | 
|  | 1438 1425 <span class="c"># fused set are treated individually for aromaticity detection. Additionally, non-fused</span> | 
|  | 1439 1426 <span class="c"># rings are handled on their own during aromaticity detection.</span> | 
|  | 1440 1427 <span class="c">#</span> | 
|  | 1441 1428 <span class="c"># Note:</span> | 
|  | 1442 1429 <span class="c">#   . pi electrons in common bonds involved in fused ring sets are only counted once.</span> | 
|  | 1443 1430 <span class="c">#</span> | 
|  | 1444 1431 <span class="c">#</span> | 
|  | 1445 <a name="_DetectAromaticityUsingFusedRingSets-"></a>1432 <span class="k">sub </span><span class="m">_DetectAromaticityUsingFusedRingSets</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   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$FusedRingSetRef</span><span class="cm">,</span> <span class="i">$FusedRingSetsRef</span><span class="cm">,</span> <span class="i">$NonFusedRingsRef</span><span class="cm">,</span> <span class="i">@FusedRingSetIsAromatic</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1448 1435 | 
|  | 1449 1436   <span class="s">(</span><span class="i">$FusedRingSetsRef</span><span class="cm">,</span> <span class="i">$NonFusedRingsRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetFusedAndNonFusedRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1450 1437 | 
|  | 1451 1438   <span class="i">@FusedRingSetIsAromatic</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1452 1439   <span class="j">RINGSET:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$FusedRingSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1453 1440     <span class="i">$FusedRingSetRef</span> = <span class="i">$FusedRingSetsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1454 1441     <span class="i">$FusedRingSetIsAromatic</span>[<span class="i">$Index</span>] = <span class="n">0</span><span class="sc">;</span> | 
|  | 1455 1442 | 
|  | 1456 1443     <span class="k">my</span><span class="s">(</span><span class="i">$NumOfPiElectronsInRingSet</span><span class="cm">,</span> <span class="i">$NumOfPiElectronsInRing</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$BondID</span><span class="cm">,</span> <span class="i">%FusedRingSetsBondsMap</span><span class="cm">,</span> <span class="i">%FusedRingSetsBondsVisitedMap</span><span class="cm">,</span> <span class="i">%FusedRingBondsMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1457 1444 | 
|  | 1458 1445     <span class="i">$NumOfPiElectronsInRingSet</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1459 1446 | 
|  | 1460 1447     <span class="i">%FusedRingSetsBondsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1461 1448     <span class="i">%FusedRingSetsBondsVisitedMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1462 1449     <span class="i">%FusedRingBondsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1463 1450 | 
|  | 1464 1451     <span class="c"># Setup a bond ID map for all bonds in fused ring set and another one</span> | 
|  | 1465 1452     <span class="c"># for bonds involved in more than one ring...</span> | 
|  | 1466 1453     <span class="c">#</span> | 
|  | 1467 1454     <span class="k">for</span> <span class="i">$RingAtomsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FusedRingSetRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1468 1455       <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetRingBonds</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1469 1456         <span class="i">$BondID</span> = <span class="i">$Bond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1470 1457         <span class="i">$FusedRingSetsBondsMap</span>{<span class="i">$BondID</span>} = <span class="i">$BondID</span><span class="sc">;</span> | 
|  | 1471 1458 | 
|  | 1472 1459         <span class="k">if</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">->GetNumOfRings</span><span class="s">(</span><span class="s">)</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1473 1460           <span class="i">$FusedRingBondsMap</span>{<span class="i">$BondID</span>} = <span class="i">$BondID</span><span class="sc">;</span> | 
|  | 1474 1461         <span class="s">}</span> | 
|  | 1475 1462       <span class="s">}</span> | 
|  | 1476 1463     <span class="s">}</span> | 
|  | 1477 1464 | 
|  | 1478 1465     <span class="k">for</span> <span class="i">$RingAtomsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FusedRingSetRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1479 1466       <span class="k">my</span><span class="s">(</span><span class="i">@RingBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1480 1467 | 
|  | 1481 1468       <span class="i">@RingBonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1482 1469       <span class="i">@RingBonds</span> = <span class="i">$This</span><span class="i">->GetRingBonds</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 1483 1470       <span class="i">$NumOfPiElectronsInRing</span> = <span class="i">$This</span><span class="i">->_GetNumOfPiElectronsAvailableForDelocalization</span><span class="s">(</span><span class="i">$RingAtomsRef</span><span class="cm">,</span> \<span class="i">@RingBonds</span><span class="cm">,</span> \<span class="i">%FusedRingSetsBondsMap</span><span class="cm">,</span> \<span class="i">%FusedRingSetsBondsVisitedMap</span><span class="cm">,</span> \<span class="i">%FusedRingBondsMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1484 1471 | 
|  | 1485 1472       <span class="k">if</span> <span class="s">(</span>!<span class="i">$NumOfPiElectronsInRing</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1486 1473         <span class="k">next</span> <span class="j">RINGSET</span><span class="sc">;</span> | 
|  | 1487 1474       <span class="s">}</span> | 
|  | 1488 1475       <span class="i">$NumOfPiElectronsInRingSet</span> += <span class="i">$NumOfPiElectronsInRing</span><span class="sc">;</span> | 
|  | 1489 1476     <span class="s">}</span> | 
|  | 1490 1477     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->_DoPiElectronSatifyHuckelsRule</span><span class="s">(</span><span class="i">$NumOfPiElectronsInRingSet</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1491 1478       <span class="i">$FusedRingSetIsAromatic</span>[<span class="i">$Index</span>] = <span class="n">1</span><span class="sc">;</span> | 
|  | 1492 1479     <span class="s">}</span> | 
|  | 1493 1480   <span class="s">}</span> | 
|  | 1494 1481 | 
|  | 1495 1482   <span class="c"># Set atom and bond aromatic flags for ring sets whose pi electrons satisfy Huckel's rule; otherwise,</span> | 
|  | 1496 1483   <span class="c"># treat rings in a ring set as individual rings for detecting aromaticity...</span> | 
|  | 1497 1484   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$FusedRingSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1498 1485     <span class="i">$FusedRingSetRef</span> = <span class="i">$FusedRingSetsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1499 1486     <span class="k">if</span> <span class="s">(</span><span class="i">$FusedRingSetIsAromatic</span>[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 1500 1487       <span class="i">$This</span><span class="i">->_SetRingsAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$FusedRingSetRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 1501 1488     <span class="s">}</span> | 
|  | 1502 1489     <span class="k">else</span> <span class="s">{</span> | 
|  | 1503 1490       <span class="i">$This</span><span class="i">->_DetectRingsAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$FusedRingSetRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 1504 1491     <span class="s">}</span> | 
|  | 1505 1492   <span class="s">}</span> | 
|  | 1506 1493 | 
|  | 1507 1494   <span class="i">$This</span><span class="i">->_DetectRingsAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$NonFusedRingsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 1508 1495 | 
|  | 1509 1496   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1510 1497 <span class="s">}</span> | 
|  | 1511 1498 | 
|  | 1512 1499 <span class="c"># Detect and set aromaticity for rings...</span> | 
|  | 1513 1500 <span class="c">#</span> | 
|  | 1514 <a name="_DetectRingsAromaticity-"></a>1501 <span class="k">sub </span><span class="m">_DetectRingsAromaticity</span> <span class="s">{</span> | 
|  | 1515 1502   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Rings</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1516 1503   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$RingBond</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1517 1504 | 
|  | 1518 1505   <span class="j">RING:</span> <span class="k">for</span> <span class="i">$RingAtomsRef</span> <span class="s">(</span><span class="i">@Rings</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1519 1506     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_CheckRingAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1520 1507       <span class="k">next</span> <span class="j">RING</span><span class="sc">;</span> | 
|  | 1521 1508     <span class="s">}</span> | 
|  | 1522 1509     <span class="i">$This</span><span class="i">->_SetRingAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 1523 1510   <span class="s">}</span> | 
|  | 1524 1511   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1525 1512 <span class="s">}</span> | 
|  | 1526 1513 | 
|  | 1527 1514 <span class="c"># Set aromatic property for all all atoms and bonds involved in all specified rings..</span> | 
|  | 1528 1515 <span class="c">#</span> | 
|  | 1529 <a name="_SetRingsAromaticity-"></a>1516 <span class="k">sub </span><span class="m">_SetRingsAromaticity</span> <span class="s">{</span> | 
|  | 1530 1517   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Rings</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1531 1518   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtomsRef</span> <span class="s">)</span><span class="sc">;</span> | 
|  | 1532 1519 | 
|  | 1533 1520   <span class="k">for</span> <span class="i">$RingAtomsRef</span> <span class="s">(</span><span class="i">@Rings</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1534 1521     <span class="i">$This</span><span class="i">->_SetRingAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 1535 1522   <span class="s">}</span> | 
|  | 1536 1523   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1537 1524 <span class="s">}</span> | 
|  | 1538 1525 | 
|  | 1539 1526 <span class="c"># Set aromatic property for all all atoms and bonds involved in ring..</span> | 
|  | 1540 1527 <span class="c">#</span> | 
|  | 1541 <a name="_SetRingAromaticity-"></a>1528 <span class="k">sub </span><span class="m">_SetRingAromaticity</span> <span class="s">{</span> | 
|  | 1542 1529   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@RingAtoms</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1543 1530   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$RingBond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1544 1531 | 
|  | 1545 1532   <span class="k">for</span> <span class="i">$RingAtom</span> <span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1546 1533     <span class="i">$RingAtom</span><span class="i">->SetAromatic</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1547 1534   <span class="s">}</span> | 
|  | 1548 1535   <span class="k">for</span> <span class="i">$RingBond</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetRingBonds</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1549 1536     <span class="i">$RingBond</span><span class="i">->SetAromatic</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1550 1537   <span class="s">}</span> | 
|  | 1551 1538   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1552 1539 <span class="s">}</span> | 
|  | 1553 1540 | 
|  | 1554 1541 | 
|  | 1555 1542 <span class="c"># For a ring to be an aromatic ring, all of its atoms must have aromatic property</span> | 
|  | 1556 1543 <span class="c"># set.</span> | 
|  | 1557 1544 <span class="c">#</span> | 
|  | 1558 <a name="IsRingAromatic-"></a>1545 <span class="k">sub </span><span class="m">IsRingAromatic</span> <span class="s">{</span> | 
|  | 1559 1546   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@RingAtoms</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1560 1547   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1561 1548 | 
|  | 1562 1549   <span class="k">for</span> <span class="i">$RingAtom</span> <span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1563 1550     <span class="k">if</span> <span class="s">(</span>!<span class="i">$RingAtom</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1564 1551       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1565 1552     <span class="s">}</span> | 
|  | 1566 1553   <span class="s">}</span> | 
|  | 1567 1554   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1568 1555 <span class="s">}</span> | 
|  | 1569 1556 | 
|  | 1570 1557 <span class="c"># Delete aromatic property for all atoms and bonds...</span> | 
|  | 1571 1558 <span class="c">#</span> | 
|  | 1572 <a name="DeleteAromaticity-"></a>1559 <span class="k">sub </span><span class="m">DeleteAromaticity</span> <span class="s">{</span> | 
|  | 1573 1560   <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> | 
|  | 1574 1561 | 
|  | 1575 1562   <span class="k">return</span> <span class="i">$This</span><span class="i">->_DeleteAtomsAndBondsAromaticity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1576 1563 <span class="s">}</span> | 
|  | 1577 1564 | 
|  | 1578 1565 <span class="c"># Check ring aromaticity...</span> | 
|  | 1579 1566 <span class="c">#</span> | 
|  | 1580 <a name="_CheckRingAromaticity-"></a>1567 <span class="k">sub </span><span class="m">_CheckRingAromaticity</span> <span class="s">{</span> | 
|  | 1581 1568   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@RingAtoms</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1582 1569   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfPiElectrons</span><span class="cm">,</span> <span class="i">$BondID</span><span class="cm">,</span> <span class="i">@RingBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1583 1570 | 
|  | 1584 1571   <span class="i">@RingBonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1585 1572   <span class="i">@RingBonds</span> = <span class="i">$This</span><span class="i">->GetRingBonds</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1586 1573 | 
|  | 1587 1574   <span class="i">$NumOfPiElectrons</span> = <span class="i">$This</span><span class="i">->_GetNumOfPiElectronsAvailableForDelocalization</span><span class="s">(</span>\<span class="i">@RingAtoms</span><span class="cm">,</span> \<span class="i">@RingBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1588 1575 | 
|  | 1589 1576   <span class="k">return</span> <span class="i">$This</span><span class="i">->_DoPiElectronSatifyHuckelsRule</span><span class="s">(</span><span class="i">$NumOfPiElectrons</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1590 1577 <span class="s">}</span> | 
|  | 1591 1578 | 
|  | 1592 1579 <span class="c"># Get number of pi electrons available for delocalizaiton in a ring or ring system...</span> | 
|  | 1593 1580 <span class="c">#</span> | 
|  | 1594 <a name="_GetNumOfPiElectronsAvailableForDelocalization-"></a>1581 <span class="k">sub </span><span class="m">_GetNumOfPiElectronsAvailableForDelocalization</span> <span class="s">{</span> | 
|  | 1595 1582   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$RingBondsRef</span><span class="cm">,</span> <span class="i">$FusedRingSetsBondsMapRef</span><span class="cm">,</span> <span class="i">$FusedRingSetsBondsVisitedMapRef</span><span class="cm">,</span> <span class="i">$FusedRingBondsMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1596 1583   <span class="k">my</span><span class="s">(</span><span class="i">$AromaticityModelName</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="cm">,</span> <span class="i">$ExocyclicDoubleBondsDataMapRef</span><span class="cm">,</span> <span class="i">$NumOfConjugatedDoubleBonds</span><span class="cm">,</span> <span class="i">$NumOfExplicitAromaticBonds</span><span class="cm">,</span> <span class="i">$NumOfRingAtomElectronPairs</span><span class="cm">,</span> <span class="i">$NumOfRingBondsProcessed</span><span class="cm">,</span> <span class="i">$NumOfPiElectrons</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$RingBond</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$RingAtomSymbol</span><span class="cm">,</span> <span class="i">$BondOrder</span><span class="cm">,</span> <span class="i">$RingAtomID</span><span class="cm">,</span> <span class="i">$RingBondID</span><span class="cm">,</span> <span class="i">$PreviousIndex</span><span class="cm">,</span> <span class="i">$PreviousRingBond</span><span class="cm">,</span> <span class="i">$ExcludeFreeRadicalElectrons</span><span class="cm">,</span> <span class="i">%ElectronPairContributionProcessedMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1597 1584 | 
|  | 1598 1585   <span class="i">$AromaticityModelName</span> = <span class="i">$CanonicalAromaticityModelNamesMap</span>{<span class="k">lc</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetAromaticityModel</span><span class="s">(</span><span class="s">)</span><span class="s">)</span>}<span class="sc">;</span> | 
|  | 1599 1586   <span class="i">$AromaticityModelDataRef</span> = \<span class="i">%</span>{<span class="i">$AromaticityModelsDataMap</span>{<span class="i">$AromaticityModelName</span>}}<span class="sc">;</span> | 
|  | 1600 1587 | 
|  | 1601 1588   <span class="c"># Perform an intial check for potential atomatic ring atoms..</span> | 
|  | 1602 1589   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_CheckRingAtomsForPotentialAromaticity</span><span class="s">(</span><span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$RingBondsRef</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1603 1590     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1604 1591   <span class="s">}</span> | 
|  | 1605 1592 | 
|  | 1606 1593   <span class="i">$ExocyclicDoubleBondsDataMapRef</span> = <span class="k">undef</span><span class="sc">;</span> | 
|  | 1607 1594   <span class="i">$ExcludeFreeRadicalElectrons</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 1608 1595 | 
|  | 1609 1596   <span class="i">%ElectronPairContributionProcessedMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1610 1597 | 
|  | 1611 1598   <span class="s">(</span><span class="i">$NumOfPiElectrons</span><span class="cm">,</span> <span class="i">$NumOfRingBondsProcessed</span><span class="cm">,</span> <span class="i">$NumOfConjugatedDoubleBonds</span><span class="cm">,</span> <span class="i">$NumOfExplicitAromaticBonds</span><span class="cm">,</span> <span class="i">$NumOfRingAtomElectronPairs</span><span class="s">)</span> = <span class="s">(</span><span class="q">'0'</span><span class="s">)</span> x <span class="n">5</span><span class="sc">;</span> | 
|  | 1612 1599 | 
|  | 1613 1600   <span class="c"># Go over ring atoms and bonds to check their participation in aromaticity and count</span> | 
|  | 1614 1601   <span class="c"># pi electrons available for delocalization corresponding to various aromaticity models...</span> | 
|  | 1615 1602   <span class="c">#</span> | 
|  | 1616 1603   <span class="j">RINGBOND:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$RingBondsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1617 1604     <span class="i">$RingBond</span> = <span class="i">$RingBondsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1618 1605     <span class="i">$RingAtom</span> = <span class="i">$RingAtomsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1619 1606     <span class="i">$BondOrder</span> = <span class="i">$RingBond</span><span class="i">->GetBondOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1620 1607 | 
|  | 1621 1608     <span class="c"># Is this ring bond part of a fused ring system which has been already processed?</span> | 
|  | 1622 1609     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$FusedRingSetsBondsVisitedMapRef</span><span class="s">)</span> && <span class="i">$RingBond</span><span class="i">->GetNumOfRings</span><span class="s">(</span><span class="s">)</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1623 1610       <span class="i">$RingBondID</span> = <span class="i">$RingBond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1624 1611       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$FusedRingSetsBondsVisitedMapRef</span>->{<span class="i">$RingBondID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1625 1612         <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span> | 
|  | 1626 1613       <span class="s">}</span> | 
|  | 1627 1614       <span class="i">$FusedRingSetsBondsVisitedMapRef</span>->{<span class="i">$RingBondID</span>} = <span class="i">$RingBondID</span><span class="sc">;</span> | 
|  | 1628 1615     <span class="s">}</span> | 
|  | 1629 1616     <span class="i">$NumOfRingBondsProcessed</span>++<span class="sc">;</span> | 
|  | 1630 1617 | 
|  | 1631 1618     <span class="c"># For first ring, previous ring bond corrresponds to last ring bond...</span> | 
|  | 1632 1619     <span class="i">$PreviousIndex</span> = <span class="i">$Index</span> ? <span class="s">(</span><span class="i">$Index</span> -<span class="n">1</span><span class="s">)</span> <span class="co">:</span> <span class="i">$#</span>{<span class="i">$RingBondsRef</span>}<span class="sc">;</span> | 
|  | 1633 1620     <span class="i">$PreviousRingBond</span> = <span class="i">$RingBondsRef</span>->[<span class="i">$PreviousIndex</span>]<span class="sc">;</span> | 
|  | 1634 1621 | 
|  | 1635 1622     <span class="c"># Check for presence of alternate single/double bond configuration, and pesence of</span> | 
|  | 1636 1623     <span class="c"># hetero atoms with two single ring bonds along with any exocyclic double bonds...</span> | 
|  | 1637 1624     <span class="c">#</span> | 
|  | 1638 1625     <span class="j">BONDORDER:</span> <span class="s">{</span> | 
|  | 1639 1626       <span class="c"># Is current ring double bond in an alternate single/double bond configuration?</span> | 
|  | 1640 1627       <span class="k">if</span> <span class="s">(</span><span class="i">$BondOrder</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1641 1628         <span class="k">if</span> <span class="s">(</span><span class="i">$PreviousRingBond</span><span class="i">->GetBondOrder</span><span class="s">(</span><span class="s">)</span> != <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1642 1629           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1643 1630         <span class="s">}</span> | 
|  | 1644 1631         <span class="i">$NumOfConjugatedDoubleBonds</span> += <span class="n">1</span><span class="sc">;</span> | 
|  | 1645 1632         <span class="k">last</span> <span class="j">BONDORDER</span><span class="sc">;</span> | 
|  | 1646 1633       <span class="s">}</span> | 
|  | 1647 1634 | 
|  | 1648 1635       <span class="c"># Is current ring bond order correspond to an explicit aromatic bond?</span> | 
|  | 1649 1636       <span class="k">if</span> <span class="s">(</span><span class="i">$BondOrder</span> == <span class="n">1.5</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1650 1637         <span class="k">if</span> <span class="s">(</span><span class="i">$PreviousRingBond</span><span class="i">->GetBondOrder</span><span class="s">(</span><span class="s">)</span> != <span class="n">1.5</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1651 1638           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1652 1639         <span class="s">}</span> | 
|  | 1653 1640         <span class="i">$NumOfExplicitAromaticBonds</span> += <span class="n">1</span><span class="sc">;</span> | 
|  | 1654 1641         <span class="k">last</span> <span class="j">BONDORDER</span><span class="sc">;</span> | 
|  | 1655 1642       <span class="s">}</span> | 
|  | 1656 1643 | 
|  | 1657 1644       <span class="c"># Check for potential hetero atoms involved in two single ring bonds along</span> | 
|  | 1658 1645       <span class="c"># with any terminal exocyclic bonds...</span> | 
|  | 1659 1646       <span class="k">if</span> <span class="s">(</span><span class="i">$BondOrder</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1660 1647         <span class="k">if</span> <span class="s">(</span><span class="i">$PreviousRingBond</span><span class="i">->GetBondOrder</span><span class="s">(</span><span class="s">)</span> != <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1661 1648           <span class="c"># Part of a conjugated system...</span> | 
|  | 1662 1649           <span class="k">last</span> <span class="j">BONDORDER</span><span class="sc">;</span> | 
|  | 1663 1650         <span class="s">}</span> | 
|  | 1664 1651 | 
|  | 1665 1652         <span class="c"># Identify any exocylic bonds on rings atoms...</span> | 
|  | 1666 1653         <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ExocyclicDoubleBondsDataMapRef</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1667 1654           <span class="i">$ExocyclicDoubleBondsDataMapRef</span> = <span class="i">$This</span><span class="i">->_IdentifyRingAtomsInvolvedInExocyclicDoubleBonds</span><span class="s">(</span><span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$RingBondsRef</span><span class="cm">,</span> <span class="i">$FusedRingSetsBondsMapRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1668 1655         <span class="s">}</span> | 
|  | 1669 1656 | 
|  | 1670 1657         <span class="c"># Is current ring atom part of an allowed exocyclic terminal bond?</span> | 
|  | 1671 1658         <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_CheckPotentialAromaticRingAtomForExocylicDoubleBonds</span><span class="s">(</span><span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="cm">,</span> <span class="i">$ExocyclicDoubleBondsDataMapRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1672 1659           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1673 1660         <span class="s">}</span> | 
|  | 1674 1661 | 
|  | 1675 1662         <span class="c"># Is it allowed to have any formal charge?</span> | 
|  | 1676 1663         <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_CheckPotentialAromaticRingAtomForFormalCharge</span><span class="s">(</span><span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1677 1664           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1678 1665         <span class="s">}</span> | 
|  | 1679 1666 | 
|  | 1680 1667         <span class="c"># It it an allowed hetero ring atom or a carbon atom?</span> | 
|  | 1681 1668         <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_CheckPotentialAromaticRingAtomForAllowedHeteroAtoms</span><span class="s">(</span><span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1682 1669           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1683 1670         <span class="s">}</span> | 
|  | 1684 1671 | 
|  | 1685 1672         <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1686 1673         <span class="i">$ElectronPairContributionProcessedMap</span>{<span class="i">$RingAtomID</span>} = <span class="i">$RingAtomID</span><span class="sc">;</span> | 
|  | 1687 1674 | 
|  | 1688 1675         <span class="c"># Is it able to donate a pair for electrons towards pi electron delocalization?</span> | 
|  | 1689 1676         <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">->GetValenceFreeElectrons</span><span class="s">(</span><span class="i">$ExcludeFreeRadicalElectrons</span><span class="s">)</span> >= <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1690 1677           <span class="c"># Possibilites:</span> | 
|  | 1691 1678           <span class="c">#   . Hetero atom with or without formal charge and an available electron pair</span> | 
|  | 1692 1679           <span class="c">#   . Carbon atom with -ve formal charge and with an available electron pair</span> | 
|  | 1693 1680           <span class="c">#</span> | 
|  | 1694 1681           <span class="i">$NumOfRingAtomElectronPairs</span> += <span class="n">1</span><span class="sc">;</span> | 
|  | 1695 1682         <span class="s">}</span> | 
|  | 1696 1683         <span class="k">else</span> <span class="s">{</span> | 
|  | 1697 1684           <span class="c"># Is ring atom involved in two single bonds without any electron pair allowed?</span> | 
|  | 1698 1685           <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_AllowRingAtomInTwoSingleBondsWithoutElectronPair</span><span class="s">(</span><span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$RingBond</span><span class="cm">,</span> <span class="i">$PreviousRingBond</span><span class="cm">,</span> <span class="i">$ExocyclicDoubleBondsDataMapRef</span><span class="cm">,</span> <span class="i">$FusedRingBondsMapRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1699 1686             <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1700 1687           <span class="s">}</span> | 
|  | 1701 1688         <span class="s">}</span> | 
|  | 1702 1689         <span class="k">last</span> <span class="j">BONDORDER</span><span class="sc">;</span> | 
|  | 1703 1690       <span class="s">}</span> | 
|  | 1704 1691 | 
|  | 1705 1692       <span class="c"># Any other type of ring atom/bond is not allowed to contribute towards pi electron count</span> | 
|  | 1706 1693       <span class="c"># and caused loss of aromaticity...</span> | 
|  | 1707 1694       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1708 1695     <span class="s">}</span> | 
|  | 1709 1696   <span class="s">}</span> | 
|  | 1710 1697 | 
|  | 1711 1698   <span class="c"># Check for any electron pair contributions towards pi electron delocalization due to</span> | 
|  | 1712 1699   <span class="c"># -ve formal charge on ring atoms which haven't been already processed and part of</span> | 
|  | 1713 1700   <span class="c"># conjugated single/double bond system...</span> | 
|  | 1714 1701   <span class="c">#</span> | 
|  | 1715 1702   <span class="i">$NumOfRingAtomElectronPairs</span> += <span class="i">$This</span><span class="i">->_GetElectronPairsContributionFromConjugatedRingAtoms</span><span class="s">(</span><span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$RingBondsRef</span><span class="cm">,</span> <span class="i">$ExcludeFreeRadicalElectrons</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="cm">,</span> \<span class="i">%ElectronPairContributionProcessedMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1716 1703 | 
|  | 1717 1704   <span class="c"># Setup pi electron count available for delocalization...</span> | 
|  | 1718 1705   <span class="j">COUNT:</span> <span class="s">{</span> | 
|  | 1719 1706     <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfExplicitAromaticBonds</span> == <span class="i">$NumOfRingBondsProcessed</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1720 1707       <span class="c"># Each aromatic bond contribute one electron towards pi electron delocalization...</span> | 
|  | 1721 1708       <span class="i">$NumOfPiElectrons</span> = <span class="i">$NumOfExplicitAromaticBonds</span><span class="sc">;</span> | 
|  | 1722 1709       <span class="k">last</span> <span class="j">COUNT</span><span class="sc">;</span> | 
|  | 1723 1710     <span class="s">}</span> | 
|  | 1724 1711 | 
|  | 1725 1712     <span class="c"># Each conjugated double bond contribute two electrons towards pi electron delocalization...</span> | 
|  | 1726 1713     <span class="i">$NumOfPiElectrons</span> = <span class="n">2</span>*<span class="i">$NumOfConjugatedDoubleBonds</span> + <span class="n">2</span>*<span class="i">$NumOfRingAtomElectronPairs</span><span class="sc">;</span> | 
|  | 1727 1714   <span class="s">}</span> | 
|  | 1728 1715 | 
|  | 1729 1716   <span class="k">return</span> <span class="i">$NumOfPiElectrons</span><span class="sc">;</span> | 
|  | 1730 1717 <span class="s">}</span> | 
|  | 1731 1718 | 
|  | 1732 1719 <span class="c"># Check ring atoms for their potential participation in aromatic systems..</span> | 
|  | 1733 1720 <span class="c">#</span> | 
|  | 1734 <a name="_CheckRingAtomsForPotentialAromaticity-"></a>1721 <span class="k">sub </span><span class="m">_CheckRingAtomsForPotentialAromaticity</span> <span class="s">{</span> | 
|  | 1735 1722   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$RingBondsRef</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1736 1723   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$RingBond</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1737 1724 | 
|  | 1738 1725   <span class="c"># Check availability of ring atoms and bonds...</span> | 
|  | 1739 1726   <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">$RingAtomsRef</span><span class="s">)</span> && <span class="i">@</span>{<span class="i">$RingBondsRef</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1740 1727     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1741 1728   <span class="s">}</span> | 
|  | 1742 1729 | 
|  | 1743 1730   <span class="c"># Is there any minimum ring size limit?</span> | 
|  | 1744 1731   <span class="k">if</span> <span class="s">(</span><span class="i">$AromaticityModelDataRef</span>->{<span class="w">MinimumRingSize</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1745 1732     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>} < <span class="i">$AromaticityModelDataRef</span>->{<span class="w">MinimumRingSize</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   <span class="s">}</span> | 
|  | 1749 1736 | 
|  | 1750 1737   <span class="c"># Make sure ring bond order is not greater than 2 and ring atom is not connected to more</span> | 
|  | 1751 1738   <span class="c"># than 3 other atoms to eliminate any non sp2 carbon atoms and still allow for hetero atoms</span> | 
|  | 1752 1739   <span class="c"># to contrbute towards electron delocalization...</span> | 
|  | 1753 1740   <span class="c">#</span> | 
|  | 1754 1741   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$RingBondsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1755 1742     <span class="i">$RingBond</span> = <span class="i">$RingBondsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1756 1743     <span class="i">$RingAtom</span> = <span class="i">$RingAtomsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1757 1744 | 
|  | 1758 1745     <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">$RingBond</span><span class="i">->GetBondOrder</span><span class="s">(</span><span class="s">)</span> > <span class="n">2</span><span class="s">)</span> || <span class="s">(</span><span class="i">$RingAtom</span><span class="i">->GetNumOfBonds</span><span class="s">(</span><span class="s">)</span> + <span class="i">$RingAtom</span><span class="i">->GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> > <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1759 1746       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1760 1747     <span class="s">}</span> | 
|  | 1761 1748   <span class="s">}</span> | 
|  | 1762 1749 | 
|  | 1763 1750   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1764 1751 <span class="s">}</span> | 
|  | 1765 1752 | 
|  | 1766 1753 <span class="c"># Identify any exocylic double bonds on ring atoms...</span> | 
|  | 1767 1754 <span class="c">#</span> | 
|  | 1768 <a name="_IdentifyRingAtomsInvolvedInExocyclicDoubleBonds-"></a>1755 <span class="k">sub </span><span class="m">_IdentifyRingAtomsInvolvedInExocyclicDoubleBonds</span> <span class="s">{</span> | 
|  | 1769 1756   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$RingBondsRef</span><span class="cm">,</span> <span class="i">$FusedRingSetsBondsMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1770 1757   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$RingBond</span><span class="cm">,</span> <span class="i">$RingAtomID</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$BondID</span><span class="cm">,</span> <span class="i">$BondedAtom</span><span class="cm">,</span> <span class="i">$RingBondsMapRef</span><span class="cm">,</span> <span class="i">%RingBondsMap</span><span class="cm">,</span> <span class="i">%ExocyclicDoubleBondsDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1771 1758 | 
|  | 1772 1759   <span class="c"># Setup a ring bond map to process exocyclic bonds...</span> | 
|  | 1773 1760   <span class="i">$RingBondsMapRef</span> = <span class="k">undef</span><span class="sc">;</span> | 
|  | 1774 1761   <span class="i">%RingBondsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1775 1762 | 
|  | 1776 1763   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$FusedRingSetsBondsMapRef</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1777 1764     <span class="i">$RingBondsMapRef</span> = <span class="i">$FusedRingSetsBondsMapRef</span><span class="sc">;</span> | 
|  | 1778 1765   <span class="s">}</span> | 
|  | 1779 1766   <span class="k">else</span> <span class="s">{</span> | 
|  | 1780 1767     <span class="k">for</span> <span class="i">$BondID</span> <span class="s">(</span><span class="k">map</span> <span class="s">{</span> <span class="i">$_</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span> <span class="s">}</span> <span class="i">@</span>{<span class="i">$RingBondsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1781 1768       <span class="i">$RingBondsMap</span>{<span class="i">$BondID</span>} = <span class="i">$BondID</span><span class="sc">;</span> | 
|  | 1782 1769     <span class="s">}</span> | 
|  | 1783 1770     <span class="i">$RingBondsMapRef</span> = \<span class="i">%RingBondsMap</span><span class="sc">;</span> | 
|  | 1784 1771   <span class="s">}</span> | 
|  | 1785 1772 | 
|  | 1786 1773   <span class="c"># Intialize exocyclic terminal double bond data...</span> | 
|  | 1787 1774   <span class="i">%ExocyclicDoubleBondsDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1788 1775   <span class="i">%</span>{<span class="i">$ExocyclicDoubleBondsDataMap</span>{<span class="w">RingAtomID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1789 1776 | 
|  | 1790 1777   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$RingBondsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1791 1778     <span class="i">$RingBond</span> = <span class="i">$RingBondsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1792 1779     <span class="i">$RingAtom</span> = <span class="i">$RingAtomsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1793 1780 | 
|  | 1794 1781     <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1795 1782 | 
|  | 1796 1783     <span class="j">BOND:</span> <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">->GetBonds</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1797 1784       <span class="k">if</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">->GetBondOrder</span> != <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1798 1785         <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 1799 1786       <span class="s">}</span> | 
|  | 1800 1787 | 
|  | 1801 1788       <span class="c"># Is it part of ring or ring system under consideration?</span> | 
|  | 1802 1789       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$RingBondsMapRef</span>->{<span class="i">$Bond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1803 1790         <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 1804 1791       <span class="s">}</span> | 
|  | 1805 1792 | 
|  | 1806 1793       <span class="c"># Is bonded atom in a ring or a non-terminal atom?</span> | 
|  | 1807 1794       <span class="i">$BondedAtom</span> = <span class="i">$Bond</span><span class="i">->GetBondedAtom</span><span class="s">(</span><span class="i">$RingAtom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1808 1795       <span class="k">if</span> <span class="s">(</span><span class="i">$BondedAtom</span><span class="i">->IsInRing</span><span class="s">(</span><span class="s">)</span> || !<span class="i">$BondedAtom</span><span class="i">->IsTerminal</span><span class="s">(</span><span class="s">)</span> <span class="s">)</span> <span class="s">{</span> | 
|  | 1809 1796         <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 1810 1797       <span class="s">}</span> | 
|  | 1811 1798 | 
|  | 1812 1799       <span class="c"># Track exocyclic terminal double bond information...</span> | 
|  | 1813 1800       <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$ExocyclicDoubleBondsDataMap</span>{<span class="w">RingAtomID</span>}{<span class="i">$RingAtomID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1814 1801         <span class="i">@</span>{<span class="i">$ExocyclicDoubleBondsDataMap</span>{<span class="w">RingAtomID</span>}{<span class="i">$RingAtomID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1815 1802       <span class="s">}</span> | 
|  | 1816 1803       <span class="k">push</span> <span class="i">@</span>{<span class="i">$ExocyclicDoubleBondsDataMap</span>{<span class="w">RingAtomID</span>}{<span class="i">$RingAtomID</span>}}<span class="cm">,</span> <span class="i">$BondedAtom</span><span class="sc">;</span> | 
|  | 1817 1804     <span class="s">}</span> | 
|  | 1818 1805   <span class="s">}</span> | 
|  | 1819 1806 | 
|  | 1820 1807   <span class="k">return</span> \<span class="i">%ExocyclicDoubleBondsDataMap</span><span class="sc">;</span> | 
|  | 1821 1808 <span class="s">}</span> | 
|  | 1822 1809 | 
|  | 1823 1810 <span class="c"># Check to see whether ring atoms are allowed to participate in exocyclic terminal double</span> | 
|  | 1824 1811 <span class="c"># bonds...</span> | 
|  | 1825 1812 <span class="c">#</span> | 
|  | 1826 <a name="_CheckPotentialAromaticRingAtomForExocylicDoubleBonds-"></a>1813 <span class="k">sub </span><span class="m">_CheckPotentialAromaticRingAtomForExocylicDoubleBonds</span> <span class="s">{</span> | 
|  | 1827 1814   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="cm">,</span> <span class="i">$ExocyclicDoubleBondsDataMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1828 1815   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtomID</span><span class="cm">,</span> <span class="i">$ExocyclicTerminalAtom</span><span class="cm">,</span> <span class="i">$RingAtomElectronegativity</span><span class="cm">,</span> <span class="i">$TerminalAtomElectronagativity</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1829 1816 | 
|  | 1830 1817   <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1831 1818 | 
|  | 1832 1819   <span class="c"># Is it part of an exocyclic terminal double bond?</span> | 
|  | 1833 1820   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$ExocyclicDoubleBondsDataMapRef</span>->{<span class="w">RingAtomID</span>}{<span class="i">$RingAtomID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1834 1821     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1835 1822   <span class="s">}</span> | 
|  | 1836 1823 | 
|  | 1837 1824   <span class="c"># Are exocyclic terminal double bonds allowed?</span> | 
|  | 1838 1825   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>->{<span class="w">AllowExocyclicDoubleBonds</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1839 1826     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1840 1827   <span class="s">}</span> | 
|  | 1841 1828 | 
|  | 1842 1829   <span class="c"># Are there multiple exocyclic double bonds?</span> | 
|  | 1843 1830   <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ExocyclicDoubleBondsDataMapRef</span>->{<span class="w">RingAtomID</span>}{<span class="i">$RingAtomID</span>}} > <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1844 1831     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1845 1832   <span class="s">}</span> | 
|  | 1846 1833   <span class="s">(</span><span class="i">$ExocyclicTerminalAtom</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$ExocyclicDoubleBondsDataMapRef</span>->{<span class="w">RingAtomID</span>}{<span class="i">$RingAtomID</span>}}<span class="sc">;</span> | 
|  | 1847 1834 | 
|  | 1848 1835   <span class="c"># Are homo nuclear exocyclic terminal double bonds allowed?</span> | 
|  | 1849 1836   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>->{<span class="w">AllowHomoNuclearExocyclicDoubleBonds</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1850 1837     <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">->GetAtomicNumber</span><span class="s">(</span><span class="s">)</span> == <span class="i">$ExocyclicTerminalAtom</span><span class="i">->GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1851 1838       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1852 1839     <span class="s">}</span> | 
|  | 1853 1840   <span class="s">}</span> | 
|  | 1854 1841 | 
|  | 1855 1842   <span class="c"># Are ring atoms with higher electronegativity allowed in exocyclic double bonds?</span> | 
|  | 1856 1843   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>->{<span class="w">AllowElectronegativeRingAtomExocyclicDoubleBonds</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1857 1844     <span class="i">$RingAtomElectronegativity</span> = <span class="i">PeriodicTable::GetElementPaulingElectronegativity</span><span class="s">(</span><span class="i">$RingAtom</span><span class="i">->GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1858 1845     <span class="i">$TerminalAtomElectronagativity</span> = <span class="i">PeriodicTable::GetElementPaulingElectronegativity</span><span class="s">(</span><span class="i">$ExocyclicTerminalAtom</span><span class="i">->GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1859 1846 | 
|  | 1860 1847     <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtomElectronegativity</span> && <span class="i">$TerminalAtomElectronagativity</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1861 1848       <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtomElectronegativity</span> > <span class="i">$TerminalAtomElectronagativity</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1862 1849         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1863 1850       <span class="s">}</span> | 
|  | 1864 1851     <span class="s">}</span> | 
|  | 1865 1852   <span class="s">}</span> | 
|  | 1866 1853 | 
|  | 1867 1854   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1868 1855 <span class="s">}</span> | 
|  | 1869 1856 | 
|  | 1870 1857 <span class="c">#</span> | 
|  | 1871 1858 <span class="c"># Check for any formal charge participation into electron delocalization...</span> | 
|  | 1872 1859 <span class="c">#</span> | 
|  | 1873 <a name="_CheckPotentialAromaticRingAtomForFormalCharge-"></a>1860 <span class="k">sub </span><span class="m">_CheckPotentialAromaticRingAtomForFormalCharge</span> <span class="s">{</span> | 
|  | 1874 1861   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1875 1862   <span class="k">my</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1876 1863 | 
|  | 1877 1864   <span class="c"># Does atom has any formal charge?</span> | 
|  | 1878 1865   <span class="i">$FormalCharge</span> = <span class="i">$RingAtom</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1879 1866   <span class="k">if</span> <span class="s">(</span>!<span class="i">$FormalCharge</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1880 1867     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1881 1868   <span class="s">}</span> | 
|  | 1882 1869 | 
|  | 1883 1870   <span class="c"># Are ring atoms with formal charge allowed to participate in electron delocalization?</span> | 
|  | 1884 1871   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>->{<span class="w">AllowRingAtomFormalCharge</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1885 1872     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1886 1873   <span class="s">}</span> | 
|  | 1887 1874 | 
|  | 1888 1875   <span class="c"># Are hetero ring atoms with formal charge allowed to participate in electron delocalization?</span> | 
|  | 1889 1876   <span class="k">if</span> <span class="s">(</span>!<span class="i">$RingAtom</span><span class="i">->IsCarbon</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1890 1877     <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>->{<span class="w">AllowHeteroRingAtomFormalCharge</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1891 1878       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1892 1879     <span class="s">}</span> | 
|  | 1893 1880   <span class="s">}</span> | 
|  | 1894 1881 | 
|  | 1895 1882   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1896 1883 <span class="s">}</span> | 
|  | 1897 1884 | 
|  | 1898 1885 <span class="c">#</span> | 
|  | 1899 1886 <span class="c"># Check ring atoms for allowed hetero atoms...</span> | 
|  | 1900 1887 <span class="c">#</span> | 
|  | 1901 <a name="_CheckPotentialAromaticRingAtomForAllowedHeteroAtoms-"></a>1888 <span class="k">sub </span><span class="m">_CheckPotentialAromaticRingAtomForAllowedHeteroAtoms</span> <span class="s">{</span> | 
|  | 1902 1889   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1903 1890   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtomSymbol</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1904 1891 | 
|  | 1905 1892   <span class="c"># Is it a Carbon atom?</span> | 
|  | 1906 1893   <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">->IsCarbon</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1907 1894     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1908 1895   <span class="s">}</span> | 
|  | 1909 1896 | 
|  | 1910 1897   <span class="c"># Are heteroatoms allowed?</span> | 
|  | 1911 1898   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>->{<span class="w">AllowHeteroRingAtoms</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1912 1899     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1913 1900   <span class="s">}</span> | 
|  | 1914 1901 | 
|  | 1915 1902   <span class="c"># Is it an allowed hetero atom?</span> | 
|  | 1916 1903   <span class="i">$RingAtomSymbol</span> = <span class="i">$RingAtom</span><span class="i">->GetAtomSymbol</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1917 1904   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$AromaticityModelDataRef</span>->{<span class="w">HeteroRingAtomsListMapRef</span>}->{<span class="i">$RingAtomSymbol</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1918 1905     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1919 1906   <span class="s">}</span> | 
|  | 1920 1907 | 
|  | 1921 1908   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1922 1909 <span class="s">}</span> | 
|  | 1923 1910 | 
|  | 1924 1911 <span class="c"># Check for any electron pair contributions toward pi electron delocalization due to</span> | 
|  | 1925 1912 <span class="c"># -ve formal charge on ring atoms which haven't been already processed and part of</span> | 
|  | 1926 1913 <span class="c"># conjugated single/double bond system...</span> | 
|  | 1927 1914 <span class="c">#</span> | 
|  | 1928 <a name="_GetElectronPairsContributionFromConjugatedRingAtoms-"></a>1915 <span class="k">sub </span><span class="m">_GetElectronPairsContributionFromConjugatedRingAtoms</span> <span class="s">{</span> | 
|  | 1929 1916   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$RingBondsRef</span><span class="cm">,</span> <span class="i">$ExcludeFreeRadicalElectrons</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="cm">,</span> <span class="i">$ElectronPairContributionProcessedMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1930 1917   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$RingBond</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$NumOfRingAtomElectronPairs</span><span class="cm">,</span> <span class="i">$RingAtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1931 1918 | 
|  | 1932 1919   <span class="c"># Is formal charge allowed on ring atoms?</span> | 
|  | 1933 1920   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>->{<span class="w">AllowRingAtomFormalCharge</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1934 1921     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1935 1922   <span class="s">}</span> | 
|  | 1936 1923 | 
|  | 1937 1924   <span class="i">$NumOfRingAtomElectronPairs</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1938 1925 | 
|  | 1939 1926   <span class="c"># Process ring atoms...</span> | 
|  | 1940 1927   <span class="j">RINGBOND:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$RingBondsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1941 1928     <span class="i">$RingBond</span> = <span class="i">$RingBondsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1942 1929     <span class="i">$RingAtom</span> = <span class="i">$RingAtomsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1943 1930     <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1944 1931 | 
|  | 1945 1932     <span class="c"># Is is already processed?</span> | 
|  | 1946 1933     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ElectronPairContributionProcessedMapRef</span>->{<span class="i">$RingAtomID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1947 1934       <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span> | 
|  | 1948 1935     <span class="s">}</span> | 
|  | 1949 1936     <span class="i">$ElectronPairContributionProcessedMapRef</span>->{<span class="i">$RingAtomID</span>} = <span class="i">$RingAtomID</span><span class="sc">;</span> | 
|  | 1950 1937 | 
|  | 1951 1938     <span class="c"># Is it allowed to have any formal charge?</span> | 
|  | 1952 1939     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_CheckPotentialAromaticRingAtomForFormalCharge</span><span class="s">(</span><span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1953 1940       <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span> | 
|  | 1954 1941     <span class="s">}</span> | 
|  | 1955 1942 | 
|  | 1956 1943     <span class="c"># It it an allowed hetero ring atom or a carbon atom?</span> | 
|  | 1957 1944     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_CheckPotentialAromaticRingAtomForAllowedHeteroAtoms</span><span class="s">(</span><span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$AromaticityModelDataRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1958 1945       <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span> | 
|  | 1959 1946     <span class="s">}</span> | 
|  | 1960 1947 | 
|  | 1961 1948     <span class="c"># It is an atom with -ve formal charge?</span> | 
|  | 1962 1949     <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span> >= <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1963 1950       <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span> | 
|  | 1964 1951     <span class="s">}</span> | 
|  | 1965 1952 | 
|  | 1966 1953     <span class="c"># Is it able to donate a pair for electrons towards pi electron delocalization?</span> | 
|  | 1967 1954     <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">->GetValenceFreeElectrons</span><span class="s">(</span><span class="i">$ExcludeFreeRadicalElectrons</span><span class="s">)</span> < <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1968 1955       <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span> | 
|  | 1969 1956     <span class="s">}</span> | 
|  | 1970 1957     <span class="i">$NumOfRingAtomElectronPairs</span> += <span class="n">1</span><span class="sc">;</span> | 
|  | 1971 1958   <span class="s">}</span> | 
|  | 1972 1959 | 
|  | 1973 1960   <span class="k">return</span> <span class="i">$NumOfRingAtomElectronPairs</span><span class="sc">;</span> | 
|  | 1974 1961 <span class="s">}</span> | 
|  | 1975 1962 | 
|  | 1976 1963 <span class="c"># Check for ring atoms involved in two single ring bonds without any available electron</span> | 
|  | 1977 1964 <span class="c"># pair which are allowed to participate in aromatic system, after all other checks</span> | 
|  | 1978 1965 <span class="c"># corresponding to specified aromaticity models have already been performed...</span> | 
|  | 1979 1966 <span class="c">#</span> | 
|  | 1980 <a name="_AllowRingAtomInTwoSingleBondsWithoutElectronPair-"></a>1967 <span class="k">sub </span><span class="m">_AllowRingAtomInTwoSingleBondsWithoutElectronPair</span> <span class="s">{</span> | 
|  | 1981 1968   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$RingBond</span><span class="cm">,</span> <span class="i">$PreviousRingBond</span><span class="cm">,</span> <span class="i">$ExocyclicDoubleBondsDataMapRef</span><span class="cm">,</span> <span class="i">$FusedRingBondsMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1982 1969 | 
|  | 1983 1970   <span class="j">ALLOWRINGATOM:</span> <span class="s">{</span> | 
|  | 1984 1971     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ExocyclicDoubleBondsDataMapRef</span>->{<span class="w">RingAtomID</span>}{<span class="i">$RingAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1985 1972       <span class="c"># Ring atom in an exocylic terminal double bond without any available electron pair...</span> | 
|  | 1986 1973       <span class="k">last</span> <span class="j">ALLOWRINGATOM</span><span class="sc">;</span> | 
|  | 1987 1974     <span class="s">}</span> | 
|  | 1988 1975 | 
|  | 1989 1976     <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">->GetFormalCharge</span><span class="s">(</span><span class="s">)</span> > <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1990 1977       <span class="c"># Ring atom with positive formal charge without any available electron pair...</span> | 
|  | 1991 1978       <span class="k">last</span> <span class="j">ALLOWRINGATOM</span><span class="sc">;</span> | 
|  | 1992 1979     <span class="s">}</span> | 
|  | 1993 1980 | 
|  | 1994 1981     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$FusedRingBondsMapRef</span> && <span class="s">(</span><span class="k">exists</span> <span class="i">$FusedRingBondsMapRef</span>->{<span class="i">$RingBond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span>} || <span class="k">exists</span> <span class="i">$FusedRingBondsMapRef</span>->{<span class="i">$PreviousRingBond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1995 1982       <span class="c"># Ring atom involved in fused ring bond, which might end up being part of a conjugated</span> | 
|  | 1996 1983       <span class="c"># system in another fused ring...</span> | 
|  | 1997 1984       <span class="k">last</span> <span class="j">ALLOWRINGATOM</span><span class="sc">;</span> | 
|  | 1998 1985     <span class="s">}</span> | 
|  | 1999 1986 | 
|  | 2000 1987     <span class="c"># Ring atom in any other environment is not allowed...</span> | 
|  | 2001 1988     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2002 1989   <span class="s">}</span> | 
|  | 2003 1990 | 
|  | 2004 1991   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2005 1992 <span class="s">}</span> | 
|  | 2006 1993 | 
|  | 2007 1994 <span class="c"># Do pi electrons satify huckel's rule: Number of pi electrons correspond to 4n + 2 where</span> | 
|  | 2008 1995 <span class="c"># n is a positive integer...</span> | 
|  | 2009 1996 <span class="c">#</span> | 
|  | 2010 <a name="_DoPiElectronSatifyHuckelsRule-"></a>1997 <span class="k">sub </span><span class="m">_DoPiElectronSatifyHuckelsRule</span> <span class="s">{</span> | 
|  | 2011 1998   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfPiElectrons</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2012 1999 | 
|  | 2013 2000   <span class="i">$NumOfPiElectrons</span> = <span class="i">$NumOfPiElectrons</span> - <span class="n">2</span><span class="sc">;</span> | 
|  | 2014 2001 | 
|  | 2015 2002   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfPiElectrons</span> > <span class="n">0</span><span class="s">)</span> ? <span class="s">(</span><span class="s">(</span><span class="i">$NumOfPiElectrons</span> % <span class="n">4</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2016 2003 <span class="s">}</span> | 
|  | 2017 2004 | 
|  | 2018 2005 <span class="c"># Delete aromatic property for all atoms and bonds...</span> | 
|  | 2019 2006 <span class="c">#</span> | 
|  | 2020 <a name="_DeleteAtomsAndBondsAromaticity-"></a>2007 <span class="k">sub </span><span class="m">_DeleteAtomsAndBondsAromaticity</span> <span class="s">{</span> | 
|  | 2021 2008   <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> | 
|  | 2022 2009   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2023 2010 | 
|  | 2024 2011   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2025 2012     <span class="i">$Atom</span><span class="i">->DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2026 2013   <span class="s">}</span> | 
|  | 2027 2014   <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> | 
|  | 2028 2015     <span class="i">$Bond</span><span class="i">->DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2029 2016   <span class="s">}</span> | 
|  | 2030 2017   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 2031 2018 <span class="s">}</span> | 
|  | 2032 2019 | 
|  | 2033 2020 <span class="c"># Kekulize marked ring and non-ring aromatic atoms in a molecule...</span> | 
|  | 2034 2021 <span class="c">#</span> | 
|  | 2035 <a name="KekulizeAromaticAtoms-"></a>2022 <span class="k">sub </span><span class="m">KekulizeAromaticAtoms</span> <span class="s">{</span> | 
|  | 2036 2023   <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> | 
|  | 2037 2024 | 
|  | 2038 2025   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_KekulizeAromaticAtomsInRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2039 2026     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2040 2027   <span class="s">}</span> | 
|  | 2041 2028 | 
|  | 2042 2029   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_KekulizeAromaticAtomsNotInRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2043 2030     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2044 2031   <span class="s">}</span> | 
|  | 2045 2032 | 
|  | 2046 2033   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2047 2034 <span class="s">}</span> | 
|  | 2048 2035 | 
|  | 2049 2036 <span class="c"># Kekulize marked aromatic atoms in rings and fused ring sets...</span> | 
|  | 2050 2037 <span class="c">#</span> | 
|  | 2051 <a name="_KekulizeAromaticAtomsInRings-"></a>2038 <span class="k">sub </span><span class="m">_KekulizeAromaticAtomsInRings</span> <span class="s">{</span> | 
|  | 2052 2039   <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> | 
|  | 2053 2040 | 
|  | 2054 2041   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2055 2042     <span class="c"># Nothing to do...</span> | 
|  | 2056 2043     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2057 2044   <span class="s">}</span> | 
|  | 2058 2045 | 
|  | 2059 2046   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasAromaticAtomsInRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2060 2047     <span class="c"># Nothing to do...</span> | 
|  | 2061 2048     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2062 2049   <span class="s">}</span> | 
|  | 2063 2050 | 
|  | 2064 2051   <span class="c"># Identify fully aromatic fused and individual rings along with any partially aromatic ring components</span> | 
|  | 2065 2052   <span class="c"># using marked aromatic atoms in a molecule and kekulize them as individual stes...</span> | 
|  | 2066 2053   <span class="c">#</span> | 
|  | 2067 2054   <span class="k">my</span><span class="s">(</span><span class="i">$AromaticFusedRingSetsRef</span><span class="cm">,</span> <span class="i">$AromaticRingsRef</span><span class="cm">,</span> <span class="i">$PartiallyAromaticRingComponentsRef</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="s">)</span> x <span class="n">3</span><span class="sc">;</span> | 
|  | 2068 2055   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasFusedRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2069 2056     <span class="s">(</span><span class="i">$AromaticFusedRingSetsRef</span><span class="cm">,</span> <span class="i">$AromaticRingsRef</span><span class="cm">,</span> <span class="i">$PartiallyAromaticRingComponentsRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_GetFusedAndNonFusedRingsContainingAromaticAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2070 2057   <span class="s">}</span> | 
|  | 2071 2058   <span class="k">else</span> <span class="s">{</span> | 
|  | 2072 2059     <span class="s">(</span><span class="i">$AromaticRingsRef</span><span class="cm">,</span> <span class="i">$PartiallyAromaticRingComponentsRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_GetIndividualRingsContainingAromaticAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2073 2060   <span class="s">}</span> | 
|  | 2074 2061 | 
|  | 2075 2062   <span class="k">return</span> <span class="i">$This</span><span class="i">->_KekulizeCompleteAndPartialAromaticRings</span><span class="s">(</span><span class="i">$AromaticFusedRingSetsRef</span><span class="cm">,</span> <span class="i">$AromaticRingsRef</span><span class="cm">,</span> <span class="i">$PartiallyAromaticRingComponentsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2076 2063 <span class="s">}</span> | 
|  | 2077 2064 | 
|  | 2078 2065 <span class="c"># Identify fully aromatic fused and individual rings along with any partially aromatic ring components</span> | 
|  | 2079 2066 <span class="c"># using marked aromatic atoms in a molecule...</span> | 
|  | 2080 2067 <span class="c">#</span> | 
|  | 2081 <a name="_GetFusedAndNonFusedRingsContainingAromaticAtoms-"></a>2068 <span class="k">sub </span><span class="m">_GetFusedAndNonFusedRingsContainingAromaticAtoms</span> <span class="s">{</span> | 
|  | 2082 2069   <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> | 
|  | 2083 2070   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$SetAtomsCount</span><span class="cm">,</span> <span class="i">$SetAromaticAtomsCount</span><span class="cm">,</span> <span class="i">$FusedRingSetRef</span><span class="cm">,</span> <span class="i">$FusedRingSetsRef</span><span class="cm">,</span> <span class="i">$NonFusedRingsRef</span><span class="cm">,</span> <span class="i">$IndividualRingsRef</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$RingAtomsCount</span><span class="cm">,</span> <span class="i">$AromaticAtomsCount</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$NonFusedFullyAromaticRingsRef</span><span class="cm">,</span> <span class="i">$NonFusedPartiallyAromaticRingComponentsRef</span><span class="cm">,</span> <span class="i">$PartiallyAromaticRingComponentsRef</span><span class="cm">,</span> <span class="i">@FullyAromaticFusedRingSets</span><span class="cm">,</span> <span class="i">@PotentialFullyAromaticRings</span><span class="cm">,</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">@PotentialPartiallyAromaticRings</span><span class="cm">,</span> <span class="i">@PartiallyAromaticRingComponents</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2084 2071 | 
|  | 2085 2072   <span class="i">@FullyAromaticFusedRingSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2086 2073 | 
|  | 2087 2074   <span class="i">@PotentialFullyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2088 2075   <span class="i">@FullyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2089 2076 | 
|  | 2090 2077   <span class="i">@PotentialPartiallyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2091 2078   <span class="i">@PartiallyAromaticRingComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2092 2079 | 
|  | 2093 2080   <span class="s">(</span><span class="i">$FusedRingSetsRef</span><span class="cm">,</span> <span class="i">$NonFusedRingsRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetFusedAndNonFusedRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2094 2081 | 
|  | 2095 2082   <span class="c"># Go over fused ring sets...</span> | 
|  | 2096 2083   <span class="j">RINGSET:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$FusedRingSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2097 2084     <span class="i">$FusedRingSetRef</span> = <span class="i">$FusedRingSetsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 2098 2085 | 
|  | 2099 2086     <span class="i">$SetAtomsCount</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2100 2087     <span class="i">$SetAromaticAtomsCount</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2101 2088 | 
|  | 2102 2089     <span class="k">for</span> <span class="i">$RingAtomsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FusedRingSetRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2103 2090       <span class="i">$SetAtomsCount</span> += <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="sc">;</span> | 
|  | 2104 2091 | 
|  | 2105 2092       <span class="k">for</span> <span class="i">$RingAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2106 2093         <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2107 2094           <span class="i">$SetAromaticAtomsCount</span> += <span class="n">1</span><span class="sc">;</span> | 
|  | 2108 2095         <span class="s">}</span> | 
|  | 2109 2096       <span class="s">}</span> | 
|  | 2110 2097     <span class="s">}</span> | 
|  | 2111 2098 | 
|  | 2112 2099     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$SetAtomsCount</span> && <span class="i">$SetAromaticAtomsCount</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2113 2100       <span class="k">next</span> <span class="j">RINGSET</span><span class="sc">;</span> | 
|  | 2114 2101     <span class="s">}</span> | 
|  | 2115 2102 | 
|  | 2116 2103     <span class="k">if</span> <span class="s">(</span><span class="i">$SetAromaticAtomsCount</span> == <span class="i">$SetAtomsCount</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2117 2104       <span class="k">push</span> <span class="i">@FullyAromaticFusedRingSets</span><span class="cm">,</span> <span class="i">$FusedRingSetRef</span><span class="sc">;</span> | 
|  | 2118 2105     <span class="s">}</span> | 
|  | 2119 2106     <span class="k">else</span> <span class="s">{</span> | 
|  | 2120 2107       <span class="c"># Identify any individual rings in partial aromatic fused ring sets which might be</span> | 
|  | 2121 2108       <span class="c"># fully or partially aromatic...</span> | 
|  | 2122 2109       <span class="c">#</span> | 
|  | 2123 2110       <span class="j">RING:</span> <span class="k">for</span> <span class="i">$RingAtomsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FusedRingSetRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2124 2111         <span class="i">$RingAtomsCount</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="sc">;</span> | 
|  | 2125 2112         <span class="i">$AromaticAtomsCount</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2126 2113 | 
|  | 2127 2114         <span class="j">RINGATOM:</span> <span class="k">for</span> <span class="i">$RingAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2128 2115           <span class="k">if</span> <span class="s">(</span>!<span class="i">$RingAtom</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2129 2116             <span class="k">next</span> <span class="j">RINGATOM</span><span class="sc">;</span> | 
|  | 2130 2117           <span class="s">}</span> | 
|  | 2131 2118           <span class="i">$AromaticAtomsCount</span> += <span class="n">1</span><span class="sc">;</span> | 
|  | 2132 2119         <span class="s">}</span> | 
|  | 2133 2120 | 
|  | 2134 2121         <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$RingAtomsCount</span> && <span class="i">$AromaticAtomsCount</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2135 2122           <span class="k">next</span> <span class="j">RING</span><span class="sc">;</span> | 
|  | 2136 2123         <span class="s">}</span> | 
|  | 2137 2124 | 
|  | 2138 2125         <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtomsCount</span> == <span class="i">$AromaticAtomsCount</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2139 2126           <span class="k">push</span> <span class="i">@PotentialFullyAromaticRings</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="sc">;</span> | 
|  | 2140 2127         <span class="s">}</span> | 
|  | 2141 2128         <span class="k">else</span> <span class="s">{</span> | 
|  | 2142 2129           <span class="c">#  Track partially aromatic rings in an different list before removing them for</span> | 
|  | 2143 2130           <span class="c">#  any overlap with other rings and then add to fully aromatic rings...</span> | 
|  | 2144 2131           <span class="k">push</span> <span class="i">@PotentialPartiallyAromaticRings</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="sc">;</span> | 
|  | 2145 2132         <span class="s">}</span> | 
|  | 2146 2133       <span class="s">}</span> | 
|  | 2147 2134     <span class="s">}</span> | 
|  | 2148 2135   <span class="s">}</span> | 
|  | 2149 2136 | 
|  | 2150 2137   <span class="k">if</span> <span class="s">(</span><span class="i">@PotentialFullyAromaticRings</span> > <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2151 2138     <span class="c"># Get any fully aromatic fused ring subsets from potentially fully aromatic rings...</span> | 
|  | 2152 2139     <span class="k">my</span><span class="s">(</span><span class="i">$FullyAromaticFusedRingSetsRefs</span><span class="cm">,</span> <span class="i">$FullyAromaticNonFusedRingsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2153 2140     <span class="s">(</span><span class="i">$FullyAromaticFusedRingSetsRefs</span><span class="cm">,</span> <span class="i">$FullyAromaticNonFusedRingsRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_GetFullyAromaticFusedAndNonFusedRingsInFusedSubset</span><span class="s">(</span>\<span class="i">@PotentialFullyAromaticRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2154 2141 | 
|  | 2155 2142     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FullyAromaticFusedRingSetsRefs</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2156 2143       <span class="k">push</span> <span class="i">@FullyAromaticFusedRingSets</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$FullyAromaticFusedRingSetsRefs</span>}<span class="sc">;</span> | 
|  | 2157 2144     <span class="s">}</span> | 
|  | 2158 2145     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FullyAromaticNonFusedRingsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2159 2146       <span class="k">push</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$FullyAromaticNonFusedRingsRef</span>}<span class="sc">;</span> | 
|  | 2160 2147     <span class="s">}</span> | 
|  | 2161 2148   <span class="s">}</span> | 
|  | 2162 2149   <span class="k">else</span> <span class="s">{</span> | 
|  | 2163 2150     <span class="k">push</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">@PotentialFullyAromaticRings</span><span class="sc">;</span> | 
|  | 2164 2151   <span class="s">}</span> | 
|  | 2165 2152 | 
|  | 2166 2153   <span class="c"># Go over partial aromatic ring components...</span> | 
|  | 2167 2154   <span class="k">if</span> <span class="s">(</span><span class="i">@PotentialPartiallyAromaticRings</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2168 2155     <span class="i">$PartiallyAromaticRingComponentsRef</span> = <span class="i">$This</span><span class="i">->_GetPartiallyAromaticRingComponents</span><span class="s">(</span>\<span class="i">@PotentialPartiallyAromaticRings</span><span class="cm">,</span> \<span class="i">@PotentialFullyAromaticRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2169 2156     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponentsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2170 2157       <span class="k">push</span> <span class="i">@PartiallyAromaticRingComponents</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponentsRef</span>}<span class="sc">;</span> | 
|  | 2171 2158     <span class="s">}</span> | 
|  | 2172 2159   <span class="s">}</span> | 
|  | 2173 2160 | 
|  | 2174 2161   <span class="c"># Go over non-fused rings...</span> | 
|  | 2175 2162   <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$NonFusedRingsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2176 2163     <span class="s">(</span><span class="i">$NonFusedFullyAromaticRingsRef</span><span class="cm">,</span> <span class="i">$NonFusedPartiallyAromaticRingComponentsRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_GetRingsContainingAromaticAtoms</span><span class="s">(</span><span class="i">@</span>{<span class="i">$NonFusedRingsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 2177 2164 | 
|  | 2178 2165     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$NonFusedFullyAromaticRingsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2179 2166       <span class="k">push</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$NonFusedFullyAromaticRingsRef</span>}<span class="sc">;</span> | 
|  | 2180 2167     <span class="s">}</span> | 
|  | 2181 2168     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$NonFusedPartiallyAromaticRingComponentsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2182 2169       <span class="k">push</span> <span class="i">@PartiallyAromaticRingComponents</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$NonFusedPartiallyAromaticRingComponentsRef</span>}<span class="sc">;</span> | 
|  | 2183 2170     <span class="s">}</span> | 
|  | 2184 2171   <span class="s">}</span> | 
|  | 2185 2172 | 
|  | 2186 2173   <span class="k">return</span> <span class="s">(</span>\<span class="i">@FullyAromaticFusedRingSets</span><span class="cm">,</span> \<span class="i">@FullyAromaticRings</span><span class="cm">,</span> \<span class="i">@PartiallyAromaticRingComponents</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2187 2174 <span class="s">}</span> | 
|  | 2188 2175 | 
|  | 2189 2176 <span class="c"># Identify fully aromatic fused sets and non-fused rings in potentially fully aromatic</span> | 
|  | 2190 2177 <span class="c"># rings in fused ring sets...</span> | 
|  | 2191 2178 <span class="c">#</span> | 
|  | 2192 2179 <span class="c"># Fully aromatic rings in fused ring sets might contain fully aromatic fused subsets. These</span> | 
|  | 2193 2180 <span class="c"># fused subets need to be tracked and treated as fused sets.</span> | 
|  | 2194 2181 <span class="c">#</span> | 
|  | 2195 2182 <span class="c"># Note:</span> | 
|  | 2196 2183 <span class="c">#   . Fused ring sets share at least one common bond, which could be used to identify</span> | 
|  | 2197 2184 <span class="c">#     any multiple fully aromatic fused rings sets; absence of a shared ring bond implies</span> | 
|  | 2198 2185 <span class="c">#     there are no fused ring sets.</span> | 
|  | 2199 2186 <span class="c">#</span> | 
|  | 2200 2187 <span class="c">#</span> | 
|  | 2201 <a name="_GetFullyAromaticFusedAndNonFusedRingsInFusedSubset-"></a>2188 <span class="k">sub </span><span class="m">_GetFullyAromaticFusedAndNonFusedRingsInFusedSubset</span> <span class="s">{</span> | 
|  | 2202 2189   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PotentialFullyAromaticFusedRingsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2203 2190   <span class="k">my</span><span class="s">(</span><span class="i">$RingIndex</span><span class="cm">,</span> <span class="i">$RingIndex1</span><span class="cm">,</span> <span class="i">$RingIndex2</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$RingAtomID</span><span class="cm">,</span> <span class="i">$RingIsFuesd</span><span class="cm">,</span> <span class="i">$RingIndicesGraph</span><span class="cm">,</span> <span class="i">$FusedRingSetIndicesRef</span><span class="cm">,</span> <span class="i">@RingIndices</span><span class="cm">,</span> <span class="i">@FusedRingPairIndices</span><span class="cm">,</span> <span class="i">@FusedRingSetIndicesRefs</span><span class="cm">,</span> <span class="i">@FullyAromaticFusedRingSets</span><span class="cm">,</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">%RingIndexToAtomIDMap</span><span class="cm">,</span> <span class="i">%FullyAromaticFusedRingIndexMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2204 2191 | 
|  | 2205 2192   <span class="i">@FullyAromaticFusedRingSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2206 2193   <span class="i">@FullyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2207 2194 | 
|  | 2208 2195   <span class="c"># Setup a ring index map for ring atoms...</span> | 
|  | 2209 2196   <span class="c">#</span> | 
|  | 2210 2197   <span class="i">%RingIndexToAtomIDMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2211 2198   <span class="k">for</span> <span class="i">$RingIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PotentialFullyAromaticFusedRingsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2212 2199     <span class="i">%</span>{<span class="i">$RingIndexToAtomIDMap</span>{<span class="i">$RingIndex</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2213 2200     <span class="k">for</span> <span class="i">$RingAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PotentialFullyAromaticFusedRingsRef</span>->[<span class="i">$RingIndex</span>]}<span class="s">)</span> <span class="s">{</span> | 
|  | 2214 2201       <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2215 2202       <span class="i">$RingIndexToAtomIDMap</span>{<span class="i">$RingIndex</span>}{<span class="i">$RingAtomID</span>} = <span class="i">$RingAtomID</span><span class="sc">;</span> | 
|  | 2216 2203     <span class="s">}</span> | 
|  | 2217 2204   <span class="s">}</span> | 
|  | 2218 2205 | 
|  | 2219 2206   <span class="c"># Identify fused ring pairs...</span> | 
|  | 2220 2207   <span class="c">#</span> | 
|  | 2221 2208   <span class="i">@RingIndices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2222 2209   <span class="i">@FusedRingPairIndices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2223 2210 | 
|  | 2224 2211   <span class="k">for</span> <span class="i">$RingIndex1</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PotentialFullyAromaticFusedRingsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2225 2212     <span class="k">push</span> <span class="i">@RingIndices</span><span class="cm">,</span> <span class="i">$RingIndex1</span><span class="sc">;</span> | 
|  | 2226 2213     <span class="k">for</span> <span class="i">$RingIndex2</span> <span class="s">(</span><span class="s">(</span><span class="i">$RingIndex1</span> + <span class="n">1</span><span class="s">)</span> .. <span class="i">$#</span>{<span class="i">$PotentialFullyAromaticFusedRingsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2227 2214       <span class="i">$RingIsFuesd</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2228 2215       <span class="j">RINGATOM:</span> <span class="k">for</span> <span class="i">$RingAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PotentialFullyAromaticFusedRingsRef</span>->[<span class="i">$RingIndex2</span>]}<span class="s">)</span> <span class="s">{</span> | 
|  | 2229 2216         <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2230 2217         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$RingIndexToAtomIDMap</span>{<span class="i">$RingIndex1</span>}{<span class="i">$RingAtomID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2231 2218           <span class="i">$RingIsFuesd</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 2232 2219           <span class="k">last</span> <span class="j">RINGATOM</span><span class="sc">;</span> | 
|  | 2233 2220         <span class="s">}</span> | 
|  | 2234 2221       <span class="s">}</span> | 
|  | 2235 2222       <span class="k">if</span> <span class="s">(</span><span class="i">$RingIsFuesd</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2236 2223         <span class="k">push</span> <span class="i">@FusedRingPairIndices</span><span class="cm">,</span> <span class="s">(</span><span class="i">$RingIndex1</span><span class="cm">,</span> <span class="i">$RingIndex2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2237 2224       <span class="s">}</span> | 
|  | 2238 2225     <span class="s">}</span> | 
|  | 2239 2226   <span class="s">}</span> | 
|  | 2240 2227 | 
|  | 2241 2228   <span class="k">if</span> <span class="s">(</span>!<span class="i">@FusedRingPairIndices</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2242 2229     <span class="c"># No fused ring subset out there...</span> | 
|  | 2243 2230     <span class="k">push</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$PotentialFullyAromaticFusedRingsRef</span>}<span class="sc">;</span> | 
|  | 2244 2231 | 
|  | 2245 2232     <span class="k">return</span> <span class="s">(</span>\<span class="i">@FullyAromaticFusedRingSets</span><span class="cm">,</span> \<span class="i">@FullyAromaticRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2246 2233   <span class="s">}</span> | 
|  | 2247 2234 | 
|  | 2248 2235   <span class="c"># Identify fused ring sets...</span> | 
|  | 2249 2236   <span class="c">#</span> | 
|  | 2250 2237   <span class="i">$RingIndicesGraph</span> = <span class="i">new</span> <span class="i">Graph</span><span class="s">(</span><span class="i">@RingIndices</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2251 2238   <span class="i">$RingIndicesGraph</span><span class="i">->AddEdges</span><span class="s">(</span><span class="i">@FusedRingPairIndices</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2252 2239   <span class="i">@FusedRingSetIndicesRefs</span> = <span class="i">$RingIndicesGraph</span><span class="i">->GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2253 2240 | 
|  | 2254 2241   <span class="c"># Collect fully aromatic fused ring sets...</span> | 
|  | 2255 2242   <span class="c">#</span> | 
|  | 2256 2243   <span class="i">%FullyAromaticFusedRingIndexMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2257 2244   <span class="k">for</span> <span class="i">$FusedRingSetIndicesRef</span> <span class="s">(</span><span class="i">@FusedRingSetIndicesRefs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2258 2245     <span class="k">my</span><span class="s">(</span><span class="i">@FullyAromaticFusedRingSet</span><span class="s">)</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2259 2246     <span class="k">for</span> <span class="i">$RingIndex</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FusedRingSetIndicesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2260 2247       <span class="i">$FullyAromaticFusedRingIndexMap</span>{<span class="i">$RingIndex</span>} = <span class="i">$RingIndex</span><span class="sc">;</span> | 
|  | 2261 2248       <span class="k">push</span> <span class="i">@FullyAromaticFusedRingSet</span><span class="cm">,</span> <span class="i">$PotentialFullyAromaticFusedRingsRef</span>->[<span class="i">$RingIndex</span>]<span class="sc">;</span> | 
|  | 2262 2249     <span class="s">}</span> | 
|  | 2263 2250     <span class="k">if</span> <span class="s">(</span><span class="i">@FullyAromaticFusedRingSet</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2264 2251       <span class="c"># Sort rings by size with in the fused ring set...</span> | 
|  | 2265 2252       <span class="i">@FullyAromaticFusedRingSet</span> = <span class="k">sort</span> <span class="s">{</span> <span class="k">scalar</span> <span class="i">@$a</span> <=> <span class="k">scalar</span> <span class="i">@$b</span> <span class="s">}</span> <span class="i">@FullyAromaticFusedRingSet</span><span class="sc">;</span> | 
|  | 2266 2253       <span class="k">push</span> <span class="i">@FullyAromaticFusedRingSets</span><span class="cm">,</span> \<span class="i">@FullyAromaticFusedRingSet</span><span class="sc">;</span> | 
|  | 2267 2254     <span class="s">}</span> | 
|  | 2268 2255   <span class="s">}</span> | 
|  | 2269 2256 | 
|  | 2270 2257   <span class="c"># Collect fully aromatic non-fused rings...</span> | 
|  | 2271 2258   <span class="c">#</span> | 
|  | 2272 2259   <span class="j">RINGINDEX:</span> <span class="k">for</span> <span class="i">$RingIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PotentialFullyAromaticFusedRingsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2273 2260     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$FullyAromaticFusedRingIndexMap</span>{<span class="i">$RingIndex</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2274 2261       <span class="k">next</span> <span class="j">RINGINDEX</span><span class="sc">;</span> | 
|  | 2275 2262     <span class="s">}</span> | 
|  | 2276 2263     <span class="k">push</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">$PotentialFullyAromaticFusedRingsRef</span>->[<span class="i">$RingIndex</span>]<span class="sc">;</span> | 
|  | 2277 2264   <span class="s">}</span> | 
|  | 2278 2265 | 
|  | 2279 2266   <span class="k">return</span> <span class="s">(</span>\<span class="i">@FullyAromaticFusedRingSets</span><span class="cm">,</span> \<span class="i">@FullyAromaticRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2280 2267 <span class="s">}</span> | 
|  | 2281 2268 | 
|  | 2282 2269 <span class="c"># Identify individual non-fused rings containing aromatic atoms...</span> | 
|  | 2283 2270 <span class="c">#</span> | 
|  | 2284 <a name="_GetIndividualRingsContainingAromaticAtoms-"></a>2271 <span class="k">sub </span><span class="m">_GetIndividualRingsContainingAromaticAtoms</span> <span class="s">{</span> | 
|  | 2285 2272   <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> | 
|  | 2286 2273 | 
|  | 2287 2274   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRingsContainingAromaticAtoms</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2288 2275 <span class="s">}</span> | 
|  | 2289 2276 | 
|  | 2290 2277 <span class="c"># Identify individual non-fused rings containing aromatic atoms...</span> | 
|  | 2291 2278 <span class="c">#</span> | 
|  | 2292 <a name="_GetRingsContainingAromaticAtoms-"></a>2279 <span class="k">sub </span><span class="m">_GetRingsContainingAromaticAtoms</span> <span class="s">{</span> | 
|  | 2293 2280   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Rings</span><span class="s">)</span>  = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2294 2281   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$RingAtomsCount</span><span class="cm">,</span> <span class="i">$AromaticAtomsCount</span><span class="cm">,</span> <span class="i">$PartiallyAromaticRingComponentsRef</span><span class="cm">,</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">@PartiallyAromaticRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2295 2282 | 
|  | 2296 2283   <span class="i">@FullyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2297 2284   <span class="i">@PartiallyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2298 2285 | 
|  | 2299 2286   <span class="j">RING:</span> <span class="k">for</span> <span class="i">$RingAtomsRef</span> <span class="s">(</span><span class="i">@Rings</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2300 2287     <span class="i">$RingAtomsCount</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="sc">;</span> | 
|  | 2301 2288     <span class="i">$AromaticAtomsCount</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2302 2289 | 
|  | 2303 2290     <span class="k">for</span> <span class="i">$RingAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2304 2291       <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2305 2292         <span class="i">$AromaticAtomsCount</span> += <span class="n">1</span><span class="sc">;</span> | 
|  | 2306 2293       <span class="s">}</span> | 
|  | 2307 2294     <span class="s">}</span> | 
|  | 2308 2295 | 
|  | 2309 2296     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$AromaticAtomsCount</span> && <span class="i">$RingAtomsCount</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2310 2297       <span class="k">next</span> <span class="j">RING</span><span class="sc">;</span> | 
|  | 2311 2298     <span class="s">}</span> | 
|  | 2312 2299 | 
|  | 2313 2300     <span class="k">if</span> <span class="s">(</span><span class="i">$AromaticAtomsCount</span> == <span class="i">$RingAtomsCount</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2314 2301       <span class="k">push</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="sc">;</span> | 
|  | 2315 2302     <span class="s">}</span> | 
|  | 2316 2303     <span class="k">else</span> <span class="s">{</span> | 
|  | 2317 2304       <span class="k">push</span> <span class="i">@PartiallyAromaticRings</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="sc">;</span> | 
|  | 2318 2305     <span class="s">}</span> | 
|  | 2319 2306   <span class="s">}</span> | 
|  | 2320 2307 | 
|  | 2321 2308   <span class="i">$PartiallyAromaticRingComponentsRef</span> = <span class="i">$This</span><span class="i">->_GetPartiallyAromaticRingComponents</span><span class="s">(</span>\<span class="i">@PartiallyAromaticRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2322 2309 | 
|  | 2323 2310   <span class="k">return</span> <span class="s">(</span>\<span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">$PartiallyAromaticRingComponentsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2324 2311 <span class="s">}</span> | 
|  | 2325 2312 | 
|  | 2326 2313 <span class="c"># Get connected aromatic components with in partially aromatic rings...</span> | 
|  | 2327 2314 <span class="c">#</span> | 
|  | 2328 <a name="_GetPartiallyAromaticRingComponents-"></a>2315 <span class="k">sub </span><span class="m">_GetPartiallyAromaticRingComponents</span> <span class="s">{</span> | 
|  | 2329 2316   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PotentialPartiallyAromaticRingsRef</span><span class="cm">,</span> <span class="i">$FullyAromaticRingsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2330 2317   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="cm">,</span> <span class="i">$RingAtomID</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">@PartiallyAromaticRingComponents</span><span class="cm">,</span> <span class="i">%FullyAromaticRingAtomsMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2331 2318 | 
|  | 2332 2319   <span class="i">@PartiallyAromaticRingComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2333 2320 | 
|  | 2334 2321   <span class="c"># Setup a map for atoms involve in fully aromatic rings to remove remove partial rings</span> | 
|  | 2335 2322   <span class="c"># containing only those atoms which are already part of some other fully aromatic ring</span> | 
|  | 2336 2323   <span class="c"># in fused ring scenarios or some other partially aromatic ring...</span> | 
|  | 2337 2324   <span class="c">#</span> | 
|  | 2338 2325   <span class="i">%FullyAromaticRingAtomsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2339 2326   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$FullyAromaticRingsRef</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2340 2327     <span class="k">for</span> <span class="i">$RingAtomsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FullyAromaticRingsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2341 2328       <span class="k">for</span> <span class="i">$RingAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2342 2329         <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2343 2330         <span class="i">$FullyAromaticRingAtomsMap</span>{<span class="i">$RingAtomID</span>} = <span class="i">$RingAtomID</span><span class="sc">;</span> | 
|  | 2344 2331       <span class="s">}</span> | 
|  | 2345 2332     <span class="s">}</span> | 
|  | 2346 2333   <span class="s">}</span> | 
|  | 2347 2334 | 
|  | 2348 2335   <span class="c"># . Identify any connected components with in each partially aromatic ring.</span> | 
|  | 2349 2336   <span class="c"># . Use ring atom indices to figure out connnected components in rings: All ring atoms</span> | 
|  | 2350 2337   <span class="c">#   in a connected component have sequential indices and a difference by more than</span> | 
|  | 2351 2338   <span class="c">#   1 indicates a new component in the list.</span> | 
|  | 2352 2339   <span class="c">#</span> | 
|  | 2353 2340   <span class="j">RING:</span> <span class="k">for</span> <span class="i">$RingAtomsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PotentialPartiallyAromaticRingsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2354 2341     <span class="k">my</span><span class="s">(</span><span class="i">@AromaticRingAtoms</span><span class="cm">,</span> <span class="i">@AromaticRingAtomsIndices</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2355 2342 | 
|  | 2356 2343     <span class="i">@AromaticRingAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2357 2344     <span class="i">@AromaticRingAtomsIndices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2358 2345 | 
|  | 2359 2346     <span class="j">RINGATOM:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2360 2347       <span class="i">$RingAtom</span> = <span class="i">$RingAtomsRef</span>->[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 2361 2348       <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2362 2349 | 
|  | 2363 2350       <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$FullyAromaticRingsRef</span> && <span class="k">exists</span> <span class="i">$FullyAromaticRingAtomsMap</span>{<span class="i">$RingAtomID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2364 2351         <span class="k">next</span> <span class="j">RINGATOM</span><span class="sc">;</span> | 
|  | 2365 2352       <span class="s">}</span> | 
|  | 2366 2353       <span class="k">if</span> <span class="s">(</span>!<span class="i">$RingAtom</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2367 2354         <span class="k">next</span> <span class="j">RINGATOM</span><span class="sc">;</span> | 
|  | 2368 2355       <span class="s">}</span> | 
|  | 2369 2356       <span class="k">push</span> <span class="i">@AromaticRingAtoms</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="sc">;</span> | 
|  | 2370 2357       <span class="k">push</span> <span class="i">@AromaticRingAtomsIndices</span><span class="cm">,</span> <span class="i">$Index</span><span class="sc">;</span> | 
|  | 2371 2358 | 
|  | 2372 2359     <span class="s">}</span> | 
|  | 2373 2360     <span class="k">if</span> <span class="s">(</span>!<span class="i">@AromaticRingAtoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2374 2361       <span class="k">next</span> <span class="j">RING</span><span class="sc">;</span> | 
|  | 2375 2362     <span class="s">}</span> | 
|  | 2376 2363 | 
|  | 2377 2364     <span class="c"># Start off with a new connected component...</span> | 
|  | 2378 2365     <span class="c">#</span> | 
|  | 2379 2366     <span class="k">my</span><span class="s">(</span><span class="i">$ComponentNum</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2380 2367     <span class="i">$ComponentNum</span> = <span class="k">scalar</span> <span class="i">@PartiallyAromaticRingComponents</span><span class="sc">;</span> | 
|  | 2381 2368     <span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponents</span>[<span class="i">$ComponentNum</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2382 2369 | 
|  | 2383 2370     <span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2384 2371     <span class="k">push</span> <span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponents</span>[<span class="i">$ComponentNum</span>]}<span class="cm">,</span> <span class="i">$AromaticRingAtoms</span>[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 2385 2372 | 
|  | 2386 2373     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#AromaticRingAtoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2387 2374       <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">$AromaticRingAtomsIndices</span>[<span class="i">$Index</span>] - <span class="i">$AromaticRingAtomsIndices</span>[<span class="i">$Index</span> -<span class="n">1</span>]<span class="s">)</span> > <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2388 2375         <span class="c"># New connected component...</span> | 
|  | 2389 2376         <span class="i">$ComponentNum</span> += <span class="n">1</span><span class="sc">;</span> | 
|  | 2390 2377         <span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponents</span>[<span class="i">$ComponentNum</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2391 2378       <span class="s">}</span> | 
|  | 2392 2379       <span class="k">push</span> <span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponents</span>[<span class="i">$ComponentNum</span>]}<span class="cm">,</span> <span class="i">$AromaticRingAtoms</span>[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 2393 2380     <span class="s">}</span> | 
|  | 2394 2381   <span class="s">}</span> | 
|  | 2395 2382 | 
|  | 2396 2383   <span class="k">return</span> <span class="s">(</span>\<span class="i">@PartiallyAromaticRingComponents</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2397 2384 <span class="s">}</span> | 
|  | 2398 2385 | 
|  | 2399 2386 <span class="c"># Kekulize fully aromatic fused and individual rings along with any partially aromatic ring</span> | 
|  | 2400 2387 <span class="c"># components...</span> | 
|  | 2401 2388 <span class="c">#</span> | 
|  | 2402 <a name="_KekulizeCompleteAndPartialAromaticRings-"></a>2389 <span class="k">sub </span><span class="m">_KekulizeCompleteAndPartialAromaticRings</span> <span class="s">{</span> | 
|  | 2403 2390   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AromaticFusedRingSetsRef</span><span class="cm">,</span> <span class="i">$AromaticRingsRef</span><span class="cm">,</span> <span class="i">$PartiallyAromaticRingComponentsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2404 2391   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="cm">,</span> <span class="i">$ConnectedPathsAtomsSetsRef</span><span class="cm">,</span> <span class="i">$ConnectedPathsBondsSetsRef</span><span class="cm">,</span> <span class="i">$ConnectdPathsSetsTypesRef</span><span class="cm">,</span> <span class="i">$PathSetIndex</span><span class="cm">,</span> <span class="i">$PathAtom</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="cm">,</span> <span class="i">$BondID</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$DeleteAtomsAromaticity</span><span class="cm">,</span> <span class="i">$DeleteBondsAromaticity</span><span class="cm">,</span> <span class="i">%PathAtomsProcessingStatusMap</span><span class="cm">,</span> <span class="i">%PathBondsProcessingStatusMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2405 2392 | 
|  | 2406 2393   <span class="s">(</span><span class="i">$ConnectedPathsAtomsSetsRef</span><span class="cm">,</span> <span class="i">$ConnectedPathsBondsSetsRef</span><span class="cm">,</span> <span class="i">$ConnectdPathsSetsTypesRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_SetupCompleteAndPartialAromaticRingsForKekulizaiton</span><span class="s">(</span><span class="i">$AromaticFusedRingSetsRef</span><span class="cm">,</span> <span class="i">$AromaticRingsRef</span><span class="cm">,</span> <span class="i">$PartiallyAromaticRingComponentsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2407 2394 | 
|  | 2408 2395   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ConnectedPathsAtomsSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2409 2396     <span class="c"># Nothing to do...</span> | 
|  | 2410 2397     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2411 2398   <span class="s">}</span> | 
|  | 2412 2399 | 
|  | 2413 2400   <span class="c"># Delete any aromaticity property set for non-ring bonds connected any two ring</span> | 
|  | 2414 2401   <span class="c"># aromatic atoms...</span> | 
|  | 2415 2402   <span class="c">#</span> | 
|  | 2416 2403   <span class="i">$This</span><span class="i">->_ProcessNonRingAromaticBondsBetweenAromaticRingAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2417 2404 | 
|  | 2418 2405   <span class="i">%PathAtomsProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2419 2406   <span class="i">%PathBondsProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2420 2407 | 
|  | 2421 2408   <span class="i">$Status</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 2422 2409 | 
|  | 2423 2410   <span class="j">PATHSET:</span> <span class="k">for</span> <span class="i">$PathSetIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$ConnectedPathsAtomsSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2424 2411     <span class="k">my</span><span class="s">(</span><span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$PathSetProcessingStatusRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2425 2412 | 
|  | 2426 2413     <span class="s">(</span><span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$PathSetProcessingStatusRef</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="s">)</span> x <span class="n">3</span><span class="sc">;</span> | 
|  | 2427 2414 | 
|  | 2428 2415     <span class="k">if</span> <span class="s">(</span><span class="i">$ConnectdPathsSetsTypesRef</span>->[<span class="i">$PathSetIndex</span>] =~ <span class="q">/^FusedAromatic$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2429 2416       <span class="c"># Fused set of connected paths...</span> | 
|  | 2430 2417       <span class="c">#</span> | 
|  | 2431 2418       <span class="k">my</span><span class="s">(</span><span class="i">$FusedConnectedPathAtomsSetRef</span><span class="cm">,</span> <span class="i">$FusedConnectedPathBondsSetRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2432 2419 | 
|  | 2433 2420       <span class="i">$FusedConnectedPathAtomsSetRef</span> = <span class="i">$ConnectedPathsAtomsSetsRef</span>->[<span class="i">$PathSetIndex</span>]<span class="sc">;</span> | 
|  | 2434 2421       <span class="i">$FusedConnectedPathBondsSetRef</span> = <span class="i">$ConnectedPathsBondsSetsRef</span>->[<span class="i">$PathSetIndex</span>]<span class="sc">;</span> | 
|  | 2435 2422 | 
|  | 2436 2423       <span class="c"># Prepare for kekulization...</span> | 
|  | 2437 2424       <span class="s">(</span><span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$PathSetProcessingStatusRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_SetupConnectedPathSetsForKekulization</span><span class="s">(</span><span class="i">$FusedConnectedPathAtomsSetRef</span><span class="cm">,</span> <span class="i">$FusedConnectedPathBondsSetRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2438 2425 | 
|  | 2439 2426       <span class="c"># Perform kekulization starting with the first path set...</span> | 
|  | 2440 2427       <span class="i">$PathSetProcessingStatusRef</span>->[<span class="n">0</span>] = <span class="q">'Processed'</span><span class="sc">;</span> | 
|  | 2441 2428       <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_KekulizeConnectedPathSets</span><span class="s">(</span><span class="i">$FusedConnectedPathAtomsSetRef</span>->[<span class="n">0</span>]<span class="cm">,</span>  <span class="i">$FusedConnectedPathBondsSetRef</span>->[<span class="n">0</span>]<span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$FusedConnectedPathAtomsSetRef</span><span class="cm">,</span> <span class="i">$FusedConnectedPathBondsSetRef</span><span class="cm">,</span> <span class="i">$PathSetProcessingStatusRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2442 2429         <span class="c"># Kekulization failed for the current fused paths set...</span> | 
|  | 2443 2430         <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2444 2431       <span class="s">}</span> | 
|  | 2445 2432     <span class="s">}</span> | 
|  | 2446 2433     <span class="k">else</span> <span class="s">{</span> | 
|  | 2447 2434       <span class="c"># An individual connected path...</span> | 
|  | 2448 2435       <span class="c">#</span> | 
|  | 2449 2436       <span class="k">my</span><span class="s">(</span><span class="i">@ConnectedPathAtomsSet</span><span class="cm">,</span> <span class="i">@ConnectedPathBondsSet</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2450 2437 | 
|  | 2451 2438       <span class="i">@ConnectedPathAtomsSet</span> = <span class="s">(</span><span class="i">$ConnectedPathsAtomsSetsRef</span>->[<span class="i">$PathSetIndex</span>]<span class="s">)</span><span class="sc">;</span> | 
|  | 2452 2439       <span class="i">@ConnectedPathBondsSet</span> = <span class="s">(</span><span class="i">$ConnectedPathsBondsSetsRef</span>->[<span class="i">$PathSetIndex</span>]<span class="s">)</span><span class="sc">;</span> | 
|  | 2453 2440 | 
|  | 2454 2441       <span class="c"># Prepare for kekulization...</span> | 
|  | 2455 2442       <span class="s">(</span><span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_SetupConnectedPathSetsForKekulization</span><span class="s">(</span>\<span class="i">@ConnectedPathAtomsSet</span><span class="cm">,</span> \<span class="i">@ConnectedPathBondsSet</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2456 2443 | 
|  | 2457 2444       <span class="c"># Perform kekulization...</span> | 
|  | 2458 2445       <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_KekulizeConnectedPathSets</span><span class="s">(</span><span class="i">$ConnectedPathsAtomsSetsRef</span>->[<span class="i">$PathSetIndex</span>]<span class="cm">,</span> <span class="i">$ConnectedPathsBondsSetsRef</span>->[<span class="i">$PathSetIndex</span>]<span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2459 2446         <span class="c"># Kekulization failed for the current path...</span> | 
|  | 2460 2447         <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2461 2448       <span class="s">}</span> | 
|  | 2462 2449     <span class="s">}</span> | 
|  | 2463 2450 | 
|  | 2464 2451     <span class="c"># Did kekulization succeed for the current path or path set?</span> | 
|  | 2465 2452     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Status</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2466 2453       <span class="k">last</span> <span class="j">PATHSET</span><span class="sc">;</span> | 
|  | 2467 2454     <span class="s">}</span> | 
|  | 2468 2455 | 
|  | 2469 2456     <span class="c"># Track atom and bond processing state for final assignment after kekulization</span> | 
|  | 2470 2457     <span class="c"># is successfully completed for all the paths and fused path sets...</span> | 
|  | 2471 2458     <span class="c">#</span> | 
|  | 2472 2459     <span class="k">for</span> <span class="i">$AtomID</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%</span>{<span class="i">$AtomProcessingStatusMapRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2473 2460       <span class="i">$PathAtomsProcessingStatusMap</span>{<span class="i">$AtomID</span>} = <span class="i">$AtomProcessingStatusMapRef</span>->{<span class="i">$AtomID</span>}<span class="sc">;</span> | 
|  | 2474 2461     <span class="s">}</span> | 
|  | 2475 2462 | 
|  | 2476 2463     <span class="k">for</span> <span class="i">$BondID</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%</span>{<span class="i">$BondProcessingStatusMapRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2477 2464       <span class="i">$PathBondsProcessingStatusMap</span>{<span class="i">$BondID</span>} = <span class="i">$BondProcessingStatusMapRef</span>->{<span class="i">$BondID</span>}<span class="sc">;</span> | 
|  | 2478 2465     <span class="s">}</span> | 
|  | 2479 2466   <span class="s">}</span> | 
|  | 2480 2467 | 
|  | 2481 2468   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Status</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2482 2469     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_KekulizeCompleteAndPartialAromaticRings: Couldn't perform kekulization for marked ring aromatic atoms..."</span><span class="sc">;</span> | 
|  | 2483 2470     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2484 2471   <span class="s">}</span> | 
|  | 2485 2472 | 
|  | 2486 2473   <span class="c"># Use PathAtomsProcessingStatusMap and PathBondsProcessingStatusMap to set</span> | 
|  | 2487 2474   <span class="c"># single/double bonds in the molecule after successful kekulization along with modification of</span> | 
|  | 2488 2475   <span class="c"># any aromatic flags...</span> | 
|  | 2489 2476 | 
|  | 2490 2477   <span class="k">for</span> <span class="i">$PathSetIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$ConnectedPathsAtomsSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2491 2478     <span class="i">$DeleteAtomsAromaticity</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$DeleteBondsAromaticity</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2492 2479 | 
|  | 2493 2480     <span class="k">if</span> <span class="s">(</span><span class="i">$ConnectdPathsSetsTypesRef</span>->[<span class="i">$PathSetIndex</span>] =~ <span class="q">/^FusedAromatic$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2494 2481       <span class="k">for</span> <span class="i">$PathBondsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConnectedPathsBondsSetsRef</span>->[<span class="i">$PathSetIndex</span>]}<span class="s">)</span> <span class="s">{</span> | 
|  | 2495 2482         <span class="i">$This</span><span class="i">->_ProcessBondOrdersAssignedDuringSuccessfulKekulization</span><span class="s">(</span><span class="i">$PathBondsRef</span><span class="cm">,</span> \<span class="i">%PathBondsProcessingStatusMap</span><span class="cm">,</span> <span class="i">$DeleteBondsAromaticity</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2496 2483       <span class="s">}</span> | 
|  | 2497 2484     <span class="s">}</span> | 
|  | 2498 2485     <span class="k">else</span> <span class="s">{</span> | 
|  | 2499 2486       <span class="k">if</span> <span class="s">(</span><span class="i">$ConnectdPathsSetsTypesRef</span>->[<span class="i">$PathSetIndex</span>] =~ <span class="q">/^PartiallyAromatic$/i</span> <span class="s">)</span> <span class="s">{</span> | 
|  | 2500 2487         <span class="i">$DeleteBondsAromaticity</span> = <span class="n">1</span><span class="sc">;</span> <span class="i">$DeleteAtomsAromaticity</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 2501 2488       <span class="s">}</span> | 
|  | 2502 2489 | 
|  | 2503 2490       <span class="k">if</span> <span class="s">(</span><span class="i">$DeleteAtomsAromaticity</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2504 2491         <span class="k">for</span> <span class="i">$PathAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConnectedPathsAtomsSetsRef</span>->[<span class="i">$PathSetIndex</span>]}<span class="s">)</span> <span class="s">{</span> | 
|  | 2505 2492           <span class="i">$PathAtom</span><span class="i">->DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2506 2493         <span class="s">}</span> | 
|  | 2507 2494       <span class="s">}</span> | 
|  | 2508 2495 | 
|  | 2509 2496       <span class="i">$This</span><span class="i">->_ProcessBondOrdersAssignedDuringSuccessfulKekulization</span><span class="s">(</span><span class="i">$ConnectedPathsBondsSetsRef</span>->[<span class="i">$PathSetIndex</span>]<span class="cm">,</span> \<span class="i">%PathBondsProcessingStatusMap</span><span class="cm">,</span> <span class="i">$DeleteBondsAromaticity</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2510 2497     <span class="s">}</span> | 
|  | 2511 2498   <span class="s">}</span> | 
|  | 2512 2499 | 
|  | 2513 2500   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2514 2501 <span class="s">}</span> | 
|  | 2515 2502 | 
|  | 2516 2503 <span class="c"># Look for any aromatic bonds outside the rings between two ring aromatic atoms</span> | 
|  | 2517 2504 <span class="c"># and turn them into single non-aromatic bonds before kekulization; otherwise, kekulization</span> | 
|  | 2518 2505 <span class="c"># fails.</span> | 
|  | 2519 2506 <span class="c">#</span> | 
|  | 2520 2507 <span class="c"># Note:</span> | 
|  | 2521 2508 <span class="c">#   . Two atoms marked as aromatic atoms in two different rings, such as two rings</span> | 
|  | 2522 2509 <span class="c">#     connected through a single bond, are still aromatic, but the bond is outside</span> | 
|  | 2523 2510 <span class="c">#     the ring and shouldn't be marked as aromatic. It should be set to single bond without</span> | 
|  | 2524 2511 <span class="c">#     any aromatic property for kekulization to succeed.</span> | 
|  | 2525 2512 <span class="c">#</span> | 
|  | 2526 2513 <span class="c">#     For example, the molecule  generated by SMILES parser for biphenyl SMILES string</span> | 
|  | 2527 2514 <span class="c">#     "c1ccccc1c2ccccc2" sets up an aromatic bond between the two phenyl rings, as</span> | 
|  | 2528 2515 <span class="c">#     it's connected to two aromatic atoms.</span> | 
|  | 2529 2516 <span class="c">#</span> | 
|  | 2530 <a name="_ProcessNonRingAromaticBondsBetweenAromaticRingAtoms-"></a>2517 <span class="k">sub </span><span class="m">_ProcessNonRingAromaticBondsBetweenAromaticRingAtoms</span> <span class="s">{</span> | 
|  | 2531 2518   <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> | 
|  | 2532 2519   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="cm">,</span> <span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2533 2520 | 
|  | 2534 2521   <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> | 
|  | 2535 2522     <span class="k">if</span> <span class="s">(</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="i">$Bond</span><span class="i">->IsNotInRing</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2536 2523       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 2537 2524     <span class="s">}</span> | 
|  | 2538 2525 | 
|  | 2539 2526     <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2540 2527     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$Atom1</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span> && <span class="i">$Atom2</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span> && <span class="i">$Atom1</span><span class="i">->IsInRing</span><span class="s">(</span><span class="s">)</span> && <span class="i">$Atom2</span><span class="i">->IsInRing</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2541 2528       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 2542 2529     <span class="s">}</span> | 
|  | 2543 2530 | 
|  | 2544 2531     <span class="i">$Bond</span><span class="i">->SetBondOrder</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2545 2532     <span class="i">$Bond</span><span class="i">->DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2546 2533   <span class="s">}</span> | 
|  | 2547 2534 | 
|  | 2548 2535   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 2549 2536 <span class="s">}</span> | 
|  | 2550 2537 | 
|  | 2551 2538 <span class="c"># Setup completelty aromatic fused and individual rings along with partially aromatic ring</span> | 
|  | 2552 2539 <span class="c"># components as sets of connected paths...</span> | 
|  | 2553 2540 <span class="c">#</span> | 
|  | 2554 <a name="_SetupCompleteAndPartialAromaticRingsForKekulizaiton-"></a>2541 <span class="k">sub </span><span class="m">_SetupCompleteAndPartialAromaticRingsForKekulizaiton</span> <span class="s">{</span> | 
|  | 2555 2542   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AromaticFusedRingSetsRef</span><span class="cm">,</span> <span class="i">$AromaticRingsRef</span><span class="cm">,</span> <span class="i">$PartiallyAromaticRingComponentsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2556 2543   <span class="k">my</span><span class="s">(</span><span class="i">@ConnectedPathsSets</span><span class="cm">,</span> <span class="i">@ConnectedPathsBondsSets</span><span class="cm">,</span> <span class="i">@ConnectdPathsSetsTypes</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2557 2544 | 
|  | 2558 2545   <span class="i">@ConnectedPathsSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2559 2546   <span class="i">@ConnectedPathsBondsSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2560 2547   <span class="i">@ConnectdPathsSetsTypes</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2561 2548 | 
|  | 2562 2549   <span class="c"># Setup atoms and bonds for connected paths in fused aromatic ring sets...</span> | 
|  | 2563 2550   <span class="c">#</span> | 
|  | 2564 2551   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$AromaticFusedRingSetsRef</span> && <span class="i">@</span>{<span class="i">$AromaticFusedRingSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2565 2552     <span class="k">my</span><span class="s">(</span><span class="i">$RingSetIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2566 2553 | 
|  | 2567 2554     <span class="k">push</span> <span class="i">@ConnectdPathsSetsTypes</span><span class="cm">,</span> <span class="s">(</span><span class="q">'FusedAromatic'</span><span class="s">)</span> x <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$AromaticFusedRingSetsRef</span>}<span class="sc">;</span> | 
|  | 2568 2555     <span class="k">push</span> <span class="i">@ConnectedPathsSets</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$AromaticFusedRingSetsRef</span>}<span class="sc">;</span> | 
|  | 2569 2556 | 
|  | 2570 2557     <span class="k">for</span> <span class="i">$RingSetIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$AromaticFusedRingSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2571 2558       <span class="k">my</span><span class="s">(</span><span class="i">@AromaticFusedRingBondsSet</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2572 2559 | 
|  | 2573 2560       <span class="c"># Get ring bonds for each ring set...</span> | 
|  | 2574 2561       <span class="c">#</span> | 
|  | 2575 2562       <span class="i">@AromaticFusedRingBondsSet</span> = <span class="i">$This</span><span class="i">->GetRingBondsFromRings</span><span class="s">(</span><span class="i">@</span>{<span class="i">$AromaticFusedRingSetsRef</span>->[<span class="i">$RingSetIndex</span>]}<span class="s">)</span><span class="sc">;</span> | 
|  | 2576 2563       <span class="k">push</span> <span class="i">@ConnectedPathsBondsSets</span><span class="cm">,</span> \<span class="i">@AromaticFusedRingBondsSet</span><span class="sc">;</span> | 
|  | 2577 2564     <span class="s">}</span> | 
|  | 2578 2565   <span class="s">}</span> | 
|  | 2579 2566 | 
|  | 2580 2567   <span class="c"># Set up atoms and bonds for connected paths in aromatic rings...</span> | 
|  | 2581 2568   <span class="c">#</span> | 
|  | 2582 2569   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$AromaticRingsRef</span> && <span class="i">@</span>{<span class="i">$AromaticRingsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2583 2570     <span class="k">my</span><span class="s">(</span><span class="i">@AromaticRingBondsSets</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2584 2571 | 
|  | 2585 2572     <span class="k">push</span> <span class="i">@ConnectdPathsSetsTypes</span><span class="cm">,</span> <span class="s">(</span><span class="q">'Aromatic'</span><span class="s">)</span> x <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$AromaticRingsRef</span>}<span class="sc">;</span> | 
|  | 2586 2573     <span class="k">push</span> <span class="i">@ConnectedPathsSets</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$AromaticRingsRef</span>}<span class="sc">;</span> | 
|  | 2587 2574 | 
|  | 2588 2575     <span class="c"># Get ring bonds for each ring...</span> | 
|  | 2589 2576     <span class="i">@AromaticRingBondsSets</span> = <span class="i">$This</span><span class="i">->GetRingBondsFromRings</span><span class="s">(</span><span class="i">@</span>{<span class="i">$AromaticRingsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 2590 2577     <span class="k">push</span> <span class="i">@ConnectedPathsBondsSets</span><span class="cm">,</span> <span class="i">@AromaticRingBondsSets</span><span class="sc">;</span> | 
|  | 2591 2578   <span class="s">}</span> | 
|  | 2592 2579 | 
|  | 2593 2580   <span class="c"># Set up atoms and bonds for connected paths in partially aromatic rings...</span> | 
|  | 2594 2581   <span class="c">#</span> | 
|  | 2595 2582   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$PartiallyAromaticRingComponentsRef</span> && <span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponentsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2596 2583     <span class="k">my</span><span class="s">(</span><span class="i">$ComponentIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2597 2584 | 
|  | 2598 2585     <span class="k">push</span> <span class="i">@ConnectedPathsSets</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponentsRef</span>}<span class="sc">;</span> | 
|  | 2599 2586     <span class="k">push</span> <span class="i">@ConnectdPathsSetsTypes</span><span class="cm">,</span> <span class="s">(</span><span class="q">'PartiallyAromatic'</span><span class="s">)</span> x <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponentsRef</span>}<span class="sc">;</span> | 
|  | 2600 2587 | 
|  | 2601 2588     <span class="k">for</span> <span class="i">$ComponentIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PartiallyAromaticRingComponentsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2602 2589       <span class="k">my</span><span class="s">(</span><span class="i">@ComponentBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2603 2590       <span class="i">@ComponentBonds</span> = <span class="i">$This</span><span class="i">->_GetPathBonds</span><span class="s">(</span><span class="i">$This</span><span class="i">->_GetAtomsIDsFromAtoms</span><span class="s">(</span><span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponentsRef</span>->[<span class="i">$ComponentIndex</span>]}<span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2604 2591       <span class="k">push</span> <span class="i">@ConnectedPathsBondsSets</span><span class="cm">,</span> \<span class="i">@ComponentBonds</span><span class="sc">;</span> | 
|  | 2605 2592     <span class="s">}</span> | 
|  | 2606 2593   <span class="s">}</span> | 
|  | 2607 2594 | 
|  | 2608 2595   <span class="k">return</span> <span class="s">(</span>\<span class="i">@ConnectedPathsSets</span><span class="cm">,</span> \<span class="i">@ConnectedPathsBondsSets</span><span class="cm">,</span> \<span class="i">@ConnectdPathsSetsTypes</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2609 2596 <span class="s">}</span> | 
|  | 2610 2597 | 
|  | 2611 2598 <span class="c"># Process non-ring connected atoms which are marked aromatic and set connected</span> | 
|  | 2612 2599 <span class="c"># bonds as alternate single/double bonds...</span> | 
|  | 2613 2600 <span class="c">#</span> | 
|  | 2614 2601 <span class="c"># Notes:</span> | 
|  | 2615 2602 <span class="c">#   . Atom and bond aromaticity is deleted during kekulization of non-ring atoms.</span> | 
|  | 2616 2603 <span class="c">#</span> | 
|  | 2617 <a name="_KekulizeAromaticAtomsNotInRings-"></a>2604 <span class="k">sub </span><span class="m">_KekulizeAromaticAtomsNotInRings</span> <span class="s">{</span> | 
|  | 2618 2605   <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> | 
|  | 2619 2606   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="cm">,</span> <span class="i">$PathIndex</span><span class="cm">,</span> <span class="i">$PathAtom</span><span class="cm">,</span> <span class="i">$PathAtomID</span><span class="cm">,</span> <span class="i">$PathBondID</span><span class="cm">,</span> <span class="i">$ConnectedPathsAtomsRef</span><span class="cm">,</span> <span class="i">$ConnectedPathsBondsRef</span><span class="cm">,</span> <span class="i">$DeleteAtomsAromaticity</span><span class="cm">,</span> <span class="i">$DeleteBondsAromaticity</span><span class="cm">,</span> <span class="i">%PathAtomsProcessingStatusMap</span><span class="cm">,</span> <span class="i">%PathBondsProcessingStatusMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2620 2607 | 
|  | 2621 2608   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasAromaticAtomsNotInRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2622 2609     <span class="c"># Nothing to do...</span> | 
|  | 2623 2610     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2624 2611   <span class="s">}</span> | 
|  | 2625 2612 | 
|  | 2626 2613   <span class="c"># Identify paths for connected components containing non-ring aromatic atoms...</span> | 
|  | 2627 2614   <span class="s">(</span><span class="i">$ConnectedPathsAtomsRef</span><span class="cm">,</span> <span class="i">$ConnectedPathsBondsRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_GetConnectedComponentsPathsForNonRingAromaticAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2628 2615 | 
|  | 2629 2616   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ConnectedPathsAtomsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2630 2617     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_KekulizeAromaticAtomsNotInRings: Couldn't perform kekulization for marked non-ring aromatic atoms..."</span><span class="sc">;</span> | 
|  | 2631 2618     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2632 2619   <span class="s">}</span> | 
|  | 2633 2620 | 
|  | 2634 2621   <span class="i">%PathAtomsProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2635 2622   <span class="i">%PathBondsProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2636 2623 | 
|  | 2637 2624   <span class="i">$Status</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 2638 2625 | 
|  | 2639 2626   <span class="j">PATH:</span> <span class="k">for</span> <span class="i">$PathIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$ConnectedPathsAtomsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2640 2627     <span class="k">my</span><span class="s">(</span><span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">@ConnectedPathAtomsSet</span><span class="cm">,</span> <span class="i">@ConnectedPathBondsSet</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2641 2628 | 
|  | 2642 2629     <span class="s">(</span><span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="s">)</span> x <span class="n">2</span><span class="sc">;</span> | 
|  | 2643 2630 | 
|  | 2644 2631     <span class="i">@ConnectedPathAtomsSet</span> = <span class="s">(</span><span class="i">$ConnectedPathsAtomsRef</span>->[<span class="i">$PathIndex</span>]<span class="s">)</span><span class="sc">;</span> | 
|  | 2645 2632     <span class="i">@ConnectedPathBondsSet</span> = <span class="s">(</span><span class="i">$ConnectedPathsBondsRef</span>->[<span class="i">$PathIndex</span>]<span class="s">)</span><span class="sc">;</span> | 
|  | 2646 2633 | 
|  | 2647 2634     <span class="c"># Prepare for kekulization...</span> | 
|  | 2648 2635     <span class="s">(</span><span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_SetupConnectedPathSetsForKekulization</span><span class="s">(</span>\<span class="i">@ConnectedPathAtomsSet</span><span class="cm">,</span> \<span class="i">@ConnectedPathBondsSet</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2649 2636 | 
|  | 2650 2637     <span class="c"># Perform kekulization...</span> | 
|  | 2651 2638     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_KekulizeConnectedPathSets</span><span class="s">(</span><span class="i">$ConnectedPathsAtomsRef</span>->[<span class="i">$PathIndex</span>]<span class="cm">,</span> <span class="i">$ConnectedPathsBondsRef</span>->[<span class="i">$PathIndex</span>]<span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2652 2639       <span class="c"># Kekulization failed for the current path...</span> | 
|  | 2653 2640       <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2654 2641       <span class="k">last</span> <span class="j">PATH</span><span class="sc">;</span> | 
|  | 2655 2642     <span class="s">}</span> | 
|  | 2656 2643 | 
|  | 2657 2644     <span class="c"># Track atom and bond processing state for final assignment after kekulization</span> | 
|  | 2658 2645     <span class="c"># is successfully completed for all the paths and fused path sets...</span> | 
|  | 2659 2646     <span class="c">#</span> | 
|  | 2660 2647     <span class="k">for</span> <span class="i">$PathAtomID</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%</span>{<span class="i">$AtomProcessingStatusMapRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2661 2648       <span class="i">$PathAtomsProcessingStatusMap</span>{<span class="i">$PathAtomID</span>} = <span class="i">$AtomProcessingStatusMapRef</span>->{<span class="i">$PathAtomID</span>}<span class="sc">;</span> | 
|  | 2662 2649     <span class="s">}</span> | 
|  | 2663 2650 | 
|  | 2664 2651     <span class="k">for</span> <span class="i">$PathBondID</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%</span>{<span class="i">$BondProcessingStatusMapRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2665 2652       <span class="i">$PathBondsProcessingStatusMap</span>{<span class="i">$PathBondID</span>} = <span class="i">$BondProcessingStatusMapRef</span>->{<span class="i">$PathBondID</span>}<span class="sc">;</span> | 
|  | 2666 2653     <span class="s">}</span> | 
|  | 2667 2654   <span class="s">}</span> | 
|  | 2668 2655 | 
|  | 2669 2656   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Status</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2670 2657     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_KekulizeAromaticAtomsNotInRings: Couldn't perform kekulization for marked non-ring aromatic atoms..."</span><span class="sc">;</span> | 
|  | 2671 2658     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2672 2659   <span class="s">}</span> | 
|  | 2673 2660 | 
|  | 2674 2661   <span class="i">$DeleteAtomsAromaticity</span> = <span class="n">1</span><span class="sc">;</span> <span class="i">$DeleteBondsAromaticity</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 2675 2662   <span class="k">for</span> <span class="i">$PathIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$ConnectedPathsAtomsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2676 2663     <span class="k">if</span> <span class="s">(</span><span class="i">$DeleteAtomsAromaticity</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2677 2664       <span class="k">for</span> <span class="i">$PathAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConnectedPathsAtomsRef</span>->[<span class="i">$PathIndex</span>]}<span class="s">)</span> <span class="s">{</span> | 
|  | 2678 2665         <span class="i">$PathAtom</span><span class="i">->DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2679 2666       <span class="s">}</span> | 
|  | 2680 2667     <span class="s">}</span> | 
|  | 2681 2668     <span class="i">$This</span><span class="i">->_ProcessBondOrdersAssignedDuringSuccessfulKekulization</span><span class="s">(</span><span class="i">$ConnectedPathsBondsRef</span>->[<span class="i">$PathIndex</span>]<span class="cm">,</span> \<span class="i">%PathBondsProcessingStatusMap</span><span class="cm">,</span> <span class="i">$DeleteBondsAromaticity</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2682 2669   <span class="s">}</span> | 
|  | 2683 2670 | 
|  | 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"># Collect path atoms for connected components paths containing non-ring aromatic atoms...</span> | 
|  | 2688 2675 <span class="c">#</span> | 
|  | 2689 <a name="_GetConnectedComponentsPathsForNonRingAromaticAtoms-"></a>2676 <span class="k">sub </span><span class="m">_GetConnectedComponentsPathsForNonRingAromaticAtoms</span> <span class="s">{</span> | 
|  | 2690 2677   <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> | 
|  | 2691 2678   <span class="k">my</span><span class="s">(</span><span class="i">$ComponentRef</span><span class="cm">,</span> <span class="i">$AtomIDsRef</span><span class="cm">,</span> <span class="i">$AtomIDsMapRef</span><span class="cm">,</span> <span class="i">$ConnectedComponentsAtomIDsRef</span><span class="cm">,</span> <span class="i">$ConnectedComponentsAtomIDsMapRef</span><span class="cm">,</span> <span class="i">$ConnectedComponentsPathsAtomIDsRef</span><span class="cm">,</span> <span class="i">$ConnectedComponentsPathsAtomsRef</span><span class="cm">,</span> <span class="i">$ConnectedComponentsPathsBondsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2692 2679 | 
|  | 2693 2680   <span class="c"># Retrieve information for marked aromatic atoms not in the rings...</span> | 
|  | 2694 2681   <span class="s">(</span><span class="i">$AtomIDsRef</span><span class="cm">,</span> <span class="i">$AtomIDsMapRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_GetNonRingAromaticAtomIDs</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2695 2682 | 
|  | 2696 2683   <span class="c"># Identify connected components containing marked aromatic atoms not in the rings...</span> | 
|  | 2697 2684   <span class="s">(</span><span class="i">$ConnectedComponentsAtomIDsRef</span><span class="cm">,</span> <span class="i">$ConnectedComponentsAtomIDsMapRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_GetConnectedComponentsForNonRingAromaticAtoms</span><span class="s">(</span><span class="i">$AtomIDsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2698 2685 | 
|  | 2699 2686   <span class="c"># Identify paths for connected components containing non-ring aromatic atoms...</span> | 
|  | 2700 2687   <span class="s">(</span><span class="i">$ConnectedComponentsPathsAtomsRef</span><span class="cm">,</span> <span class="i">$ConnectedComponentsPathsBondsRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_GetConnectedComponentsPathsAtomsAndBondsForNonRingAromaticAtoms</span><span class="s">(</span><span class="i">$AtomIDsMapRef</span><span class="cm">,</span> <span class="i">$ConnectedComponentsAtomIDsRef</span><span class="cm">,</span> <span class="i">$ConnectedComponentsAtomIDsMapRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2701 2688 | 
|  | 2702 2689   <span class="k">return</span> <span class="s">(</span><span class="i">$ConnectedComponentsPathsAtomsRef</span><span class="cm">,</span> <span class="i">$ConnectedComponentsPathsBondsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2703 2690 <span class="s">}</span> | 
|  | 2704 2691 | 
|  | 2705 2692 <span class="c"># Collect information for marked aromatic atoms not in the rings...</span> | 
|  | 2706 2693 <span class="c">#</span> | 
|  | 2707 <a name="_GetNonRingAromaticAtomIDs-"></a>2694 <span class="k">sub </span><span class="m">_GetNonRingAromaticAtomIDs</span> <span class="s">{</span> | 
|  | 2708 2695   <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> | 
|  | 2709 2696   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="cm">,</span> <span class="i">%AtomIDsMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2710 2697 | 
|  | 2711 2698   <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2712 2699   <span class="i">%AtomIDsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2713 2700 | 
|  | 2714 2701   <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2715 2702     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2716 2703       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span> | 
|  | 2717 2704     <span class="s">}</span> | 
|  | 2718 2705     <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">->IsInRing</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2719 2706       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span> | 
|  | 2720 2707     <span class="s">}</span> | 
|  | 2721 2708     <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2722 2709 | 
|  | 2723 2710     <span class="k">push</span> <span class="i">@AtomIDs</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="sc">;</span> | 
|  | 2724 2711     <span class="i">$AtomIDsMap</span>{<span class="i">$AtomID</span>} = <span class="i">$Atom</span><span class="sc">;</span> | 
|  | 2725 2712   <span class="s">}</span> | 
|  | 2726 2713 | 
|  | 2727 2714   <span class="k">return</span> <span class="s">(</span>\<span class="i">@AtomIDs</span><span class="cm">,</span> \<span class="i">%AtomIDsMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2728 2715 <span class="s">}</span> | 
|  | 2729 2716 | 
|  | 2730 2717 <span class="c"># Retrieve connected non-ring atom components as a reference to an array of references</span> | 
|  | 2731 2718 <span class="c"># containing atom IDs of connecnted components...</span> | 
|  | 2732 2719 <span class="c">#</span> | 
|  | 2733 <a name="_GetConnectedComponentsForNonRingAromaticAtoms-"></a>2720 <span class="k">sub </span><span class="m">_GetConnectedComponentsForNonRingAromaticAtoms</span> <span class="s">{</span> | 
|  | 2734 2721   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomIDsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2735 2722   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="cm">,</span> <span class="i">$AtomIDsGraph</span><span class="cm">,</span> <span class="i">@BondedAtomPairIDs</span><span class="cm">,</span> <span class="i">@ComponentsAtomIDsRefs</span><span class="cm">,</span> <span class="i">@ComponentsAtomIDsMapRefs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2736 2723 | 
|  | 2737 2724   <span class="i">@ComponentsAtomIDsRefs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2738 2725   <span class="i">@ComponentsAtomIDsMapRefs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2739 2726 | 
|  | 2740 2727   <span class="c"># Get bonded atom pair IDs...</span> | 
|  | 2741 2728   <span class="i">@BondedAtomPairIDs</span> = <span class="i">$This</span><span class="i">->_GetBondedAtomPairAtomIDsFromAtomIDs</span><span class="s">(</span><span class="i">@</span>{<span class="i">$AtomIDsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 2742 2729 | 
|  | 2743 2730   <span class="k">if</span> <span class="s">(</span>!<span class="i">@BondedAtomPairIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2744 2731     <span class="k">return</span> <span class="s">(</span>\<span class="i">@ComponentsAtomIDsRefs</span><span class="cm">,</span> \<span class="i">@ComponentsAtomIDsMapRefs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2745 2732   <span class="s">}</span> | 
|  | 2746 2733 | 
|  | 2747 2734   <span class="i">$AtomIDsGraph</span> = <span class="i">new</span> <span class="i">Graph</span><span class="s">(</span><span class="i">@</span>{<span class="i">$AtomIDsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 2748 2735   <span class="i">$AtomIDsGraph</span><span class="i">->AddEdges</span><span class="s">(</span><span class="i">@BondedAtomPairIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2749 2736 | 
|  | 2750 2737   <span class="i">@ComponentsAtomIDsRefs</span> = <span class="i">$AtomIDsGraph</span><span class="i">->GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2751 2738 | 
|  | 2752 2739   <span class="c"># Setup atom IDs map for each component...</span> | 
|  | 2753 2740   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#ComponentsAtomIDsRefs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2754 2741     <span class="i">%</span>{<span class="i">$ComponentsAtomIDsMapRefs</span>[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2755 2742 | 
|  | 2756 2743     <span class="k">for</span> <span class="i">$AtomID</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ComponentsAtomIDsRefs</span>[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span> | 
|  | 2757 2744       <span class="i">$ComponentsAtomIDsMapRefs</span>[<span class="i">$Index</span>]{<span class="i">$AtomID</span>} = <span class="i">$AtomID</span><span class="sc">;</span> | 
|  | 2758 2745     <span class="s">}</span> | 
|  | 2759 2746   <span class="s">}</span> | 
|  | 2760 2747 | 
|  | 2761 2748   <span class="k">return</span> <span class="s">(</span>\<span class="i">@ComponentsAtomIDsRefs</span><span class="cm">,</span> \<span class="i">@ComponentsAtomIDsMapRefs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2762 2749 <span class="s">}</span> | 
|  | 2763 2750 | 
|  | 2764 2751 <span class="c"># Get linear paths for connected components starting and ending at terminal aromatic atoms,</span> | 
|  | 2765 2752 <span class="c"># which are connected to only one other aromatic atom in the connected component..</span> | 
|  | 2766 2753 <span class="c">#</span> | 
|  | 2767 <a name="_GetConnectedComponentsPathsAtomsAndBondsForNonRingAromaticAtoms-"></a>2754 <span class="k">sub </span><span class="m">_GetConnectedComponentsPathsAtomsAndBondsForNonRingAromaticAtoms</span> <span class="s">{</span> | 
|  | 2768 2755   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomIDsMapRef</span><span class="cm">,</span> <span class="i">$ComponentsAtomIDsRef</span><span class="cm">,</span> <span class="i">$ComponentsAtomIDsMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2769 2756   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$AtomNbr</span><span class="cm">,</span> <span class="i">$AtomNbrID</span><span class="cm">,</span> <span class="i">$NumOfNonRingAromaticNbrs</span><span class="cm">,</span> <span class="i">$AtomIndex1</span><span class="cm">,</span> <span class="i">$AtomIndex2</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="cm">,</span> <span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="cm">,</span> <span class="i">$AtomIDsGraph</span><span class="cm">,</span> <span class="i">$StartTerminalAtomID</span><span class="cm">,</span> <span class="i">$EndTerminalAtomID</span><span class="cm">,</span> <span class="i">@Paths</span><span class="cm">,</span> <span class="i">@PathAtomIDs</span><span class="cm">,</span> <span class="i">@PathsAtoms</span><span class="cm">,</span> <span class="i">@PathsBonds</span><span class="cm">,</span> <span class="i">@TerminalAtomIDs</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="cm">,</span> <span class="i">@BondedAtomPairIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2770 2757 | 
|  | 2771 2758   <span class="i">@PathsAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2772 2759   <span class="i">@PathsBonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2773 2760 | 
|  | 2774 2761   <span class="i">@TerminalAtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2775 2762 | 
|  | 2776 2763   <span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2777 2764   <span class="j">COMPONENT:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$ComponentsAtomIDsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2778 2765     <span class="i">@</span>{<span class="i">$TerminalAtomIDs</span>[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2779 2766 | 
|  | 2780 2767     <span class="c"># Identify terminal atoms for connected components...</span> | 
|  | 2781 2768     <span class="c">#</span> | 
|  | 2782 2769     <span class="c"># Notes:</span> | 
|  | 2783 2770     <span class="c">#   . Terminal atoms are defined as atoms connected to only one marked</span> | 
|  | 2784 2771     <span class="c">#     aromatic atom.</span> | 
|  | 2785 2772     <span class="c">#   . Linear connected compoents contain only two terminal atoms.</span> | 
|  | 2786 2773     <span class="c">#</span> | 
|  | 2787 2774     <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$AtomID</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ComponentsAtomIDsRef</span>->[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span> | 
|  | 2788 2775       <span class="i">$Atom</span> = <span class="i">$AtomIDsMapRef</span>->{<span class="i">$AtomID</span>}<span class="sc">;</span> | 
|  | 2789 2776       <span class="i">$NumOfNonRingAromaticNbrs</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2790 2777 | 
|  | 2791 2778       <span class="j">ATOMNBRID:</span> <span class="k">for</span> <span class="i">$AtomNbr</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">->GetNeighbors</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2792 2779         <span class="i">$AtomNbrID</span> = <span class="i">$AtomNbr</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2793 2780 | 
|  | 2794 2781         <span class="c"># Is neighbor in the same connected components containing aromatic atoms?</span> | 
|  | 2795 2782         <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$ComponentsAtomIDsMapRef</span>->[<span class="i">$Index</span>]{<span class="i">$AtomNbrID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2796 2783           <span class="k">next</span> <span class="j">ATOMNBRID</span><span class="sc">;</span> | 
|  | 2797 2784         <span class="s">}</span> | 
|  | 2798 2785         <span class="i">$NumOfNonRingAromaticNbrs</span>++<span class="sc">;</span> | 
|  | 2799 2786       <span class="s">}</span> | 
|  | 2800 2787 | 
|  | 2801 2788       <span class="c"># Is it a terminal atom?</span> | 
|  | 2802 2789       <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfNonRingAromaticNbrs</span> != <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2803 2790         <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span> | 
|  | 2804 2791       <span class="s">}</span> | 
|  | 2805 2792       <span class="k">push</span> <span class="i">@</span>{<span class="i">$TerminalAtomIDs</span>[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">$AtomID</span><span class="sc">;</span> | 
|  | 2806 2793     <span class="s">}</span> | 
|  | 2807 2794 | 
|  | 2808 2795     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TerminalAtomIDs</span>[<span class="i">$Index</span>]} != <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2809 2796       <span class="k">next</span> <span class="j">COMPONENT</span><span class="sc">;</span> | 
|  | 2810 2797     <span class="s">}</span> | 
|  | 2811 2798 | 
|  | 2812 2799     <span class="c"># Setup bonded atom pair IDs for connected component...</span> | 
|  | 2813 2800     <span class="c">#</span> | 
|  | 2814 2801     <span class="i">@AtomIDs</span> = <span class="i">@</span>{<span class="i">$ComponentsAtomIDsRef</span>->[<span class="i">$Index</span>]}<span class="sc">;</span> | 
|  | 2815 2802     <span class="i">@BondedAtomPairIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2816 2803 | 
|  | 2817 2804     <span class="k">for</span> <span class="i">$AtomIndex1</span> <span class="s">(</span> <span class="n">0</span> .. <span class="i">$#AtomIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2818 2805       <span class="i">$AtomID1</span> = <span class="i">$AtomIDs</span>[<span class="i">$AtomIndex1</span>]<span class="sc">;</span> | 
|  | 2819 2806       <span class="i">$Atom1</span> = <span class="i">$AtomIDsMapRef</span>->{<span class="i">$AtomID1</span>}<span class="sc">;</span> | 
|  | 2820 2807 | 
|  | 2821 2808       <span class="k">for</span> <span class="i">$AtomIndex2</span> <span class="s">(</span> <span class="s">(</span><span class="i">$AtomIndex1</span> + <span class="n">1</span><span class="s">)</span> .. <span class="i">$#AtomIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2822 2809         <span class="i">$AtomID2</span> = <span class="i">$AtomIDs</span>[<span class="i">$AtomIndex2</span>]<span class="sc">;</span> | 
|  | 2823 2810         <span class="i">$Atom2</span> = <span class="i">$AtomIDsMapRef</span>->{<span class="i">$AtomID2</span>}<span class="sc">;</span> | 
|  | 2824 2811 | 
|  | 2825 2812         <span class="k">if</span> <span class="s">(</span><span class="i">$Atom1</span><span class="i">->IsBondedToAtom</span><span class="s">(</span><span class="i">$Atom2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2826 2813           <span class="k">push</span> <span class="i">@BondedAtomPairIDs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2827 2814         <span class="s">}</span> | 
|  | 2828 2815       <span class="s">}</span> | 
|  | 2829 2816     <span class="s">}</span> | 
|  | 2830 2817 | 
|  | 2831 2818     <span class="k">if</span> <span class="s">(</span>!<span class="i">@BondedAtomPairIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2832 2819       <span class="k">next</span> <span class="j">COMPONENT</span><span class="sc">;</span> | 
|  | 2833 2820     <span class="s">}</span> | 
|  | 2834 2821 | 
|  | 2835 2822     <span class="c"># Get path for connected component...</span> | 
|  | 2836 2823     <span class="i">$AtomIDsGraph</span> = <span class="i">new</span> <span class="i">Graph</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2837 2824     <span class="i">$AtomIDsGraph</span><span class="i">->AddEdges</span><span class="s">(</span><span class="i">@BondedAtomPairIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2838 2825 | 
|  | 2839 2826     <span class="s">(</span><span class="i">$StartTerminalAtomID</span><span class="cm">,</span> <span class="i">$EndTerminalAtomID</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="i">@</span>{<span class="i">$TerminalAtomIDs</span>[<span class="i">$Index</span>]}<span class="sc">;</span> | 
|  | 2840 2827     <span class="i">@Paths</span> = <span class="i">$AtomIDsGraph</span><span class="i">->GetPathsBetween</span><span class="s">(</span><span class="i">$StartTerminalAtomID</span><span class="cm">,</span> <span class="i">$EndTerminalAtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2841 2828 | 
|  | 2842 2829     <span class="k">if</span> <span class="s">(</span><span class="i">@Paths</span> != <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2843 2830       <span class="k">next</span> <span class="j">COMPONENT</span><span class="sc">;</span> | 
|  | 2844 2831     <span class="s">}</span> | 
|  | 2845 2832 | 
|  | 2846 2833     <span class="i">@PathAtomIDs</span> = <span class="i">$Paths</span>[<span class="n">0</span>]<span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2847 2834 | 
|  | 2848 2835     <span class="k">my</span><span class="s">(</span><span class="i">@PathAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2849 2836     <span class="i">@PathAtoms</span> = <span class="i">$This</span><span class="i">->_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@PathAtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2850 2837     <span class="k">push</span> <span class="i">@PathsAtoms</span><span class="cm">,</span> \<span class="i">@PathAtoms</span><span class="sc">;</span> | 
|  | 2851 2838 | 
|  | 2852 2839     <span class="k">my</span><span class="s">(</span><span class="i">@PathBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2853 2840     <span class="i">@PathBonds</span> = <span class="i">$This</span><span class="i">->_GetPathBonds</span><span class="s">(</span><span class="i">@PathAtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2854 2841     <span class="k">push</span> <span class="i">@PathsBonds</span><span class="cm">,</span> \<span class="i">@PathBonds</span><span class="sc">;</span> | 
|  | 2855 2842 | 
|  | 2856 2843   <span class="s">}</span> | 
|  | 2857 2844 | 
|  | 2858 2845   <span class="k">return</span> <span class="s">(</span>\<span class="i">@PathsAtoms</span><span class="cm">,</span> \<span class="i">@PathsBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2859 2846 <span class="s">}</span> | 
|  | 2860 2847 | 
|  | 2861 2848 <span class="c"># Setup initial processing status of atoms and bonds involved in connected paths</span> | 
|  | 2862 2849 <span class="c"># before starting kekulization...</span> | 
|  | 2863 2850 <span class="c">#</span> | 
|  | 2864 2851 <span class="c"># Possible atom processing status: DoubleBondPossible, DoubleBondAssigned, DoubleBondNotPossible</span> | 
|  | 2865 2852 <span class="c"># Initial status: DoubleBondPossible or DoubleBondNotPossible</span> | 
|  | 2866 2853 <span class="c">#</span> | 
|  | 2867 2854 <span class="c"># Possible bond processing status: DoubleBondAssigned, SingleBondAssigned, NotProcessed</span> | 
|  | 2868 2855 <span class="c">#</span> | 
|  | 2869 2856 <span class="c"># Possible paths processing status: Processed, NotProcessed</span> | 
|  | 2870 2857 <span class="c"># Initial status: NotProcessed</span> | 
|  | 2871 2858 <span class="c">#</span> | 
|  | 2872 <a name="_SetupConnectedPathSetsForKekulization-"></a>2859 <span class="k">sub </span><span class="m">_SetupConnectedPathSetsForKekulization</span> <span class="s">{</span> | 
|  | 2873 2860   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PathAtomsSetsRef</span><span class="cm">,</span> <span class="i">$PathBondsSetsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2874 2861   <span class="k">my</span><span class="s">(</span><span class="i">$PathIndex</span><span class="cm">,</span> <span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$BondID</span><span class="cm">,</span> <span class="i">%AtomProcessingStatusMap</span><span class="cm">,</span> <span class="i">%BondProcessingStatusMap</span><span class="cm">,</span> <span class="i">@PathsProcessingStatus</span><span class="cm">,</span> <span class="i">%InitialPathBondOrderMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2875 2862 | 
|  | 2876 2863   <span class="c"># Possible path set status values: Processed, NotProcessed</span> | 
|  | 2877 2864   <span class="c"># Initial value: NotProcessed</span> | 
|  | 2878 2865   <span class="c">#</span> | 
|  | 2879 2866   <span class="i">@PathsProcessingStatus</span> = <span class="s">(</span><span class="q">'NotProcessed'</span><span class="s">)</span> x <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$PathAtomsSetsRef</span>}<span class="sc">;</span> | 
|  | 2880 2867 | 
|  | 2881 2868   <span class="c"># Collect initial bond order of path bonds before setting bond orders to 1</span> | 
|  | 2882 2869   <span class="c"># and use it to set the bond order back to intial value after it has been processed for</span> | 
|  | 2883 2870   <span class="c"># availability of double bonds...</span> | 
|  | 2884 2871   <span class="c">#</span> | 
|  | 2885 2872   <span class="i">%InitialPathBondOrderMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2886 2873   <span class="k">for</span> <span class="i">$PathBondsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PathBondsSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2887 2874     <span class="j">BOND:</span> <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PathBondsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2888 2875       <span class="i">$BondID</span> = <span class="i">$Bond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2889 2876       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$InitialPathBondOrderMap</span>{<span class="i">$BondID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2890 2877         <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 2891 2878       <span class="s">}</span> | 
|  | 2892 2879       <span class="i">$InitialPathBondOrderMap</span>{<span class="i">$BondID</span>} = <span class="i">$Bond</span><span class="i">->GetBondOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2893 2880       <span class="i">$Bond</span><span class="i">->SetBondOrder</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2894 2881     <span class="s">}</span> | 
|  | 2895 2882   <span class="s">}</span> | 
|  | 2896 2883 | 
|  | 2897 2884   <span class="i">%AtomProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2898 2885   <span class="i">%BondProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2899 2886 | 
|  | 2900 2887   <span class="k">for</span> <span class="i">$PathIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PathAtomsSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2901 2888 | 
|  | 2902 2889     <span class="i">$PathAtomsRef</span> = <span class="i">$PathAtomsSetsRef</span>->[<span class="i">$PathIndex</span>]<span class="sc">;</span> | 
|  | 2903 2890     <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PathAtomsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2904 2891       <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2905 2892       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$AtomProcessingStatusMap</span>{<span class="i">$AtomID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2906 2893         <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span> | 
|  | 2907 2894       <span class="s">}</span> | 
|  | 2908 2895       <span class="i">$AtomProcessingStatusMap</span>{<span class="i">$AtomID</span>} = <span class="s">(</span><span class="i">$Atom</span><span class="i">->GetNumOfBondsAvailableForNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span> >= <span class="n">1</span><span class="s">)</span> ? <span class="q">'DoubleBondPossible'</span> <span class="co">:</span> <span class="q">'DoubleBondNotPossible'</span><span class="sc">;</span> | 
|  | 2909 2896     <span class="s">}</span> | 
|  | 2910 2897 | 
|  | 2911 2898     <span class="i">$PathBondsRef</span> = <span class="i">$PathBondsSetsRef</span>->[<span class="i">$PathIndex</span>]<span class="sc">;</span> | 
|  | 2912 2899     <span class="j">BOND:</span> <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PathBondsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2913 2900       <span class="i">$BondID</span> = <span class="i">$Bond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2914 2901       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$BondProcessingStatusMap</span>{<span class="i">$BondID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2915 2902         <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 2916 2903       <span class="s">}</span> | 
|  | 2917 2904       <span class="i">$BondProcessingStatusMap</span>{<span class="i">$BondID</span>} = <span class="q">'NotProcessed'</span><span class="sc">;</span> | 
|  | 2918 2905     <span class="s">}</span> | 
|  | 2919 2906   <span class="s">}</span> | 
|  | 2920 2907 | 
|  | 2921 2908   <span class="c"># Set bond orders back to initial bond orders...</span> | 
|  | 2922 2909   <span class="k">for</span> <span class="i">$PathIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PathAtomsSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2923 2910     <span class="i">$PathBondsRef</span> = <span class="i">$PathBondsSetsRef</span>->[<span class="i">$PathIndex</span>]<span class="sc">;</span> | 
|  | 2924 2911 | 
|  | 2925 2912     <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PathBondsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2926 2913       <span class="i">$BondID</span> = <span class="i">$Bond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2927 2914       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$InitialPathBondOrderMap</span>{<span class="i">$BondID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2928 2915         <span class="i">$Bond</span><span class="i">->SetBondOrder</span><span class="s">(</span><span class="i">$InitialPathBondOrderMap</span>{<span class="i">$BondID</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 2929 2916       <span class="s">}</span> | 
|  | 2930 2917     <span class="s">}</span> | 
|  | 2931 2918   <span class="s">}</span> | 
|  | 2932 2919 | 
|  | 2933 2920   <span class="k">return</span> <span class="s">(</span>\<span class="i">%AtomProcessingStatusMap</span><span class="cm">,</span> \<span class="i">%BondProcessingStatusMap</span><span class="cm">,</span> \<span class="i">@PathsProcessingStatus</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2934 2921 <span class="s">}</span> | 
|  | 2935 2922 | 
|  | 2936 2923 <span class="c"># Kekulize connected path sets corresponding to fused rings, individual rings, or any other</span> | 
|  | 2937 2924 <span class="c"># connected path...</span> | 
|  | 2938 2925 <span class="c">#</span> | 
|  | 2939 2926 <span class="c"># Note:</span> | 
|  | 2940 2927 <span class="c">#   . PathAtomsRef and PathBondsRef contain paths and bonds corresponding to path</span> | 
|  | 2941 2928 <span class="c">#     under consideration for kekulization</span> | 
|  | 2942 2929 <span class="c">#   . PathAtomsSetsRef and PathBondsSetsRef contain any other available paths fused</span> | 
|  | 2943 2930 <span class="c">#     to the path being kekulized</span> | 
|  | 2944 2931 <span class="c">#   . _KekulizeConnectedPathSets is invoked recursively to kekulize all available paths</span> | 
|  | 2945 2932 <span class="c">#</span> | 
|  | 2946 <a name="_KekulizeConnectedPathSets-"></a>2933 <span class="k">sub </span><span class="m">_KekulizeConnectedPathSets</span> <span class="s">{</span> | 
|  | 2947 2934   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$PathAtomsSetsRef</span><span class="cm">,</span> <span class="i">$PathBondsSetsRef</span><span class="cm">,</span> <span class="i">$PathsProcessingStatusRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2948 2935   <span class="k">my</span><span class="s">(</span><span class="i">$PathBond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2949 2936 | 
|  | 2950 2937   <span class="c"># Get next available path bond...</span> | 
|  | 2951 2938   <span class="i">$PathBond</span> = <span class="i">$This</span><span class="i">->_GetNextAvailablePathBondForKekulization</span><span class="s">(</span><span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2952 2939 | 
|  | 2953 2940   <span class="k">if</span> <span class="s">(</span><span class="i">$PathBond</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2954 2941     <span class="k">return</span> <span class="i">$This</span><span class="i">->_ProcessNextAvailablePathBondForKekulization</span><span class="s">(</span><span class="i">$PathBond</span><span class="cm">,</span> <span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$PathAtomsSetsRef</span><span class="cm">,</span> <span class="i">$PathBondsSetsRef</span><span class="cm">,</span> <span class="i">$PathsProcessingStatusRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2955 2942   <span class="s">}</span> | 
|  | 2956 2943 | 
|  | 2957 2944   <span class="c"># Did kekulization succeed for the current path bonds?</span> | 
|  | 2958 2945   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_DidKekulizationSucceedForPathBonds</span><span class="s">(</span><span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2959 2946     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2960 2947   <span class="s">}</span> | 
|  | 2961 2948 | 
|  | 2962 2949   <span class="c"># Is there any other path available for kekulization?</span> | 
|  | 2963 2950   <span class="s">(</span><span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->_GetNextAvailablePathForKekulization</span><span class="s">(</span><span class="i">$PathAtomsSetsRef</span><span class="cm">,</span> <span class="i">$PathBondsSetsRef</span><span class="cm">,</span> <span class="i">$PathsProcessingStatusRef</span><span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2964 2951 | 
|  | 2965 2952   <span class="k">if</span> <span class="s">(</span><span class="i">$PathAtomsRef</span> && <span class="i">$PathBondsRef</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2966 2953     <span class="c"># Recursively call itself to kekulize next path, which could either be a new path or part</span> | 
|  | 2967 2954     <span class="c"># of a fused paths corresponding to fused ring sets...</span> | 
|  | 2968 2955     <span class="c">#</span> | 
|  | 2969 2956     <span class="k">return</span> <span class="i">$This</span><span class="i">->_KekulizeConnectedPathSets</span><span class="s">(</span><span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$PathAtomsSetsRef</span><span class="cm">,</span> <span class="i">$PathBondsSetsRef</span><span class="cm">,</span> <span class="i">$PathsProcessingStatusRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2970 2957   <span class="s">}</span> | 
|  | 2971 2958 | 
|  | 2972 2959   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2973 2960 <span class="s">}</span> | 
|  | 2974 2961 | 
|  | 2975 2962 <span class="c"># Get next available path bond in a list of path bonds...</span> | 
|  | 2976 2963 <span class="c">#</span> | 
|  | 2977 <a name="_GetNextAvailablePathBondForKekulization-"></a>2964 <span class="k">sub </span><span class="m">_GetNextAvailablePathBondForKekulization</span> <span class="s">{</span> | 
|  | 2978 2965   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 2979 2966   <span class="k">my</span><span class="s">(</span><span class="i">$AvailablePathBond</span><span class="cm">,</span> <span class="i">$PathBond</span><span class="cm">,</span> <span class="i">$PathBondID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2980 2967 | 
|  | 2981 2968   <span class="i">$AvailablePathBond</span> = <span class="k">undef</span><span class="sc">;</span> | 
|  | 2982 2969 | 
|  | 2983 2970   <span class="j">BOND:</span> <span class="k">for</span> <span class="i">$PathBond</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PathBondsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2984 2971     <span class="i">$PathBondID</span> = <span class="i">$PathBond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2985 2972     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$BondProcessingStatusMapRef</span>->{<span class="i">$PathBondID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2986 2973       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 2987 2974     <span class="s">}</span> | 
|  | 2988 2975     <span class="k">if</span> <span class="s">(</span><span class="i">$BondProcessingStatusMapRef</span>->{<span class="i">$PathBondID</span>} =~ <span class="q">/^NotProcessed$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2989 2976       <span class="i">$AvailablePathBond</span> = <span class="i">$PathBond</span><span class="sc">;</span> | 
|  | 2990 2977       <span class="k">last</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 2991 2978     <span class="s">}</span> | 
|  | 2992 2979   <span class="s">}</span> | 
|  | 2993 2980 | 
|  | 2994 2981   <span class="k">return</span> <span class="s">(</span><span class="i">$AvailablePathBond</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2995 2982 <span class="s">}</span> | 
|  | 2996 2983 | 
|  | 2997 2984 <span class="c"># Process next available path bond for kekulizaiton...</span> | 
|  | 2998 2985 <span class="c">#</span> | 
|  | 2999 <a name="_ProcessNextAvailablePathBondForKekulization-"></a>2986 <span class="k">sub </span><span class="m">_ProcessNextAvailablePathBondForKekulization</span> <span class="s">{</span> | 
|  | 3000 2987   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PathBond</span><span class="cm">,</span> <span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$PathAtomsSetsRef</span><span class="cm">,</span> <span class="i">$PathBondsSetsRef</span><span class="cm">,</span> <span class="i">$PathsProcessingStatusRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3001 2988   <span class="k">my</span><span class="s">(</span><span class="i">$PathBondID</span><span class="cm">,</span> <span class="i">$PathAtom1</span><span class="cm">,</span> <span class="i">$PathAtom2</span><span class="cm">,</span> <span class="i">$PathAtomID1</span><span class="cm">,</span> <span class="i">$PathAtomID2</span><span class="cm">,</span> <span class="i">%CurrentAtomProcessingStatusMap</span><span class="cm">,</span> <span class="i">%CurrentBondProcessingStatusMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3002 2989 | 
|  | 3003 2990   <span class="i">$PathBondID</span> = <span class="i">$PathBond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3004 2991 | 
|  | 3005 2992   <span class="s">(</span><span class="i">$PathAtom1</span><span class="cm">,</span> <span class="i">$PathAtom2</span><span class="s">)</span> = <span class="i">$PathBond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3006 2993   <span class="s">(</span><span class="i">$PathAtomID1</span><span class="cm">,</span> <span class="i">$PathAtomID2</span><span class="s">)</span> = <span class="s">(</span><span class="i">$PathAtom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$PathAtom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3007 2994 | 
|  | 3008 2995   <span class="i">%CurrentAtomProcessingStatusMap</span> = <span class="i">%</span>{<span class="i">$AtomProcessingStatusMapRef</span>}<span class="sc">;</span> | 
|  | 3009 2996   <span class="i">%CurrentBondProcessingStatusMap</span> = <span class="i">%</span>{<span class="i">$BondProcessingStatusMapRef</span>}<span class="sc">;</span> | 
|  | 3010 2997 | 
|  | 3011 2998   <span class="c"># Is it possible to assign a double bond to the current path bond?</span> | 
|  | 3012 2999   <span class="k">if</span> <span class="s">(</span><span class="i">$AtomProcessingStatusMapRef</span>->{<span class="i">$PathAtomID1</span>} =~ <span class="q">/^DoubleBondPossible$/i</span> && <span class="i">$AtomProcessingStatusMapRef</span>->{<span class="i">$PathAtomID2</span>} =~ <span class="q">/^DoubleBondPossible$/i</span> <span class="s">)</span> <span class="s">{</span> | 
|  | 3013 3000     <span class="c"># Set current bond to double bond by appropriately marking atom and bond process status...</span> | 
|  | 3014 3001     <span class="i">$AtomProcessingStatusMapRef</span>->{<span class="i">$PathAtomID1</span>} = <span class="q">'DoubleBondAssigned'</span><span class="sc">;</span> | 
|  | 3015 3002     <span class="i">$AtomProcessingStatusMapRef</span>->{<span class="i">$PathAtomID2</span>} = <span class="q">'DoubleBondAssigned'</span><span class="sc">;</span> | 
|  | 3016 3003 | 
|  | 3017 3004     <span class="i">$BondProcessingStatusMapRef</span>->{<span class="i">$PathBondID</span>} = <span class="q">'DoubleBondAssigned'</span><span class="sc">;</span> | 
|  | 3018 3005 | 
|  | 3019 3006     <span class="c"># Recursively call  _KekulizeConnectedPathSets to kekulize next available bond...</span> | 
|  | 3020 3007     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->_KekulizeConnectedPathSets</span><span class="s">(</span><span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$PathAtomsSetsRef</span><span class="cm">,</span> <span class="i">$PathBondsSetsRef</span><span class="cm">,</span> <span class="i">$PathsProcessingStatusRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3021 3008       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3022 3009     <span class="s">}</span> | 
|  | 3023 3010 | 
|  | 3024 3011     <span class="c"># Double bond at the current ring bond position didn't lead to successful kekulization...</span> | 
|  | 3025 3012     <span class="i">%</span>{<span class="i">$AtomProcessingStatusMapRef</span>} = <span class="i">%CurrentAtomProcessingStatusMap</span><span class="sc">;</span> | 
|  | 3026 3013     <span class="i">%</span>{<span class="i">$BondProcessingStatusMapRef</span>} = <span class="i">%CurrentBondProcessingStatusMap</span><span class="sc">;</span> | 
|  | 3027 3014   <span class="s">}</span> | 
|  | 3028 3015 | 
|  | 3029 3016   <span class="c"># Try single bond at the current ring bond position and recursively call _KekulizeConnectedPathSets to kekulize</span> | 
|  | 3030 3017   <span class="c"># rest of the ring bonds...</span> | 
|  | 3031 3018   <span class="c">#</span> | 
|  | 3032 3019   <span class="i">$BondProcessingStatusMapRef</span>->{<span class="i">$PathBondID</span>} = <span class="q">'SingleBondAssigned'</span><span class="sc">;</span> | 
|  | 3033 3020 | 
|  | 3034 3021   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->_KekulizeConnectedPathSets</span><span class="s">(</span><span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$PathAtomsSetsRef</span><span class="cm">,</span> <span class="i">$PathBondsSetsRef</span><span class="cm">,</span> <span class="i">$PathsProcessingStatusRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3035 3022     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3036 3023   <span class="s">}</span> | 
|  | 3037 3024 | 
|  | 3038 3025   <span class="i">%</span>{<span class="i">$AtomProcessingStatusMapRef</span>} = <span class="i">%CurrentAtomProcessingStatusMap</span><span class="sc">;</span> | 
|  | 3039 3026   <span class="i">%</span>{<span class="i">$BondProcessingStatusMapRef</span>} = <span class="i">%CurrentBondProcessingStatusMap</span><span class="sc">;</span> | 
|  | 3040 3027 | 
|  | 3041 3028   <span class="c"># Kekulization didn't work out for path bonds...</span> | 
|  | 3042 3029 | 
|  | 3043 3030   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3044 3031 | 
|  | 3045 3032 <span class="s">}</span> | 
|  | 3046 3033 | 
|  | 3047 3034 <span class="c"># Get next available path for kekulization from a set of fused ring paths...</span> | 
|  | 3048 3035 <span class="c">#</span> | 
|  | 3049 <a name="_GetNextAvailablePathForKekulization-"></a>3036 <span class="k">sub </span><span class="m">_GetNextAvailablePathForKekulization</span> <span class="s">{</span> | 
|  | 3050 3037   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PathAtomsSetsRef</span><span class="cm">,</span> <span class="i">$PathBondsSetsRef</span><span class="cm">,</span> <span class="i">$PathsProcessingStatusRef</span><span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3051 3038   <span class="k">my</span><span class="s">(</span><span class="i">$PathIndex</span><span class="cm">,</span> <span class="i">$AvailablePathIndex</span><span class="cm">,</span> <span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$PathBond</span><span class="cm">,</span> <span class="i">$PathBondID</span><span class="cm">,</span> <span class="i">$MaxNumOfPathBondsProcessed</span><span class="cm">,</span> <span class="i">$NumOfPathBondsProcessed</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3052 3039 | 
|  | 3053 3040   <span class="s">(</span><span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$AvailablePathIndex</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="s">)</span> x <span class="n">3</span><span class="sc">;</span> | 
|  | 3054 3041 | 
|  | 3055 3042   <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">$PathAtomsSetsRef</span><span class="s">)</span>  && <span class="k">defined</span><span class="s">(</span><span class="i">$PathBondsSetsRef</span><span class="s">)</span> && <span class="k">defined</span><span class="s">(</span><span class="i">$PathsProcessingStatusRef</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3056 3043     <span class="k">return</span> <span class="s">(</span><span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3057 3044   <span class="s">}</span> | 
|  | 3058 3045 | 
|  | 3059 3046   <span class="i">$MaxNumOfPathBondsProcessed</span> = <span class="n">-999</span><span class="sc">;</span> | 
|  | 3060 3047   <span class="i">$AvailablePathIndex</span> = <span class="k">undef</span><span class="sc">;</span> | 
|  | 3061 3048 | 
|  | 3062 3049   <span class="j">PATHINDEX:</span> <span class="k">for</span> <span class="i">$PathIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PathsProcessingStatusRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 3063 3050     <span class="k">if</span> <span class="s">(</span><span class="i">$PathsProcessingStatusRef</span>->[<span class="i">$PathIndex</span>] =~ <span class="q">/^Processed$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3064 3051       <span class="k">next</span> <span class="j">PATHINDEX</span><span class="sc">;</span> | 
|  | 3065 3052     <span class="s">}</span> | 
|  | 3066 3053 | 
|  | 3067 3054     <span class="c"># Count of already processed bonds in an unprocessed path bonds through</span> | 
|  | 3068 3055     <span class="c"># their participation in any fused bonds sets...</span> | 
|  | 3069 3056     <span class="c">#</span> | 
|  | 3070 3057     <span class="i">$NumOfPathBondsProcessed</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 3071 3058     <span class="j">PATHBOND:</span> <span class="k">for</span> <span class="i">$PathBond</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PathBondsSetsRef</span>->[<span class="i">$PathIndex</span>]}<span class="s">)</span> <span class="s">{</span> | 
|  | 3072 3059       <span class="i">$PathBondID</span> = <span class="i">$PathBond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3073 3060       <span class="k">if</span> <span class="s">(</span><span class="i">$BondProcessingStatusMapRef</span>->{<span class="i">$PathBondID</span>} =~ <span class="q">/^NotProcessed$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3074 3061         <span class="k">next</span> <span class="j">PATHBOND</span><span class="sc">;</span> | 
|  | 3075 3062       <span class="s">}</span> | 
|  | 3076 3063       <span class="i">$NumOfPathBondsProcessed</span>++<span class="sc">;</span> | 
|  | 3077 3064     <span class="s">}</span> | 
|  | 3078 3065 | 
|  | 3079 3066     <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfPathBondsProcessed</span> > <span class="i">$MaxNumOfPathBondsProcessed</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3080 3067       <span class="i">$AvailablePathIndex</span> = <span class="i">$PathIndex</span><span class="sc">;</span> | 
|  | 3081 3068       <span class="i">$MaxNumOfPathBondsProcessed</span> = <span class="i">$NumOfPathBondsProcessed</span><span class="sc">;</span> | 
|  | 3082 3069     <span class="s">}</span> | 
|  | 3083 3070 | 
|  | 3084 3071   <span class="s">}</span> | 
|  | 3085 3072 | 
|  | 3086 3073   <span class="c"># Is any path available?</span> | 
|  | 3087 3074   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AvailablePathIndex</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3088 3075     <span class="k">return</span> <span class="s">(</span><span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3089 3076   <span class="s">}</span> | 
|  | 3090 3077 | 
|  | 3091 3078   <span class="i">$PathsProcessingStatusRef</span>->[<span class="i">$AvailablePathIndex</span>] = <span class="q">'Processed'</span><span class="sc">;</span> | 
|  | 3092 3079 | 
|  | 3093 3080   <span class="i">$PathAtomsRef</span> = <span class="i">$PathAtomsSetsRef</span>->[<span class="i">$AvailablePathIndex</span>]<span class="sc">;</span> | 
|  | 3094 3081   <span class="i">$PathBondsRef</span> = <span class="i">$PathBondsSetsRef</span>->[<span class="i">$AvailablePathIndex</span>]<span class="sc">;</span> | 
|  | 3095 3082 | 
|  | 3096 3083   <span class="k">return</span> <span class="s">(</span><span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3097 3084 <span class="s">}</span> | 
|  | 3098 3085 | 
|  | 3099 3086 <span class="c"># Check for kekulization in a specific set of path bonds. For successful kekulization, all</span> | 
|  | 3100 3087 <span class="c"># all path atoms marked with DoubleBondPossible must be involved in a path double bond...</span> | 
|  | 3101 3088 <span class="c">#</span> | 
|  | 3102 <a name="_DidKekulizationSucceedForPathBonds-"></a>3089 <span class="k">sub </span><span class="m">_DidKekulizationSucceedForPathBonds</span> <span class="s">{</span> | 
|  | 3103 3090   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PathAtomsRef</span><span class="cm">,</span> <span class="i">$PathBondsRef</span><span class="cm">,</span> <span class="i">$AtomProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$BondProcessingStatusMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3104 3091   <span class="k">my</span><span class="s">(</span><span class="i">$PathAtom</span><span class="cm">,</span> <span class="i">$PathAtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3105 3092 | 
|  | 3106 3093   <span class="k">for</span> <span class="i">$PathAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PathAtomsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 3107 3094     <span class="i">$PathAtomID</span> = <span class="i">$PathAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3108 3095     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$AtomProcessingStatusMapRef</span>->{<span class="i">$PathAtomID</span>} && <span class="i">$AtomProcessingStatusMapRef</span>->{<span class="i">$PathAtomID</span>} =~ <span class="q">/^DoubleBondPossible$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3109 3096       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3110 3097     <span class="s">}</span> | 
|  | 3111 3098   <span class="s">}</span> | 
|  | 3112 3099   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3113 3100 <span class="s">}</span> | 
|  | 3114 3101 | 
|  | 3115 3102 <span class="c"># Assign bond orders to the bonds in a molecule which have been successfully</span> | 
|  | 3116 3103 <span class="c"># kekulized along with optional clearing of aromaticty property...</span> | 
|  | 3117 3104 <span class="c">#</span> | 
|  | 3118 <a name="_ProcessBondOrdersAssignedDuringSuccessfulKekulization-"></a>3105 <span class="k">sub </span><span class="m">_ProcessBondOrdersAssignedDuringSuccessfulKekulization</span> <span class="s">{</span> | 
|  | 3119 3106   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$BondsRef</span><span class="cm">,</span> <span class="i">$BondsProcessingStatusMapRef</span><span class="cm">,</span> <span class="i">$DeleteBondsAromaticity</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3120 3107   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="cm">,</span> <span class="i">$BondID</span><span class="cm">,</span> <span class="i">$BondOrder</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3121 3108 | 
|  | 3122 3109   <span class="i">$DeleteBondsAromaticity</span> = <span class="k">defined</span> <span class="i">$DeleteBondsAromaticity</span> ? <span class="i">$DeleteBondsAromaticity</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3123 3110 | 
|  | 3124 3111   <span class="j">BOND:</span> <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$BondsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 3125 3112     <span class="i">$BondID</span> = <span class="i">$Bond</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3126 3113 | 
|  | 3127 3114     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$BondsProcessingStatusMapRef</span>->{<span class="i">$BondID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 3128 3115       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_ProcessBondOrdersAssignedDuringSuccessfulKekulization: Couldn't process bond with bond ID, $BondID: It's not available in the list of bonds processed for kekulization..."</span><span class="sc">;</span> | 
|  | 3129 3116       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span> | 
|  | 3130 3117     <span class="s">}</span> | 
|  | 3131 3118 | 
|  | 3132 3119     <span class="i">$BondOrder</span> = <span class="s">(</span><span class="i">$BondsProcessingStatusMapRef</span>->{<span class="i">$BondID</span>} =~ <span class="q">/^DoubleBondAssigned$/i</span><span class="s">)</span> ? <span class="n">2</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3133 3120     <span class="i">$Bond</span><span class="i">->SetBondOrder</span><span class="s">(</span><span class="i">$BondOrder</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3134 3121 | 
|  | 3135 3122     <span class="k">if</span> <span class="s">(</span><span class="i">$DeleteBondsAromaticity</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3136 3123       <span class="i">$Bond</span><span class="i">->DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3137 3124     <span class="s">}</span> | 
|  | 3138 3125   <span class="s">}</span> | 
|  | 3139 3126   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 3140 3127 <span class="s">}</span> | 
|  | 3141 3128 | 
|  | 3142 3129 <span class="c"># Does molecule contains aromatic rings?</span> | 
|  | 3143 3130 <span class="c">#</span> | 
|  | 3144 <a name="HasAromaticRings-"></a>3131 <span class="k">sub </span><span class="m">HasAromaticRings</span> <span class="s">{</span> | 
|  | 3145 3132   <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> | 
|  | 3146 3133 | 
|  | 3147 3134   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfAromaticRings</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> | 
|  | 3148 3135 <span class="s">}</span> | 
|  | 3149 3136 | 
|  | 3150 3137 <span class="c"># Does molecule contains any aromatic atom in a ring?</span> | 
|  | 3151 3138 <span class="c">#</span> | 
|  | 3152 <a name="HasAromaticAtomsInRings-"></a>3139 <span class="k">sub </span><span class="m">HasAromaticAtomsInRings</span> <span class="s">{</span> | 
|  | 3153 3140   <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> | 
|  | 3154 3141   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3155 3142 | 
|  | 3156 3143   <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3157 3144     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3158 3145       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span> | 
|  | 3159 3146     <span class="s">}</span> | 
|  | 3160 3147     <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">->IsInRing</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3161 3148       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3162 3149     <span class="s">}</span> | 
|  | 3163 3150   <span class="s">}</span> | 
|  | 3164 3151   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3165 3152 <span class="s">}</span> | 
|  | 3166 3153 | 
|  | 3167 3154 <span class="c"># Does molecule contains any aromatic atom not in a ring?</span> | 
|  | 3168 3155 <span class="c">#</span> | 
|  | 3169 <a name="HasAromaticAtomsNotInRings-"></a>3156 <span class="k">sub </span><span class="m">HasAromaticAtomsNotInRings</span> <span class="s">{</span> | 
|  | 3170 3157   <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> | 
|  | 3171 3158   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3172 3159 | 
|  | 3173 3160   <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3174 3161     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">->IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3175 3162       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span> | 
|  | 3176 3163     <span class="s">}</span> | 
|  | 3177 3164     <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">->IsNotInRing</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3178 3165       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 3179 3166     <span class="s">}</span> | 
|  | 3180 3167   <span class="s">}</span> | 
|  | 3181 3168   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3182 3169 <span class="s">}</span> | 
|  | 3183 3170 | 
|  | 3184 3171 <span class="c"># Does molecule contains rings?</span> | 
|  | 3185 3172 <span class="c">#</span> | 
|  | 3186 <a name="HasRings-"></a>3173 <span class="k">sub </span><span class="m">HasRings</span> <span class="s">{</span> | 
|  | 3187 3174   <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> | 
|  | 3188 3175 | 
|  | 3189 3176   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsCyclic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3190 3177 <span class="s">}</span> | 
|  | 3191 3178 | 
|  | 3192 3179 <span class="c"># Does molecule contains only one ring?</span> | 
|  | 3193 3180 <span class="c">#</span> | 
|  | 3194 <a name="HasOnlyOneRing-"></a>3181 <span class="k">sub </span><span class="m">HasOnlyOneRing</span> <span class="s">{</span> | 
|  | 3195 3182   <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> | 
|  | 3196 3183 | 
|  | 3197 3184   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsUnicyclic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3198 3185 <span class="s">}</span> | 
|  | 3199 3186 | 
|  | 3200 3187 <span class="c"># Does molecule contains any rings?</span> | 
|  | 3201 3188 <span class="c">#</span> | 
|  | 3202 <a name="HasNoRings-"></a>3189 <span class="k">sub </span><span class="m">HasNoRings</span> <span class="s">{</span> | 
|  | 3203 3190   <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> | 
|  | 3204 3191 | 
|  | 3205 3192   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsAcyclic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3206 3193 <span class="s">}</span> | 
|  | 3207 3194 | 
|  | 3208 3195 <span class="c"># Get size of smallest ring...</span> | 
|  | 3209 3196 <span class="c">#</span> | 
|  | 3210 <a name="GetSizeOfSmallestRing-"></a>3197 <span class="k">sub </span><span class="m">GetSizeOfSmallestRing</span> <span class="s">{</span> | 
|  | 3211 3198   <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> | 
|  | 3212 3199 | 
|  | 3213 3200   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSizeOfSmallestCycle</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3214 3201 <span class="s">}</span> | 
|  | 3215 3202 | 
|  | 3216 3203 <span class="c"># Get size of largest ring...</span> | 
|  | 3217 3204 <span class="c">#</span> | 
|  | 3218 <a name="GetSizeOfLargestRing-"></a>3205 <span class="k">sub </span><span class="m">GetSizeOfLargestRing</span> <span class="s">{</span> | 
|  | 3219 3206   <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> | 
|  | 3220 3207 | 
|  | 3221 3208   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSizeOfLargestCycle</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3222 3209 <span class="s">}</span> | 
|  | 3223 3210 | 
|  | 3224 3211 <span class="c"># Get number of rings...</span> | 
|  | 3225 3212 <span class="c">#</span> | 
|  | 3226 <a name="GetNumOfRings-"></a>3213 <span class="k">sub </span><span class="m">GetNumOfRings</span> <span class="s">{</span> | 
|  | 3227 3214   <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> | 
|  | 3228 3215 | 
|  | 3229 3216   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3230 3217 <span class="s">}</span> | 
|  | 3231 3218 | 
|  | 3232 3219 <span class="c"># Get number of aromatic rings...</span> | 
|  | 3233 3220 <span class="c">#</span> | 
|  | 3234 <a name="GetNumOfAromaticRings-"></a>3221 <span class="k">sub </span><span class="m">GetNumOfAromaticRings</span> <span class="s">{</span> | 
|  | 3235 3222   <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> | 
|  | 3236 3223   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3237 3224 | 
|  | 3238 3225   <span class="i">$NumOfRings</span> = <span class="k">scalar</span> <span class="i">$This</span><span class="i">->GetAromaticRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3239 3226 | 
|  | 3240 3227   <span class="k">return</span> <span class="i">$NumOfRings</span><span class="sc">;</span> | 
|  | 3241 3228 <span class="s">}</span> | 
|  | 3242 3229 | 
|  | 3243 3230 <span class="c"># Get num of rings with odd size...</span> | 
|  | 3244 3231 <span class="c">#</span> | 
|  | 3245 <a name="GetNumOfRingsWithOddSize-"></a>3232 <span class="k">sub </span><span class="m">GetNumOfRingsWithOddSize</span> <span class="s">{</span> | 
|  | 3246 3233   <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> | 
|  | 3247 3234 | 
|  | 3248 3235   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfCyclesWithOddSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3249 3236 <span class="s">}</span> | 
|  | 3250 3237 | 
|  | 3251 3238 <span class="c"># Get num of rings with even size...</span> | 
|  | 3252 3239 <span class="c">#</span> | 
|  | 3253 <a name="GetNumOfRingsWithEvenSize-"></a>3240 <span class="k">sub </span><span class="m">GetNumOfRingsWithEvenSize</span> <span class="s">{</span> | 
|  | 3254 3241   <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> | 
|  | 3255 3242 | 
|  | 3256 3243   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfCyclesWithEvenSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3257 3244 <span class="s">}</span> | 
|  | 3258 3245 | 
|  | 3259 3246 <span class="c"># Get num of rings with specified size...</span> | 
|  | 3260 3247 <span class="c">#</span> | 
|  | 3261 <a name="GetNumOfRingsWithSize-"></a>3248 <span class="k">sub </span><span class="m">GetNumOfRingsWithSize</span> <span class="s">{</span> | 
|  | 3262 3249   <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> | 
|  | 3263 3250 | 
|  | 3264 3251   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfCyclesWithSize</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3265 3252 <span class="s">}</span> | 
|  | 3266 3253 | 
|  | 3267 3254 <span class="c"># Get num of rings with size less than a specified size...</span> | 
|  | 3268 3255 <span class="c">#</span> | 
|  | 3269 <a name="GetNumOfRingsWithSizeLessThan-"></a>3256 <span class="k">sub </span><span class="m">GetNumOfRingsWithSizeLessThan</span> <span class="s">{</span> | 
|  | 3270 3257   <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> | 
|  | 3271 3258 | 
|  | 3272 3259   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3273 3260 <span class="s">}</span> | 
|  | 3274 3261 | 
|  | 3275 3262 <span class="c"># Get num of rings with size greater than a specified size...</span> | 
|  | 3276 3263 <span class="c">#</span> | 
|  | 3277 <a name="GetNumOfRingsWithSizeGreaterThan-"></a>3264 <span class="k">sub </span><span class="m">GetNumOfRingsWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 3278 3265   <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> | 
|  | 3279 3266 | 
|  | 3280 3267   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3281 3268 <span class="s">}</span> | 
|  | 3282 3269 | 
|  | 3283 3270 <span class="c"># Get largest ring as an array containing ring atoms...</span> | 
|  | 3284 3271 <span class="c">#</span> | 
|  | 3285 <a name="GetLargestRing-"></a>3272 <span class="k">sub </span><span class="m">GetLargestRing</span> <span class="s">{</span> | 
|  | 3286 3273   <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> | 
|  | 3287 3274 | 
|  | 3288 3275   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetLargestCycle</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3289 3276 <span class="s">}</span> | 
|  | 3290 3277 | 
|  | 3291 3278 <span class="c"># Get smallest ring as an array containing ring atoms...</span> | 
|  | 3292 3279 <span class="c">#</span> | 
|  | 3293 <a name="GetSmallestRing-"></a>3280 <span class="k">sub </span><span class="m">GetSmallestRing</span> <span class="s">{</span> | 
|  | 3294 3281   <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> | 
|  | 3295 3282 | 
|  | 3296 3283   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetSmallestCycle</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3297 3284 <span class="s">}</span> | 
|  | 3298 3285 | 
|  | 3299 3286 <span class="c"># Get rings as an array containing references to arrays with ring atoms...</span> | 
|  | 3300 3287 <span class="c">#</span> | 
|  | 3301 <a name="GetRings-"></a>3288 <span class="k">sub </span><span class="m">GetRings</span> <span class="s">{</span> | 
|  | 3302 3289   <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> | 
|  | 3303 3290 | 
|  | 3304 3291   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetCycles</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3305 3292 <span class="s">}</span> | 
|  | 3306 3293 | 
|  | 3307 3294 <span class="c"># Get aromatic rings as an array containing references to arrays with ring atoms...</span> | 
|  | 3308 3295 <span class="c">#</span> | 
|  | 3309 <a name="GetAromaticRings-"></a>3296 <span class="k">sub </span><span class="m">GetAromaticRings</span> <span class="s">{</span> | 
|  | 3310 3297   <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> | 
|  | 3311 3298 | 
|  | 3312 3299   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAromaticRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetCycles</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3313 3300 <span class="s">}</span> | 
|  | 3314 3301 | 
|  | 3315 3302 <span class="c"># Get odd size rings as an array containing references to arrays with ring atoms...</span> | 
|  | 3316 3303 <span class="c">#</span> | 
|  | 3317 <a name="GetRingsWithOddSize-"></a>3304 <span class="k">sub </span><span class="m">GetRingsWithOddSize</span> <span class="s">{</span> | 
|  | 3318 3305   <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> | 
|  | 3319 3306 | 
|  | 3320 3307   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetCyclesWithOddSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3321 3308 <span class="s">}</span> | 
|  | 3322 3309 | 
|  | 3323 3310 <span class="c"># Get even size rings as an array containing references to arrays with ring atoms...</span> | 
|  | 3324 3311 <span class="c">#</span> | 
|  | 3325 <a name="GetRingsWithEvenSize-"></a>3312 <span class="k">sub </span><span class="m">GetRingsWithEvenSize</span> <span class="s">{</span> | 
|  | 3326 3313   <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> | 
|  | 3327 3314 | 
|  | 3328 3315   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetCyclesWithEvenSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3329 3316 <span class="s">}</span> | 
|  | 3330 3317 | 
|  | 3331 3318 <span class="c"># Get rings with a specific size as an array containing references to arrays with ring atoms...</span> | 
|  | 3332 3319 <span class="c">#</span> | 
|  | 3333 <a name="GetRingsWithSize-"></a>3320 <span class="k">sub </span><span class="m">GetRingsWithSize</span> <span class="s">{</span> | 
|  | 3334 3321   <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> | 
|  | 3335 3322 | 
|  | 3336 3323   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetCyclesWithSize</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3337 3324 <span class="s">}</span> | 
|  | 3338 3325 | 
|  | 3339 3326 <span class="c"># Get rings with size less than a specific size as an array containing references to arrays with ring atoms...</span> | 
|  | 3340 3327 <span class="c">#</span> | 
|  | 3341 <a name="GetRingsWithSizeLessThan-"></a>3328 <span class="k">sub </span><span class="m">GetRingsWithSizeLessThan</span> <span class="s">{</span> | 
|  | 3342 3329   <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> | 
|  | 3343 3330 | 
|  | 3344 3331   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3345 3332 <span class="s">}</span> | 
|  | 3346 3333 | 
|  | 3347 3334 <span class="c"># Get rings with size greater than a specific size as an array containing references to arrays with ring atoms...</span> | 
|  | 3348 3335 <span class="c">#</span> | 
|  | 3349 <a name="GetRingsWithSizeGreaterThan-"></a>3336 <span class="k">sub </span><span class="m">GetRingsWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 3350 3337   <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> | 
|  | 3351 3338 | 
|  | 3352 3339   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3353 3340 <span class="s">}</span> | 
|  | 3354 3341 | 
|  | 3355 3342 <span class="c"># Generate an array of bond objects for an array of ring atoms and return an array</span> | 
|  | 3356 3343 <span class="c"># of bond objects...</span> | 
|  | 3357 3344 <span class="c">#</span> | 
|  | 3358 <a name="GetRingBonds-"></a>3345 <span class="k">sub </span><span class="m">GetRingBonds</span> <span class="s">{</span> | 
|  | 3359 3346   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@RingAtoms</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3360 3347   <span class="k">my</span><span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3361 3348 | 
|  | 3362 3349   <span class="i">@Bonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3363 3350   <span class="k">if</span> <span class="s">(</span>!<span class="i">@RingAtoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3364 3351     <span class="c"># Return an empty ring bonds list...</span> | 
|  | 3365 3352     <span class="k">return</span> <span class="i">@Bonds</span><span class="sc">;</span> | 
|  | 3366 3353   <span class="s">}</span> | 
|  | 3367 3354 | 
|  | 3368 3355   <span class="k">my</span><span class="s">(</span><span class="i">@RingAtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3369 3356 | 
|  | 3370 3357   <span class="i">@RingAtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3371 3358   <span class="i">@RingAtomIDs</span> = <span class="i">$This</span><span class="i">->_GetAtomsIDsFromAtoms</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3372 3359   <span class="k">if</span> <span class="s">(</span>!<span class="i">@RingAtomIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3373 3360     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->GetRingBonds: No ring bonds retrieved: Atom IDs couldn't be retrieved for specified atoms..."</span><span class="sc">;</span> | 
|  | 3374 3361     <span class="k">return</span> <span class="i">@Bonds</span><span class="sc">;</span> | 
|  | 3375 3362   <span class="s">}</span> | 
|  | 3376 3363 | 
|  | 3377 3364   <span class="c"># Add start atom to the end to make it a cyclic path for ring: It's taken out during conversion</span> | 
|  | 3378 3365   <span class="c"># of cyclic path to a ring...</span> | 
|  | 3379 3366   <span class="k">push</span> <span class="i">@RingAtomIDs</span><span class="cm">,</span> <span class="i">$RingAtomIDs</span>[<span class="n">0</span>]<span class="sc">;</span> | 
|  | 3380 3367 | 
|  | 3381 3368   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPathBonds</span><span class="s">(</span><span class="i">@RingAtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3382 3369 <span class="s">}</span> | 
|  | 3383 3370 | 
|  | 3384 3371 <span class="c"># Generate an array containing references to arrays of ring bond objects for rings specified</span> | 
|  | 3385 3372 <span class="c"># in an array of references to ring atoms...</span> | 
|  | 3386 3373 <span class="c">#</span> | 
|  | 3387 <a name="GetRingBondsFromRings-"></a>3374 <span class="k">sub </span><span class="m">GetRingBondsFromRings</span> <span class="s">{</span> | 
|  | 3388 3375   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@RingAtomsSets</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3389 3376   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">@RingBondsSets</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3390 3377 | 
|  | 3391 3378   <span class="i">@RingBondsSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3392 3379   <span class="k">for</span> <span class="i">$RingAtomsRef</span>  <span class="s">(</span><span class="i">@RingAtomsSets</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3393 3380     <span class="k">my</span><span class="s">(</span><span class="i">@RingBonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3394 3381     <span class="i">@RingBonds</span> = <span class="i">$This</span><span class="i">->GetRingBonds</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 3395 3382 | 
|  | 3396 3383     <span class="k">push</span> <span class="i">@RingBondsSets</span><span class="cm">,</span> \<span class="i">@RingBonds</span><span class="sc">;</span> | 
|  | 3397 3384   <span class="s">}</span> | 
|  | 3398 3385 | 
|  | 3399 3386   <span class="k">return</span> <span class="i">@RingBondsSets</span><span class="sc">;</span> | 
|  | 3400 3387 <span class="s">}</span> | 
|  | 3401 3388 | 
|  | 3402 3389 <span class="c"># Does molecule has any fused rings?</span> | 
|  | 3403 3390 <span class="c">#</span> | 
|  | 3404 <a name="HasFusedRings-"></a>3391 <span class="k">sub </span><span class="m">HasFusedRings</span> <span class="s">{</span> | 
|  | 3405 3392   <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> | 
|  | 3406 3393 | 
|  | 3407 3394   <span class="k">return</span> <span class="i">$This</span><span class="i">->HasFusedCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3408 3395 <span class="s">}</span> | 
|  | 3409 3396 | 
|  | 3410 3397 <span class="c"># Get references to array of fused ring sets and non-fused rings. Fused ring sets array reference</span> | 
|  | 3411 3398 <span class="c"># contains refernces to arrays of rings; Non-fused rings array reference contains references to</span> | 
|  | 3412 3399 <span class="c"># arrays of ring atoms...</span> | 
|  | 3413 3400 <span class="c"># rings.</span> | 
|  | 3414 3401 <span class="c">#</span> | 
|  | 3415 <a name="GetFusedAndNonFusedRings-"></a>3402 <span class="k">sub </span><span class="m">GetFusedAndNonFusedRings</span> <span class="s">{</span> | 
|  | 3416 3403   <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> | 
|  | 3417 3404   <span class="k">my</span><span class="s">(</span><span class="i">$FusedCyclesSetsRef</span><span class="cm">,</span> <span class="i">$NonFusedCyclesRef</span><span class="cm">,</span> <span class="i">@FusedRingSets</span><span class="cm">,</span> <span class="i">@NonFusedRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3418 3405 | 
|  | 3419 3406   <span class="i">@FusedRingSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@NonFusedRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3420 3407   <span class="s">(</span><span class="i">$FusedCyclesSetsRef</span><span class="cm">,</span> <span class="i">$NonFusedCyclesRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetFusedAndNonFusedCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3421 3408   <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">$FusedCyclesSetsRef</span><span class="s">)</span> && <span class="k">defined</span><span class="s">(</span><span class="i">$NonFusedCyclesRef</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3422 3409     <span class="k">return</span> <span class="s">(</span>\<span class="i">@FusedRingSets</span><span class="cm">,</span> \<span class="i">@NonFusedRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3423 3410   <span class="s">}</span> | 
|  | 3424 3411   <span class="k">my</span><span class="s">(</span><span class="i">$FusedCyclesSetRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3425 3412 | 
|  | 3426 3413   <span class="k">for</span> <span class="i">$FusedCyclesSetRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FusedCyclesSetsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 3427 3414     <span class="k">my</span><span class="s">(</span><span class="i">@FusedRingSet</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3428 3415     <span class="i">@FusedRingSet</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3429 3416     <span class="i">@FusedRingSet</span> = <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">@</span>{<span class="i">$FusedCyclesSetRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 3430 3417     <span class="k">push</span> <span class="i">@FusedRingSets</span><span class="cm">,</span> \<span class="i">@FusedRingSet</span><span class="sc">;</span> | 
|  | 3431 3418   <span class="s">}</span> | 
|  | 3432 3419 | 
|  | 3433 3420   <span class="i">@NonFusedRings</span> = <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">@</span>{<span class="i">$NonFusedCyclesRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 3434 3421 | 
|  | 3435 3422   <span class="k">return</span> <span class="s">(</span>\<span class="i">@FusedRingSets</span><span class="cm">,</span> \<span class="i">@NonFusedRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3436 3423 <span class="s">}</span> | 
|  | 3437 3424 | 
|  | 3438 3425 <span class="c"># Get rings as an array containing references to arrays with ring atoms...</span> | 
|  | 3439 3426 <span class="c">#</span> | 
|  | 3440 <a name="_GetRings-"></a>3427 <span class="k">sub </span><span class="m">_GetRings</span> <span class="s">{</span> | 
|  | 3441 3428   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@CyclicPaths</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3442 3429   <span class="k">my</span><span class="s">(</span><span class="i">$CyclicPath</span><span class="cm">,</span> <span class="i">@Rings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3443 3430 | 
|  | 3444 3431   <span class="i">@Rings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3445 3432   <span class="k">if</span> <span class="s">(</span>!<span class="i">@CyclicPaths</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3446 3433     <span class="k">return</span> <span class="i">@Rings</span><span class="sc">;</span> | 
|  | 3447 3434   <span class="s">}</span> | 
|  | 3448 3435   <span class="k">if</span> <span class="s">(</span>!<span class="i">@CyclicPaths</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3449 3436     <span class="c"># Return an empty ring list...</span> | 
|  | 3450 3437     <span class="k">return</span> <span class="i">@Rings</span><span class="sc">;</span> | 
|  | 3451 3438   <span class="s">}</span> | 
|  | 3452 3439 | 
|  | 3453 3440   <span class="k">for</span> <span class="i">$CyclicPath</span> <span class="s">(</span><span class="i">@CyclicPaths</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3454 3441     <span class="k">my</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3455 3442     <span class="i">@RingAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3456 3443     <span class="k">push</span> <span class="i">@RingAtoms</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->_GetRing</span><span class="s">(</span><span class="i">$CyclicPath</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3457 3444 | 
|  | 3458 3445     <span class="k">push</span> <span class="i">@Rings</span><span class="cm">,</span> \<span class="i">@RingAtoms</span><span class="sc">;</span> | 
|  | 3459 3446   <span class="s">}</span> | 
|  | 3460 3447   <span class="k">return</span> <span class="i">@Rings</span><span class="sc">;</span> | 
|  | 3461 3448 <span class="s">}</span> | 
|  | 3462 3449 | 
|  | 3463 3450 <span class="c"># Get aromatic rings as an array containing references to arrays with ring atoms...</span> | 
|  | 3464 3451 <span class="c">#</span> | 
|  | 3465 <a name="_GetAromaticRings-"></a>3452 <span class="k">sub </span><span class="m">_GetAromaticRings</span> <span class="s">{</span> | 
|  | 3466 3453   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@CyclicPaths</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3467 3454   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtomsRef</span><span class="cm">,</span> <span class="i">@Rings</span><span class="cm">,</span> <span class="i">@AromaticRings</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3468 3455 | 
|  | 3469 3456   <span class="i">@AromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3470 3457   <span class="i">@Rings</span> = <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">@CyclicPaths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3471 3458 | 
|  | 3472 3459   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Rings</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3473 3460     <span class="k">return</span> <span class="i">@AromaticRings</span><span class="sc">;</span> | 
|  | 3474 3461   <span class="s">}</span> | 
|  | 3475 3462   <span class="j">RING:</span> <span class="k">for</span> <span class="i">$RingAtomsRef</span> <span class="s">(</span><span class="i">@Rings</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3476 3463     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsRingAromatic</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3477 3464       <span class="k">next</span> <span class="j">RING</span><span class="sc">;</span> | 
|  | 3478 3465     <span class="s">}</span> | 
|  | 3479 3466     <span class="k">my</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3480 3467     <span class="i">@RingAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3481 3468     <span class="k">push</span> <span class="i">@RingAtoms</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="sc">;</span> | 
|  | 3482 3469 | 
|  | 3483 3470     <span class="k">push</span> <span class="i">@AromaticRings</span><span class="cm">,</span> \<span class="i">@RingAtoms</span><span class="sc">;</span> | 
|  | 3484 3471   <span class="s">}</span> | 
|  | 3485 3472   <span class="k">return</span> <span class="i">@AromaticRings</span><span class="sc">;</span> | 
|  | 3486 3473 <span class="s">}</span> | 
|  | 3487 3474 | 
|  | 3488 3475 <span class="c"># Map atom IDs in cyclic path to atoms and return a reference to an array containing ring atoms...</span> | 
|  | 3489 3476 <span class="c">#</span> | 
|  | 3490 3477 <span class="c"># Note:</span> | 
|  | 3491 3478 <span class="c">#   . Start and end vertex is same for cyclic paths. So end atom is removed before</span> | 
|  | 3492 3479 <span class="c">#     returning atoms array as ring atoms...</span> | 
|  | 3493 3480 <span class="c">#</span> | 
|  | 3494 <a name="_GetRing-"></a>3481 <span class="k">sub </span><span class="m">_GetRing</span> <span class="s">{</span> | 
|  | 3495 3482   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$CyclicPath</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3496 3483   <span class="k">my</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3497 3484 | 
|  | 3498 3485   <span class="i">@RingAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3499 3486   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$CyclicPath</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3500 3487     <span class="c"># Return an empty atoms list...</span> | 
|  | 3501 3488     <span class="k">return</span> <span class="i">@RingAtoms</span><span class="sc">;</span> | 
|  | 3502 3489   <span class="s">}</span> | 
|  | 3503 3490 | 
|  | 3504 3491   <span class="i">@RingAtoms</span> = <span class="i">$This</span><span class="i">->_GetPathAtoms</span><span class="s">(</span><span class="i">$CyclicPath</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3505 3492   <span class="k">if</span> <span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3506 3493     <span class="k">pop</span> <span class="i">@RingAtoms</span><span class="sc">;</span> | 
|  | 3507 3494   <span class="s">}</span> | 
|  | 3508 3495   <span class="k">return</span> <span class="i">@RingAtoms</span><span class="sc">;</span> | 
|  | 3509 3496 <span class="s">}</span> | 
|  | 3510 3497 | 
|  | 3511 3498 <span class="c"># Map atom IDs to atoms and return a reference to an array containing these atoms...</span> | 
|  | 3512 3499 <span class="c">#</span> | 
|  | 3513 <a name="_GetPathAtoms-"></a>3500 <span class="k">sub </span><span class="m">_GetPathAtoms</span> <span class="s">{</span> | 
|  | 3514 3501   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Path</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3515 3502   <span class="k">my</span><span class="s">(</span><span class="i">@PathAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3516 3503 | 
|  | 3517 3504   <span class="i">@PathAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3518 3505   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Path</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3519 3506     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetPathAtoms: No path atoms retrieved: Path must be defined..."</span><span class="sc">;</span> | 
|  | 3520 3507     <span class="k">return</span> <span class="i">@PathAtoms</span><span class="sc">;</span> | 
|  | 3521 3508   <span class="s">}</span> | 
|  | 3522 3509   <span class="k">my</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3523 3510 | 
|  | 3524 3511   <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3525 3512   <span class="i">@AtomIDs</span> = <span class="i">$Path</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3526 3513 | 
|  | 3527 3514   <span class="i">@PathAtoms</span> = <span class="i">$This</span><span class="i">->_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3528 3515 | 
|  | 3529 3516   <span class="k">return</span> <span class="i">@PathAtoms</span><span class="sc">;</span> | 
|  | 3530 3517 <span class="s">}</span> | 
|  | 3531 3518 | 
|  | 3532 3519 <span class="c"># Get bonds for a path specified by atom IDs...</span> | 
|  | 3533 3520 <span class="c">#</span> | 
|  | 3534 <a name="_GetPathBonds-"></a>3521 <span class="k">sub </span><span class="m">_GetPathBonds</span> <span class="s">{</span> | 
|  | 3535 3522   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3536 3523   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="cm">,</span> <span class="i">@Bonds</span><span class="cm">,</span> <span class="i">@EdgesAtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3537 3524 | 
|  | 3538 3525   <span class="i">@Bonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@EdgesAtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3539 3526 | 
|  | 3540 3527   <span class="k">if</span> <span class="s">(</span>!<span class="i">@AtomIDs</span> || <span class="i">@AtomIDs</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3541 3528     <span class="k">return</span> <span class="i">@Bonds</span><span class="sc">;</span> | 
|  | 3542 3529   <span class="s">}</span> | 
|  | 3543 3530 | 
|  | 3544 3531   <span class="c"># Setup edges...</span> | 
|  | 3545 3532   <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">$#AtomIDs</span> - <span class="n">1</span><span class="s">)</span> <span class="s">)</span> <span class="s">{</span> | 
|  | 3546 3533     <span class="i">$AtomID1</span> = <span class="i">$AtomIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 3547 3534     <span class="i">$AtomID2</span> = <span class="i">$AtomIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span> | 
|  | 3548 3535     <span class="k">push</span> <span class="i">@EdgesAtomIDs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3549 3536   <span class="s">}</span> | 
|  | 3550 3537   <span class="i">@Bonds</span> =  <span class="i">$This</span><span class="i">->GetEdgesProperty</span><span class="s">(</span><span class="q">'Bond'</span><span class="cm">,</span> <span class="i">@EdgesAtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3551 3538 | 
|  | 3552 3539   <span class="k">return</span> <span class="i">@Bonds</span><span class="sc">;</span> | 
|  | 3553 3540 <span class="s">}</span> | 
|  | 3554 3541 | 
|  | 3555 3542 <span class="c"># Map atom ID to an atom...</span> | 
|  | 3556 3543 <span class="c">#</span> | 
|  | 3557 <a name="_GetAtomFromAtomID-"></a>3544 <span class="k">sub </span><span class="m">_GetAtomFromAtomID</span> <span class="s">{</span> | 
|  | 3558 3545   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3559 3546 | 
|  | 3560 3547   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetVertexProperty</span><span class="s">(</span><span class="q">'Atom'</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3561 3548 <span class="s">}</span> | 
|  | 3562 3549 | 
|  | 3563 3550 <span class="c"># Map atom IDs to atoms and return an array containing these atoms...</span> | 
|  | 3564 3551 <span class="c">#</span> | 
|  | 3565 <a name="_GetAtomsFromAtomIDs-"></a>3552 <span class="k">sub </span><span class="m">_GetAtomsFromAtomIDs</span> <span class="s">{</span> | 
|  | 3566 3553   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3567 3554 | 
|  | 3568 3555   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetVerticesProperty</span><span class="s">(</span><span class="q">'Atom'</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3569 3556 <span class="s">}</span> | 
|  | 3570 3557 | 
|  | 3571 3558 <span class="c"># Map atoms to atom IDs and return an array containing these atoms...</span> | 
|  | 3572 3559 <span class="c">#</span> | 
|  | 3573 <a name="_GetAtomsIDsFromAtoms-"></a>3560 <span class="k">sub </span><span class="m">_GetAtomsIDsFromAtoms</span> <span class="s">{</span> | 
|  | 3574 3561   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3575 3562 | 
|  | 3576 3563   <span class="k">return</span> <span class="k">map</span> <span class="s">{</span> <span class="i">$_</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span> <span class="s">}</span> <span class="i">@Atoms</span><span class="sc">;</span> | 
|  | 3577 3564 <span class="s">}</span> | 
|  | 3578 3565 | 
|  | 3579 3566 <span class="c"># Get bonded atom pair atom IDs for specified list of atom IDs...</span> | 
|  | 3580 3567 <span class="c">#</span> | 
|  | 3581 <a name="_GetBondedAtomPairAtomIDsFromAtomIDs-"></a>3568 <span class="k">sub </span><span class="m">_GetBondedAtomPairAtomIDsFromAtomIDs</span> <span class="s">{</span> | 
|  | 3582 3569   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3583 3570   <span class="k">my</span><span class="s">(</span><span class="i">$AtomIndex1</span><span class="cm">,</span> <span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$AtomIndex2</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="cm">,</span> <span class="i">@BondedAtomPairIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3584 3571 | 
|  | 3585 3572   <span class="i">@BondedAtomPairIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3586 3573   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3587 3574 | 
|  | 3588 3575   <span class="k">for</span> <span class="i">$AtomIndex1</span> <span class="s">(</span> <span class="n">0</span> .. <span class="i">$#Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3589 3576     <span class="i">$Atom1</span> = <span class="i">$Atoms</span>[<span class="i">$AtomIndex1</span>]<span class="sc">;</span> | 
|  | 3590 3577     <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3591 3578 | 
|  | 3592 3579     <span class="j">ATOMINDEX2:</span> <span class="k">for</span> <span class="i">$AtomIndex2</span> <span class="s">(</span> <span class="s">(</span><span class="i">$AtomIndex1</span> + <span class="n">1</span><span class="s">)</span> .. <span class="i">$#Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3593 3580       <span class="i">$Atom2</span> = <span class="i">$Atoms</span>[<span class="i">$AtomIndex2</span>]<span class="sc">;</span> | 
|  | 3594 3581       <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom1</span><span class="i">->IsBondedToAtom</span><span class="s">(</span><span class="i">$Atom2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3595 3582         <span class="k">next</span> <span class="j">ATOMINDEX2</span><span class="sc">;</span> | 
|  | 3596 3583        <span class="s">}</span> | 
|  | 3597 3584       <span class="i">$AtomID2</span> = <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3598 3585 | 
|  | 3599 3586       <span class="k">push</span> <span class="i">@BondedAtomPairIDs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3600 3587     <span class="s">}</span> | 
|  | 3601 3588   <span class="s">}</span> | 
|  | 3602 3589 | 
|  | 3603 3590   <span class="k">return</span> <span class="i">@BondedAtomPairIDs</span><span class="sc">;</span> | 
|  | 3604 3591 <span class="s">}</span> | 
|  | 3605 3592 | 
|  | 3606 3593 <span class="c"># Get bonded atom pair atoms for specified list of atoms...</span> | 
|  | 3607 3594 <span class="c">#</span> | 
|  | 3608 <a name="_GetBondedAtomPairAtomsFromAtoms-"></a>3595 <span class="k">sub </span><span class="m">_GetBondedAtomPairAtomsFromAtoms</span> <span class="s">{</span> | 
|  | 3609 3596   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3610 3597   <span class="k">my</span><span class="s">(</span><span class="i">$AtomIndex1</span><span class="cm">,</span> <span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$AtomIndex2</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="cm">,</span> <span class="i">@BondedAtomPairAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3611 3598 | 
|  | 3612 3599   <span class="i">@BondedAtomPairAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3613 3600 | 
|  | 3614 3601   <span class="k">for</span> <span class="i">$AtomIndex1</span> <span class="s">(</span> <span class="n">0</span> .. <span class="i">$#Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3615 3602     <span class="i">$Atom1</span> = <span class="i">$Atoms</span>[<span class="i">$AtomIndex1</span>]<span class="sc">;</span> | 
|  | 3616 3603 | 
|  | 3617 3604     <span class="j">ATOMINDEX2:</span> <span class="k">for</span> <span class="i">$AtomIndex2</span> <span class="s">(</span> <span class="s">(</span><span class="i">$AtomIndex1</span> + <span class="n">1</span><span class="s">)</span> .. <span class="i">$#Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3618 3605       <span class="i">$Atom2</span> = <span class="i">$Atoms</span>[<span class="i">$AtomIndex2</span>]<span class="sc">;</span> | 
|  | 3619 3606       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom1</span><span class="i">->IsBondedToAtom</span><span class="s">(</span><span class="i">$Atom2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3620 3607         <span class="k">next</span> <span class="j">ATOMINDEX2</span><span class="sc">;</span> | 
|  | 3621 3608        <span class="s">}</span> | 
|  | 3622 3609 | 
|  | 3623 3610       <span class="k">push</span> <span class="i">@BondedAtomPairAtoms</span><span class="cm">,</span> <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3624 3611     <span class="s">}</span> | 
|  | 3625 3612   <span class="s">}</span> | 
|  | 3626 3613 | 
|  | 3627 3614   <span class="k">return</span> <span class="i">@BondedAtomPairAtoms</span><span class="sc">;</span> | 
|  | 3628 3615 <span class="s">}</span> | 
|  | 3629 3616 | 
|  | 3630 3617 <span class="c"># Is atom in a ring?</span> | 
|  | 3631 3618 <span class="c">#</span> | 
|  | 3632 <a name="_IsAtomInRing-"></a>3619 <span class="k">sub </span><span class="m">_IsAtomInRing</span> <span class="s">{</span> | 
|  | 3633 3620   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3634 3621 | 
|  | 3635 3622   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsCyclicVertex</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3636 3623 <span class="s">}</span> | 
|  | 3637 3624 | 
|  | 3638 3625 <span class="c"># Is atom not in a ring?</span> | 
|  | 3639 3626 <span class="c">#</span> | 
|  | 3640 <a name="_IsAtomNotInRing-"></a>3627 <span class="k">sub </span><span class="m">_IsAtomNotInRing</span> <span class="s">{</span> | 
|  | 3641 3628   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3642 3629 | 
|  | 3643 3630   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsAcyclicVertex</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3644 3631 <span class="s">}</span> | 
|  | 3645 3632 | 
|  | 3646 3633 <span class="c"># Is atom only in one ring?</span> | 
|  | 3647 3634 <span class="c">#</span> | 
|  | 3648 <a name="_IsAtomInOnlyOneRing-"></a>3635 <span class="k">sub </span><span class="m">_IsAtomInOnlyOneRing</span> <span class="s">{</span> | 
|  | 3649 3636   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3650 3637 | 
|  | 3651 3638   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsUnicyclicVertex</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3652 3639 <span class="s">}</span> | 
|  | 3653 3640 | 
|  | 3654 3641 <span class="c"># Is atom in a ring of specified size?</span> | 
|  | 3655 3642 <span class="c">#</span> | 
|  | 3656 <a name="_IsAtomInRingOfSize-"></a>3643 <span class="k">sub </span><span class="m">_IsAtomInRingOfSize</span> <span class="s">{</span> | 
|  | 3657 3644   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3658 3645 | 
|  | 3659 3646   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfVertexCyclesWithSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3660 3647 <span class="s">}</span> | 
|  | 3661 3648 | 
|  | 3662 3649 <span class="c"># Get size of smallest ring containing specified atom...</span> | 
|  | 3663 3650 <span class="c">#</span> | 
|  | 3664 <a name="_GetSizeOfSmallestAtomRing-"></a>3651 <span class="k">sub </span><span class="m">_GetSizeOfSmallestAtomRing</span> <span class="s">{</span> | 
|  | 3665 3652   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3666 3653 | 
|  | 3667 3654   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSizeOfSmallestVertexCycle</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3668 3655 <span class="s">}</span> | 
|  | 3669 3656 | 
|  | 3670 3657 <span class="c"># Get size of largest ring containing specified atom...</span> | 
|  | 3671 3658 <span class="c">#</span> | 
|  | 3672 <a name="_GetSizeOfLargestAtomRing-"></a>3659 <span class="k">sub </span><span class="m">_GetSizeOfLargestAtomRing</span> <span class="s">{</span> | 
|  | 3673 3660   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3674 3661 | 
|  | 3675 3662   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSizeOfLargestVertexCycle</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3676 3663 <span class="s">}</span> | 
|  | 3677 3664 | 
|  | 3678 3665 <span class="c"># Get number of  rings containing specified atom...</span> | 
|  | 3679 3666 <span class="c">#</span> | 
|  | 3680 <a name="_GetNumOfAtomRings-"></a>3667 <span class="k">sub </span><span class="m">_GetNumOfAtomRings</span> <span class="s">{</span> | 
|  | 3681 3668   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3682 3669 | 
|  | 3683 3670   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfVertexCycles</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3684 3671 <span class="s">}</span> | 
|  | 3685 3672 | 
|  | 3686 3673 <span class="c"># Get number of  rings with odd size containing specified atom...</span> | 
|  | 3687 3674 <span class="c">#</span> | 
|  | 3688 <a name="_GetNumOfAtomRingsWithOddSize-"></a>3675 <span class="k">sub </span><span class="m">_GetNumOfAtomRingsWithOddSize</span> <span class="s">{</span> | 
|  | 3689 3676   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3690 3677 | 
|  | 3691 3678   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfVertexCyclesWithOddSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3692 3679 <span class="s">}</span> | 
|  | 3693 3680 | 
|  | 3694 3681 <span class="c"># Get number of  rings with even size containing specified atom...</span> | 
|  | 3695 3682 <span class="c">#</span> | 
|  | 3696 <a name="_GetNumOfAtomRingsWithEvenSize-"></a>3683 <span class="k">sub </span><span class="m">_GetNumOfAtomRingsWithEvenSize</span> <span class="s">{</span> | 
|  | 3697 3684   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3698 3685 | 
|  | 3699 3686   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfVertexCyclesWithEvenSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3700 3687 <span class="s">}</span> | 
|  | 3701 3688 | 
|  | 3702 3689 <span class="c"># Get number of  rings with specified size containing specified atom...</span> | 
|  | 3703 3690 <span class="c">#</span> | 
|  | 3704 <a name="_GetNumOfAtomRingsWithSize-"></a>3691 <span class="k">sub </span><span class="m">_GetNumOfAtomRingsWithSize</span> <span class="s">{</span> | 
|  | 3705 3692   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3706 3693 | 
|  | 3707 3694   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfVertexCyclesWithSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3708 3695 <span class="s">}</span> | 
|  | 3709 3696 | 
|  | 3710 3697 <span class="c"># Get number of  rings with size less than specified containing specified atom...</span> | 
|  | 3711 3698 <span class="c">#</span> | 
|  | 3712 <a name="_GetNumOfAtomRingsWithSizeLessThan-"></a>3699 <span class="k">sub </span><span class="m">_GetNumOfAtomRingsWithSizeLessThan</span> <span class="s">{</span> | 
|  | 3713 3700   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3714 3701 | 
|  | 3715 3702   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfVertexCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3716 3703 <span class="s">}</span> | 
|  | 3717 3704 | 
|  | 3718 3705 <span class="c"># Get number of  rings with size greater than specified containing specified atom...</span> | 
|  | 3719 3706 <span class="c">#</span> | 
|  | 3720 <a name="_GetNumOfAtomRingsWithSizeGreaterThan-"></a>3707 <span class="k">sub </span><span class="m">_GetNumOfAtomRingsWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 3721 3708   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3722 3709 | 
|  | 3723 3710   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfVertexCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3724 3711 <span class="s">}</span> | 
|  | 3725 3712 | 
|  | 3726 3713 <span class="c"># Get smallest ring as an array containing ring atoms...</span> | 
|  | 3727 3714 <span class="c">#</span> | 
|  | 3728 <a name="_GetSmallestAtomRing-"></a>3715 <span class="k">sub </span><span class="m">_GetSmallestAtomRing</span> <span class="s">{</span> | 
|  | 3729 3716   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3730 3717 | 
|  | 3731 3718   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetSmallestVertexCycle</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3732 3719 <span class="s">}</span> | 
|  | 3733 3720 | 
|  | 3734 3721 <span class="c"># Get odd size rings an array of references to arrays containing ring atoms...</span> | 
|  | 3735 3722 <span class="c">#</span> | 
|  | 3736 <a name="_GetLargestAtomRing-"></a>3723 <span class="k">sub </span><span class="m">_GetLargestAtomRing</span> <span class="s">{</span> | 
|  | 3737 3724   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3738 3725 | 
|  | 3739 3726   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetLargestVertexCycle</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3740 3727 <span class="s">}</span> | 
|  | 3741 3728 | 
|  | 3742 3729 <span class="c"># Get all rings an array of references to arrays containing ring atoms...</span> | 
|  | 3743 3730 <span class="c">#</span> | 
|  | 3744 <a name="_GetAtomRings-"></a>3731 <span class="k">sub </span><span class="m">_GetAtomRings</span> <span class="s">{</span> | 
|  | 3745 3732   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3746 3733 | 
|  | 3747 3734   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetVertexCycles</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3748 3735 <span class="s">}</span> | 
|  | 3749 3736 | 
|  | 3750 3737 <span class="c"># Get odd size rings an array of references to arrays containing ring atoms...</span> | 
|  | 3751 3738 <span class="c">#</span> | 
|  | 3752 <a name="_GetAtomRingsWithOddSize-"></a>3739 <span class="k">sub </span><span class="m">_GetAtomRingsWithOddSize</span> <span class="s">{</span> | 
|  | 3753 3740   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3754 3741 | 
|  | 3755 3742   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetVertexCyclesWithOddSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3756 3743 <span class="s">}</span> | 
|  | 3757 3744 | 
|  | 3758 3745 <span class="c"># Get even size rings an array of references to arrays containing ring atoms...</span> | 
|  | 3759 3746 <span class="c">#</span> | 
|  | 3760 <a name="_GetAtomRingsWithEvenSize-"></a>3747 <span class="k">sub </span><span class="m">_GetAtomRingsWithEvenSize</span> <span class="s">{</span> | 
|  | 3761 3748   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3762 3749 | 
|  | 3763 3750   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetVertexCyclesWithEvenSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3764 3751 <span class="s">}</span> | 
|  | 3765 3752 | 
|  | 3766 3753 <span class="c"># Get rings with specified size  an array of references to arrays containing ring atoms...</span> | 
|  | 3767 3754 <span class="c">#</span> | 
|  | 3768 <a name="_GetAtomRingsWithSize-"></a>3755 <span class="k">sub </span><span class="m">_GetAtomRingsWithSize</span> <span class="s">{</span> | 
|  | 3769 3756   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3770 3757 | 
|  | 3771 3758   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetVertexCyclesWithSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3772 3759 <span class="s">}</span> | 
|  | 3773 3760 | 
|  | 3774 3761 <span class="c"># Get rings with size less than specfied size as an array of references to arrays containing ring atoms...</span> | 
|  | 3775 3762 <span class="c">#</span> | 
|  | 3776 <a name="_GetAtomRingsWithSizeLessThan-"></a>3763 <span class="k">sub </span><span class="m">_GetAtomRingsWithSizeLessThan</span> <span class="s">{</span> | 
|  | 3777 3764   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3778 3765 | 
|  | 3779 3766   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetVertexCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3780 3767 <span class="s">}</span> | 
|  | 3781 3768 | 
|  | 3782 3769 <span class="c"># Get rings with size less than specfied size as an array of references to arrays containing ring atoms...</span> | 
|  | 3783 3770 <span class="c">#</span> | 
|  | 3784 <a name="_GetAtomRingsWithSizeGreaterThan-"></a>3771 <span class="k">sub </span><span class="m">_GetAtomRingsWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 3785 3772   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Atom</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3786 3773 | 
|  | 3787 3774   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetVertexCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$Atom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3788 3775 <span class="s">}</span> | 
|  | 3789 3776 | 
|  | 3790 3777 <span class="c"># Is bond in a ring?</span> | 
|  | 3791 3778 <span class="c">#</span> | 
|  | 3792 <a name="_IsBondInRing-"></a>3779 <span class="k">sub </span><span class="m">_IsBondInRing</span> <span class="s">{</span> | 
|  | 3793 3780   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3794 3781   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3795 3782 | 
|  | 3796 3783   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3797 3784 | 
|  | 3798 3785   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsCyclicEdge</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3799 3786 <span class="s">}</span> | 
|  | 3800 3787 | 
|  | 3801 3788 <span class="c"># Is bond not in a ring?</span> | 
|  | 3802 3789 <span class="c">#</span> | 
|  | 3803 <a name="_IsBondNotInRing-"></a>3790 <span class="k">sub </span><span class="m">_IsBondNotInRing</span> <span class="s">{</span> | 
|  | 3804 3791   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3805 3792   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3806 3793 | 
|  | 3807 3794   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3808 3795 | 
|  | 3809 3796   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsAcyclicEdge</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3810 3797 <span class="s">}</span> | 
|  | 3811 3798 | 
|  | 3812 3799 <span class="c"># Is bond only in one ring?</span> | 
|  | 3813 3800 <span class="c">#</span> | 
|  | 3814 <a name="_IsBondInOnlyOneRing-"></a>3801 <span class="k">sub </span><span class="m">_IsBondInOnlyOneRing</span> <span class="s">{</span> | 
|  | 3815 3802   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3816 3803   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3817 3804 | 
|  | 3818 3805   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3819 3806 | 
|  | 3820 3807   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsUnicyclicEdge</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3821 3808 <span class="s">}</span> | 
|  | 3822 3809 | 
|  | 3823 3810 <span class="c"># Is bond in a ring of specified size?</span> | 
|  | 3824 3811 <span class="c">#</span> | 
|  | 3825 <a name="_IsBondInRingOfSize-"></a>3812 <span class="k">sub </span><span class="m">_IsBondInRingOfSize</span> <span class="s">{</span> | 
|  | 3826 3813   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3827 3814   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3828 3815 | 
|  | 3829 3816   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3830 3817 | 
|  | 3831 3818   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfEdgeCyclesWithSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 3832 3819 <span class="s">}</span> | 
|  | 3833 3820 | 
|  | 3834 3821 <span class="c"># Get size of smallest ring containing specified bond...</span> | 
|  | 3835 3822 <span class="c">#</span> | 
|  | 3836 <a name="_GetSizeOfSmallestBondRing-"></a>3823 <span class="k">sub </span><span class="m">_GetSizeOfSmallestBondRing</span> <span class="s">{</span> | 
|  | 3837 3824   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3838 3825   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3839 3826 | 
|  | 3840 3827   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3841 3828 | 
|  | 3842 3829   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSizeOfSmallestEdgeCycle</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3843 3830 <span class="s">}</span> | 
|  | 3844 3831 | 
|  | 3845 3832 <span class="c"># Get size of largest ring containing specified bond...</span> | 
|  | 3846 3833 <span class="c">#</span> | 
|  | 3847 <a name="_GetSizeOfLargestBondRing-"></a>3834 <span class="k">sub </span><span class="m">_GetSizeOfLargestBondRing</span> <span class="s">{</span> | 
|  | 3848 3835   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3849 3836   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3850 3837 | 
|  | 3851 3838   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3852 3839 | 
|  | 3853 3840   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSizeOfLargestEdgeCycle</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3854 3841 <span class="s">}</span> | 
|  | 3855 3842 | 
|  | 3856 3843 <span class="c"># Get number of  rings containing specified bond...</span> | 
|  | 3857 3844 <span class="c">#</span> | 
|  | 3858 <a name="_GetNumOfBondRings-"></a>3845 <span class="k">sub </span><span class="m">_GetNumOfBondRings</span> <span class="s">{</span> | 
|  | 3859 3846   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3860 3847   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3861 3848 | 
|  | 3862 3849   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3863 3850 | 
|  | 3864 3851   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfEdgeCycles</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3865 3852 <span class="s">}</span> | 
|  | 3866 3853 | 
|  | 3867 3854 <span class="c"># Get number of  rings with odd size containing specified bond...</span> | 
|  | 3868 3855 <span class="c">#</span> | 
|  | 3869 <a name="_GetNumOfBondRingsWithOddSize-"></a>3856 <span class="k">sub </span><span class="m">_GetNumOfBondRingsWithOddSize</span> <span class="s">{</span> | 
|  | 3870 3857   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3871 3858   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3872 3859 | 
|  | 3873 3860   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3874 3861 | 
|  | 3875 3862   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfEdgeCyclesWithOddSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3876 3863 <span class="s">}</span> | 
|  | 3877 3864 | 
|  | 3878 3865 <span class="c"># Get number of  rings with even size containing specified bond...</span> | 
|  | 3879 3866 <span class="c">#</span> | 
|  | 3880 <a name="_GetNumOfBondRingsWithEvenSize-"></a>3867 <span class="k">sub </span><span class="m">_GetNumOfBondRingsWithEvenSize</span> <span class="s">{</span> | 
|  | 3881 3868   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3882 3869   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3883 3870 | 
|  | 3884 3871   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3885 3872 | 
|  | 3886 3873   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfEdgeCyclesWithEvenSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3887 3874 <span class="s">}</span> | 
|  | 3888 3875 | 
|  | 3889 3876 <span class="c"># Get number of  rings with specified size containing specified bond...</span> | 
|  | 3890 3877 <span class="c">#</span> | 
|  | 3891 <a name="_GetNumOfBondRingsWithSize-"></a>3878 <span class="k">sub </span><span class="m">_GetNumOfBondRingsWithSize</span> <span class="s">{</span> | 
|  | 3892 3879   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3893 3880   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3894 3881 | 
|  | 3895 3882   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3896 3883 | 
|  | 3897 3884   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfEdgeCyclesWithSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3898 3885 <span class="s">}</span> | 
|  | 3899 3886 | 
|  | 3900 3887 <span class="c"># Get number of  rings with size less than specified containing specified bond...</span> | 
|  | 3901 3888 <span class="c">#</span> | 
|  | 3902 <a name="_GetNumOfBondRingsWithSizeLessThan-"></a>3889 <span class="k">sub </span><span class="m">_GetNumOfBondRingsWithSizeLessThan</span> <span class="s">{</span> | 
|  | 3903 3890   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3904 3891   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3905 3892 | 
|  | 3906 3893   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3907 3894 | 
|  | 3908 3895   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfEdgeCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3909 3896 <span class="s">}</span> | 
|  | 3910 3897 | 
|  | 3911 3898 <span class="c"># Get number of  rings with size greater than specified containing specified bond...</span> | 
|  | 3912 3899 <span class="c">#</span> | 
|  | 3913 <a name="_GetNumOfBondRingsWithSizeGreaterThan-"></a>3900 <span class="k">sub </span><span class="m">_GetNumOfBondRingsWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 3914 3901   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3915 3902   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3916 3903 | 
|  | 3917 3904   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3918 3905 | 
|  | 3919 3906   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetNumOfEdgeCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3920 3907 <span class="s">}</span> | 
|  | 3921 3908 | 
|  | 3922 3909 <span class="c"># Get smallest ring as an array containing ring atoms...</span> | 
|  | 3923 3910 <span class="c">#</span> | 
|  | 3924 <a name="_GetSmallestBondRing-"></a>3911 <span class="k">sub </span><span class="m">_GetSmallestBondRing</span> <span class="s">{</span> | 
|  | 3925 3912   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3926 3913   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3927 3914 | 
|  | 3928 3915   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3929 3916 | 
|  | 3930 3917   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetSmallestEdgeCycle</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3931 3918 <span class="s">}</span> | 
|  | 3932 3919 | 
|  | 3933 3920 <span class="c"># Get odd size rings an array of references to arrays containing ring atoms...</span> | 
|  | 3934 3921 <span class="c">#</span> | 
|  | 3935 <a name="_GetLargestBondRing-"></a>3922 <span class="k">sub </span><span class="m">_GetLargestBondRing</span> <span class="s">{</span> | 
|  | 3936 3923   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3937 3924   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3938 3925 | 
|  | 3939 3926   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3940 3927 | 
|  | 3941 3928   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetLargestEdgeCycle</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3942 3929 <span class="s">}</span> | 
|  | 3943 3930 | 
|  | 3944 3931 <span class="c"># Get all rings an array of references to arrays containing ring atoms...</span> | 
|  | 3945 3932 <span class="c">#</span> | 
|  | 3946 <a name="_GetBondRings-"></a>3933 <span class="k">sub </span><span class="m">_GetBondRings</span> <span class="s">{</span> | 
|  | 3947 3934   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3948 3935   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3949 3936 | 
|  | 3950 3937   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3951 3938 | 
|  | 3952 3939   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetEdgeCycles</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3953 3940 <span class="s">}</span> | 
|  | 3954 3941 | 
|  | 3955 3942 <span class="c"># Get odd size rings an array of references to arrays containing ring atoms...</span> | 
|  | 3956 3943 <span class="c">#</span> | 
|  | 3957 <a name="_GetBondRingsWithOddSize-"></a>3944 <span class="k">sub </span><span class="m">_GetBondRingsWithOddSize</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">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3959 3946   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3960 3947 | 
|  | 3961 3948   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3962 3949 | 
|  | 3963 3950   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetEdgeCyclesWithOddSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3964 3951 <span class="s">}</span> | 
|  | 3965 3952 | 
|  | 3966 3953 <span class="c"># Get even size rings an array of references to arrays containing ring atoms...</span> | 
|  | 3967 3954 <span class="c">#</span> | 
|  | 3968 <a name="_GetBondRingsWithEvenSize-"></a>3955 <span class="k">sub </span><span class="m">_GetBondRingsWithEvenSize</span> <span class="s">{</span> | 
|  | 3969 3956   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3970 3957   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3971 3958 | 
|  | 3972 3959   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3973 3960 | 
|  | 3974 3961   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetEdgeCyclesWithEvenSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3975 3962 <span class="s">}</span> | 
|  | 3976 3963 | 
|  | 3977 3964 <span class="c"># Get rings with specified size  an array of references to arrays containing ring atoms...</span> | 
|  | 3978 3965 <span class="c">#</span> | 
|  | 3979 <a name="_GetBondRingsWithSize-"></a>3966 <span class="k">sub </span><span class="m">_GetBondRingsWithSize</span> <span class="s">{</span> | 
|  | 3980 3967   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3981 3968   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3982 3969 | 
|  | 3983 3970   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3984 3971 | 
|  | 3985 3972   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetEdgeCyclesWithSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3986 3973 <span class="s">}</span> | 
|  | 3987 3974 | 
|  | 3988 3975 <span class="c"># Get rings with size less than specfied size as an array of references to arrays containing ring atoms...</span> | 
|  | 3989 3976 <span class="c">#</span> | 
|  | 3990 <a name="_GetBondRingsWithSizeLessThan-"></a>3977 <span class="k">sub </span><span class="m">_GetBondRingsWithSizeLessThan</span> <span class="s">{</span> | 
|  | 3991 3978   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 3992 3979   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3993 3980 | 
|  | 3994 3981   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3995 3982 | 
|  | 3996 3983   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetEdgeCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3997 3984 <span class="s">}</span> | 
|  | 3998 3985 | 
|  | 3999 3986 <span class="c"># Get rings with size less than specfied size as an array of references to arrays containing ring atoms...</span> | 
|  | 4000 3987 <span class="c">#</span> | 
|  | 4001 <a name="_GetBondRingsWithSizeGreaterThan-"></a>3988 <span class="k">sub </span><span class="m">_GetBondRingsWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 4002 3989   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Bond</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4003 3990   <span class="k">my</span><span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4004 3991 | 
|  | 4005 3992   <span class="s">(</span><span class="i">$Atom1</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="s">)</span> = <span class="i">$Bond</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4006 3993 | 
|  | 4007 3994   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetEdgeCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4008 3995 <span class="s">}</span> | 
|  | 4009 3996 | 
|  | 4010 3997 | 
|  | 4011 3998 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span> | 
|  | 4012 3999 <span class="c"># to arrays with path atoms.</span> | 
|  | 4013 4000 <span class="c">#</span> | 
|  | 4014 4001 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with length</span> | 
|  | 4015 4002 <span class="c"># upto a specified length and sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4016 4003 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4017 4004 <span class="c">#</span> | 
|  | 4018 4005 <span class="c"># Note:</span> | 
|  | 4019 4006 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span> | 
|  | 4020 4007 <span class="c">#      as GetAtomPathsStartingAtWithLengthUpto method.</span> | 
|  | 4021 4008 <span class="c">#</span> | 
|  | 4022 <a name="GetAllAtomPathsStartingAtWithLengthUpto-"></a>4009 <span class="k">sub </span><span class="m">GetAllAtomPathsStartingAtWithLengthUpto</span> <span class="s">{</span> | 
|  | 4023 4010   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4024 4011 | 
|  | 4025 4012   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">'AllAtomPathsWithLengthUpto'</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4026 4013 <span class="s">}</span> | 
|  | 4027 4014 | 
|  | 4028 4015 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span> | 
|  | 4029 4016 <span class="c"># to arrays with path atoms.</span> | 
|  | 4030 4017 <span class="c">#</span> | 
|  | 4031 4018 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with</span> | 
|  | 4032 4019 <span class="c"># specified length and sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4033 4020 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4034 4021 <span class="c">#</span> | 
|  | 4035 4022 <span class="c"># Note:</span> | 
|  | 4036 4023 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span> | 
|  | 4037 4024 <span class="c">#      as GetAtomPathsStartingAtWithLengthUpto method.</span> | 
|  | 4038 4025 <span class="c">#</span> | 
|  | 4039 <a name="GetAllAtomPathsStartingAtWithLength-"></a>4026 <span class="k">sub </span><span class="m">GetAllAtomPathsStartingAtWithLength</span> <span class="s">{</span> | 
|  | 4040 4027   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4041 4028 | 
|  | 4042 4029   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">'AllAtomPathsWithLength'</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4043 4030 <span class="s">}</span> | 
|  | 4044 4031 | 
|  | 4045 4032 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span> | 
|  | 4046 4033 <span class="c"># to arrays with path atoms.</span> | 
|  | 4047 4034 <span class="c">#</span> | 
|  | 4048 4035 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with all</span> | 
|  | 4049 4036 <span class="c"># possible lengths and sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4050 4037 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4051 4038 <span class="c">#</span> | 
|  | 4052 4039 <span class="c"># Note:</span> | 
|  | 4053 4040 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span> | 
|  | 4054 4041 <span class="c">#      as GetAtomPathsStartingAt method.</span> | 
|  | 4055 4042 <span class="c">#</span> | 
|  | 4056 <a name="GetAllAtomPathsStartingAt-"></a>4043 <span class="k">sub </span><span class="m">GetAllAtomPathsStartingAt</span> <span class="s">{</span> | 
|  | 4057 4044   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4058 4045 | 
|  | 4059 4046   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">'AllAtomPathsWithAllLengths'</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4060 4047 <span class="s">}</span> | 
|  | 4061 4048 | 
|  | 4062 4049 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span> | 
|  | 4063 4050 <span class="c"># to arrays with path atoms.</span> | 
|  | 4064 4051 <span class="c">#</span> | 
|  | 4065 4052 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with length</span> | 
|  | 4066 4053 <span class="c"># upto a specified length and no sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4067 4054 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4068 4055 <span class="c">#</span> | 
|  | 4069 <a name="GetAtomPathsStartingAtWithLengthUpto-"></a>4056 <span class="k">sub </span><span class="m">GetAtomPathsStartingAtWithLengthUpto</span> <span class="s">{</span> | 
|  | 4070 4057   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4071 4058 | 
|  | 4072 4059   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">'AtomPathsWithLengthUpto'</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4073 4060 <span class="s">}</span> | 
|  | 4074 4061 | 
|  | 4075 4062 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span> | 
|  | 4076 4063 <span class="c"># to arrays with path atoms.</span> | 
|  | 4077 4064 <span class="c">#</span> | 
|  | 4078 4065 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with</span> | 
|  | 4079 4066 <span class="c"># specified length and no sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4080 4067 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4081 4068 <span class="c">#</span> | 
|  | 4082 <a name="GetAtomPathsStartingAtWithLength-"></a>4069 <span class="k">sub </span><span class="m">GetAtomPathsStartingAtWithLength</span> <span class="s">{</span> | 
|  | 4083 4070   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4084 4071 | 
|  | 4085 4072   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">'AtomPathsWithLength'</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4086 4073 <span class="s">}</span> | 
|  | 4087 4074 | 
|  | 4088 4075 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span> | 
|  | 4089 4076 <span class="c"># to arrays with path atoms.</span> | 
|  | 4090 4077 <span class="c">#</span> | 
|  | 4091 4078 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with all</span> | 
|  | 4092 4079 <span class="c"># possible lengths and no sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4093 4080 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4094 4081 <span class="c">#</span> | 
|  | 4095 4082 <span class="c">#</span> | 
|  | 4096 <a name="GetAtomPathsStartingAt-"></a>4083 <span class="k">sub </span><span class="m">GetAtomPathsStartingAt</span> <span class="s">{</span> | 
|  | 4097 4084   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4098 4085 | 
|  | 4099 4086   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">'AtomPathsWithAllLengths'</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4100 4087 <span class="s">}</span> | 
|  | 4101 4088 | 
|  | 4102 4089 <span class="c"># Get atom paths as an array containing references to arrays with path atoms...</span> | 
|  | 4103 4090 <span class="c">#</span> | 
|  | 4104 <a name="_GetAtomPathsStartingAt-"></a>4091 <span class="k">sub </span><span class="m">_GetAtomPathsStartingAt</span> <span class="s">{</span> | 
|  | 4105 4092   <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="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4106 4093   <span class="k">my</span><span class="s">(</span><span class="i">@AtomPaths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4107 4094 | 
|  | 4108 4095   <span class="i">@AtomPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4109 4096   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$StartAtom</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4110 4097     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetAtomPathsStartingAt: No atom paths retrieved: Start atom is not defined..."</span><span class="sc">;</span> | 
|  | 4111 4098     <span class="k">return</span> <span class="i">@AtomPaths</span><span class="sc">;</span> | 
|  | 4112 4099   <span class="s">}</span> | 
|  | 4113 4100   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$StartAtom</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4114 4101     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetAtomPathsStartingAt: No atom paths retrieved: Start atom doesn't exist..."</span><span class="sc">;</span> | 
|  | 4115 4102     <span class="k">return</span> <span class="i">@AtomPaths</span><span class="sc">;</span> | 
|  | 4116 4103   <span class="s">}</span> | 
|  | 4117 4104   <span class="k">my</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">@Paths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4118 4105 | 
|  | 4119 4106   <span class="i">$StartAtomID</span> = <span class="i">$StartAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4120 4107   <span class="i">@Paths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4121 4108 | 
|  | 4122 4109   <span class="c"># Collect appropriate atom paths...</span> | 
|  | 4123 4110   <span class="j">MODE:</span> <span class="s">{</span> | 
|  | 4124 4111     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AtomPathsWithLengthUpto$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@Paths</span> = <span class="i">$This</span><span class="i">->GetPathsStartingAtWithLengthUpto</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4125 4112     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AtomPathsWithLength$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@Paths</span> = <span class="i">$This</span><span class="i">->GetPathsStartingAtWithLength</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4126 4113     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AtomPathsWithAllLengths$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@Paths</span> = <span class="i">$This</span><span class="i">->GetPathsStartingAt</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4127 4114 | 
|  | 4128 4115     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AllAtomPathsWithLengthUpto$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@Paths</span> = <span class="i">$This</span><span class="i">->GetAllPathsStartingAtWithLengthUpto</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4129 4116     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AllAtomPathsWithLength$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@Paths</span> = <span class="i">$This</span><span class="i">->GetAllPathsStartingAtWithLength</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4130 4117     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AllAtomPathsWithAllLengths$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@Paths</span> = <span class="i">$This</span><span class="i">->GetAllPathsStartingAt</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4131 4118 | 
|  | 4132 4119     <span class="k">print</span> <span class="q">"Warn: ${ClassName}->_GetAtomPathsStartingAt: No atom paths retrieved: Mode, $Mode, is not supported..."</span><span class="sc">;</span> | 
|  | 4133 4120     <span class="k">return</span> <span class="i">@AtomPaths</span><span class="sc">;</span> | 
|  | 4134 4121   <span class="s">}</span> | 
|  | 4135 4122   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPathsFromPaths</span><span class="s">(</span>\<span class="i">@Paths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4136 4123 <span class="s">}</span> | 
|  | 4137 4124 | 
|  | 4138 4125 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span> | 
|  | 4139 4126 <span class="c"># path atoms.</span> | 
|  | 4140 4127 <span class="c">#</span> | 
|  | 4141 4128 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with length</span> | 
|  | 4142 4129 <span class="c"># upto a specified length and sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4143 4130 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4144 4131 <span class="c">#</span> | 
|  | 4145 4132 <span class="c"># Notes:</span> | 
|  | 4146 4133 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span> | 
|  | 4147 4134 <span class="c">#      as GetAtomPathsWithLengthUpto method.</span> | 
|  | 4148 4135 <span class="c">#</span> | 
|  | 4149 <a name="GetAllAtomPathsWithLengthUpto-"></a>4136 <span class="k">sub </span><span class="m">GetAllAtomPathsWithLengthUpto</span> <span class="s">{</span> | 
|  | 4150 4137   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4151 4138 | 
|  | 4152 4139   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPaths</span><span class="s">(</span><span class="q">'AllAtomPathsWithLengthUpto'</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4153 4140 <span class="s">}</span> | 
|  | 4154 4141 | 
|  | 4155 4142 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span> | 
|  | 4156 4143 <span class="c"># path atoms.</span> | 
|  | 4157 4144 <span class="c">#</span> | 
|  | 4158 4145 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with</span> | 
|  | 4159 4146 <span class="c"># a specified length and sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4160 4147 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4161 4148 <span class="c">#</span> | 
|  | 4162 4149 <span class="c"># Notes:</span> | 
|  | 4163 4150 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span> | 
|  | 4164 4151 <span class="c">#      as GetAtomPathsWithLengthUpto method.</span> | 
|  | 4165 4152 <span class="c">#</span> | 
|  | 4166 <a name="GetAllAtomPathsWithLength-"></a>4153 <span class="k">sub </span><span class="m">GetAllAtomPathsWithLength</span> <span class="s">{</span> | 
|  | 4167 4154   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4168 4155 | 
|  | 4169 4156   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPaths</span><span class="s">(</span><span class="q">'AllAtomPathsWithLength'</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4170 4157 <span class="s">}</span> | 
|  | 4171 4158 | 
|  | 4172 4159 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span> | 
|  | 4173 4160 <span class="c"># path atoms.</span> | 
|  | 4174 4161 <span class="c">#</span> | 
|  | 4175 4162 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with all</span> | 
|  | 4176 4163 <span class="c"># possible lengths and sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4177 4164 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4178 4165 <span class="c">#</span> | 
|  | 4179 4166 <span class="c"># Notes:</span> | 
|  | 4180 4167 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span> | 
|  | 4181 4168 <span class="c">#      as GetAtomPaths method.</span> | 
|  | 4182 4169 <span class="c">#</span> | 
|  | 4183 <a name="GetAllAtomPaths-"></a>4170 <span class="k">sub </span><span class="m">GetAllAtomPaths</span> <span class="s">{</span> | 
|  | 4184 4171   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4185 4172 | 
|  | 4186 4173   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPaths</span><span class="s">(</span><span class="q">'AllAtomPathsWithAllLengths'</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4187 4174 <span class="s">}</span> | 
|  | 4188 4175 | 
|  | 4189 4176 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span> | 
|  | 4190 4177 <span class="c"># path atoms.</span> | 
|  | 4191 4178 <span class="c">#</span> | 
|  | 4192 4179 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with length</span> | 
|  | 4193 4180 <span class="c"># upto a specified length and no sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4194 4181 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4195 4182 <span class="c">#</span> | 
|  | 4196 <a name="GetAtomPathsWithLengthUpto-"></a>4183 <span class="k">sub </span><span class="m">GetAtomPathsWithLengthUpto</span> <span class="s">{</span> | 
|  | 4197 4184   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4198 4185 | 
|  | 4199 4186   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPaths</span><span class="s">(</span><span class="q">'AtomPathsWithLengthUpto'</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4200 4187 <span class="s">}</span> | 
|  | 4201 4188 | 
|  | 4202 4189 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span> | 
|  | 4203 4190 <span class="c"># path atoms.</span> | 
|  | 4204 4191 <span class="c">#</span> | 
|  | 4205 4192 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with</span> | 
|  | 4206 4193 <span class="c"># a specified length and no sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4207 4194 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4208 4195 <span class="c">#</span> | 
|  | 4209 <a name="GetAtomPathsWithLength-"></a>4196 <span class="k">sub </span><span class="m">GetAtomPathsWithLength</span> <span class="s">{</span> | 
|  | 4210 4197   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4211 4198 | 
|  | 4212 4199   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPaths</span><span class="s">(</span><span class="q">'AtomPathsWithLength'</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4213 4200 <span class="s">}</span> | 
|  | 4214 4201 | 
|  | 4215 4202 | 
|  | 4216 4203 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span> | 
|  | 4217 4204 <span class="c"># path atoms.</span> | 
|  | 4218 4205 <span class="c">#</span> | 
|  | 4219 4206 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with all</span> | 
|  | 4220 4207 <span class="c"># possible lengths and no sharing of bonds in paths traversed. By default, rings are</span> | 
|  | 4221 4208 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span> | 
|  | 4222 4209 <span class="c">#</span> | 
|  | 4223 <a name="GetAtomPaths-"></a>4210 <span class="k">sub </span><span class="m">GetAtomPaths</span> <span class="s">{</span> | 
|  | 4224 4211   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4225 4212 | 
|  | 4226 4213   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPaths</span><span class="s">(</span><span class="q">'AtomPathsWithAllLengths'</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4227 4214 <span class="s">}</span> | 
|  | 4228 4215 | 
|  | 4229 4216 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span> | 
|  | 4230 4217 <span class="c"># path atoms.</span> | 
|  | 4231 4218 <span class="c">#</span> | 
|  | 4232 <a name="_GetAtomPaths-"></a>4219 <span class="k">sub </span><span class="m">_GetAtomPaths</span> <span class="s">{</span> | 
|  | 4233 4220   <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="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4234 4221   <span class="k">my</span><span class="s">(</span><span class="i">$PathsRef</span><span class="cm">,</span> <span class="i">@AtomPaths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4235 4222 | 
|  | 4236 4223   <span class="i">@AtomPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4237 4224   <span class="c"># Collect appropriate atom paths...</span> | 
|  | 4238 4225   <span class="j">MODE:</span> <span class="s">{</span> | 
|  | 4239 4226     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AtomPathsWithLengthUpto$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$PathsRef</span> = <span class="i">$This</span><span class="i">->GetPathsWithLengthUpto</span><span class="s">(</span><span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4240 4227     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AtomPathsWithLength$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$PathsRef</span> = <span class="i">$This</span><span class="i">->GetPathsWithLength</span><span class="s">(</span><span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4241 4228     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AtomPathsWithAllLengths$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$PathsRef</span> = <span class="i">$This</span><span class="i">->GetPaths</span><span class="s">(</span><span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4242 4229 | 
|  | 4243 4230     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AllAtomPathsWithLengthUpto$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$PathsRef</span> = <span class="i">$This</span><span class="i">->GetAllPathsWithLengthUpto</span><span class="s">(</span><span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4244 4231     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AllAtomPathsWithLength$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$PathsRef</span> = <span class="i">$This</span><span class="i">->GetAllPathsWithLength</span><span class="s">(</span><span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4245 4232     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AllAtomPathsWithAllLengths$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$PathsRef</span> = <span class="i">$This</span><span class="i">->GetAllPaths</span><span class="s">(</span><span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4246 4233 | 
|  | 4247 4234     <span class="k">print</span> <span class="q">"Warn: ${ClassName}->_GetAtomPaths: No atom paths retrieved: Mode, $Mode, is not supported..."</span><span class="sc">;</span> | 
|  | 4248 4235     <span class="k">return</span> \<span class="i">@AtomPaths</span><span class="sc">;</span> | 
|  | 4249 4236   <span class="s">}</span> | 
|  | 4250 4237   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPathsFromPaths</span><span class="s">(</span><span class="i">$PathsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4251 4238 <span class="s">}</span> | 
|  | 4252 4239 | 
|  | 4253 4240 <span class="c"># Get atom paths as an array reference containing references to arrays with path atoms...</span> | 
|  | 4254 4241 <span class="c">#</span> | 
|  | 4255 <a name="_GetAtomPathsFromPaths-"></a>4242 <span class="k">sub </span><span class="m">_GetAtomPathsFromPaths</span> <span class="s">{</span> | 
|  | 4256 4243   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PathsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4257 4244   <span class="k">my</span><span class="s">(</span><span class="i">$Path</span><span class="cm">,</span> <span class="i">@AtomPaths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4258 4245 | 
|  | 4259 4246   <span class="i">@AtomPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4260 4247   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$PathsRef</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4261 4248     <span class="k">return</span> \<span class="i">@AtomPaths</span><span class="sc">;</span> | 
|  | 4262 4249   <span class="s">}</span> | 
|  | 4263 4250   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$PathsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4264 4251     <span class="c"># Return an empty atom paths list...</span> | 
|  | 4265 4252     <span class="k">return</span> \<span class="i">@AtomPaths</span><span class="sc">;</span> | 
|  | 4266 4253   <span class="s">}</span> | 
|  | 4267 4254   <span class="k">for</span> <span class="i">$Path</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PathsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4268 4255     <span class="k">my</span><span class="s">(</span><span class="i">@PathAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4269 4256     <span class="i">@PathAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4270 4257     <span class="i">@PathAtoms</span> = <span class="i">$This</span><span class="i">->_GetAtomPathFromPath</span><span class="s">(</span><span class="i">$Path</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4271 4258 | 
|  | 4272 4259     <span class="k">push</span> <span class="i">@AtomPaths</span><span class="cm">,</span> \<span class="i">@PathAtoms</span><span class="sc">;</span> | 
|  | 4273 4260   <span class="s">}</span> | 
|  | 4274 4261   <span class="k">return</span> \<span class="i">@AtomPaths</span><span class="sc">;</span> | 
|  | 4275 4262 <span class="s">}</span> | 
|  | 4276 4263 | 
|  | 4277 4264 <span class="c"># Generate an array of bond objects for an array of path atoms and return an array</span> | 
|  | 4278 4265 <span class="c"># of bond objects...</span> | 
|  | 4279 4266 <span class="c">#</span> | 
|  | 4280 <a name="GetAtomPathBonds-"></a>4267 <span class="k">sub </span><span class="m">GetAtomPathBonds</span> <span class="s">{</span> | 
|  | 4281 4268   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@PathAtoms</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4282 4269   <span class="k">my</span><span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4283 4270 | 
|  | 4284 4271   <span class="k">if</span> <span class="s">(</span>!<span class="i">@PathAtoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4285 4272     <span class="c"># Return an empty ring bonds list...</span> | 
|  | 4286 4273     <span class="k">return</span> <span class="i">@Bonds</span><span class="sc">;</span> | 
|  | 4287 4274   <span class="s">}</span> | 
|  | 4288 4275   <span class="k">my</span><span class="s">(</span><span class="i">@PathAtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4289 4276 | 
|  | 4290 4277   <span class="i">@PathAtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4291 4278   <span class="i">@PathAtomIDs</span> = <span class="i">$This</span><span class="i">->_GetAtomsIDsFromAtoms</span><span class="s">(</span><span class="i">@PathAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4292 4279 | 
|  | 4293 4280   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPathBonds</span><span class="s">(</span><span class="i">@PathAtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4294 4281 <span class="s">}</span> | 
|  | 4295 4282 | 
|  | 4296 4283 <span class="c"># Map atom IDs in path to atoms and return a reference to an array containing ring atoms...</span> | 
|  | 4297 4284 <span class="c">#</span> | 
|  | 4298 <a name="_GetAtomPathFromPath-"></a>4285 <span class="k">sub </span><span class="m">_GetAtomPathFromPath</span> <span class="s">{</span> | 
|  | 4299 4286   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Path</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4300 4287   <span class="k">my</span><span class="s">(</span><span class="i">@PathAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4301 4288 | 
|  | 4302 4289   <span class="i">@PathAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4303 4290   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Path</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4304 4291     <span class="c"># Return an empty atoms list...</span> | 
|  | 4305 4292     <span class="k">return</span> <span class="i">@PathAtoms</span><span class="sc">;</span> | 
|  | 4306 4293   <span class="s">}</span> | 
|  | 4307 4294 | 
|  | 4308 4295   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPathAtoms</span><span class="s">(</span><span class="i">$Path</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4309 4296 <span class="s">}</span> | 
|  | 4310 4297 | 
|  | 4311 4298 <span class="c"># Get atom paths between two specified atoms as a reference to an array containing references</span> | 
|  | 4312 4299 <span class="c"># to arrays with path atoms. For molecules with rings, atom paths array contains may contain</span> | 
|  | 4313 4300 <span class="c"># two paths.</span> | 
|  | 4314 4301 <span class="c">#</span> | 
|  | 4315 <a name="GetAtomPathsBetween-"></a>4302 <span class="k">sub </span><span class="m">GetAtomPathsBetween</span> <span class="s">{</span> | 
|  | 4316 4303   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$EndAtom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4317 4304   <span class="k">my</span><span class="s">(</span><span class="i">@AtomPaths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4318 4305 | 
|  | 4319 4306   <span class="i">@AtomPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4320 4307   <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">$StartAtom</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$StartAtom</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4321 4308     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetAtomPathsBetween: No atom paths retrieved: Start atom is not defined  or it doesn't exist..."</span><span class="sc">;</span> | 
|  | 4322 4309     <span class="k">return</span> <span class="i">@AtomPaths</span><span class="sc">;</span> | 
|  | 4323 4310   <span class="s">}</span> | 
|  | 4324 4311   <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">$EndAtom</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$EndAtom</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4325 4312     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetAtomPathsBetween: No atom paths retrieved: End atom is not defined  or it doesn't exist..."</span><span class="sc">;</span> | 
|  | 4326 4313     <span class="k">return</span> <span class="i">@AtomPaths</span><span class="sc">;</span> | 
|  | 4327 4314   <span class="s">}</span> | 
|  | 4328 4315   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPathsBetween</span><span class="s">(</span><span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$EndAtom</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4329 4316 <span class="s">}</span> | 
|  | 4330 4317 | 
|  | 4331 4318 <span class="c"># Get atom paths between two specified atoms as a reference to an array containing references</span> | 
|  | 4332 4319 <span class="c"># to arrays with path atoms.</span> | 
|  | 4333 4320 <span class="c">#</span> | 
|  | 4334 <a name="_GetAtomPathsBetween-"></a>4321 <span class="k">sub </span><span class="m">_GetAtomPathsBetween</span> <span class="s">{</span> | 
|  | 4335 4322   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$EndAtom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4336 4323   <span class="k">my</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">$EndAtomID</span><span class="cm">,</span> <span class="i">@Paths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4337 4324 | 
|  | 4338 4325   <span class="i">$StartAtomID</span> = <span class="i">$StartAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4339 4326   <span class="i">$EndAtomID</span> = <span class="i">$EndAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4340 4327 | 
|  | 4341 4328   <span class="i">@Paths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4342 4329   <span class="i">@Paths</span> = <span class="i">$This</span><span class="i">->GetPathsBetween</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">$EndAtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4343 4330 | 
|  | 4344 4331   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomPathsFromPaths</span><span class="s">(</span>\<span class="i">@Paths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4345 4332 <span class="s">}</span> | 
|  | 4346 4333 | 
|  | 4347 4334 <span class="c"># Get atom neighborhoods around a specified atom as an array containing references</span> | 
|  | 4348 4335 <span class="c"># to arrays with neighborhood atoms at different radii upto specified radius...</span> | 
|  | 4349 4336 <span class="c">#</span> | 
|  | 4350 <a name="GetAtomNeighborhoodsWithRadiusUpto-"></a>4337 <span class="k">sub </span><span class="m">GetAtomNeighborhoodsWithRadiusUpto</span> <span class="s">{</span> | 
|  | 4351 4338   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4352 4339 | 
|  | 4353 4340   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomNeighborhoods</span><span class="s">(</span><span class="q">'RadiusUpto'</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4354 4341 <span class="s">}</span> | 
|  | 4355 4342 | 
|  | 4356 4343 <span class="c"># Get atom neighborhoods around a specified atom as an array containing references</span> | 
|  | 4357 4344 <span class="c"># to arrays with neighborhood atoms at possible radii...</span> | 
|  | 4358 4345 <span class="c">#</span> | 
|  | 4359 <a name="GetAtomNeighborhoods-"></a>4346 <span class="k">sub </span><span class="m">GetAtomNeighborhoods</span> <span class="s">{</span> | 
|  | 4360 4347   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4361 4348 | 
|  | 4362 4349   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomNeighborhoods</span><span class="s">(</span><span class="q">'AllRadii'</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="k">undef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4363 4350 <span class="s">}</span> | 
|  | 4364 4351 | 
|  | 4365 4352 <span class="c"># Get atom neighborhood around a specified atom, along with their successor connected atoms, collected</span> | 
|  | 4366 4353 <span class="c"># with in a specified radius as a list containing references to lists with first value corresponding to neighborhood</span> | 
|  | 4367 4354 <span class="c"># atom at a specific radius and second value as reference to a list containing its successor connected atoms.</span> | 
|  | 4368 4355 <span class="c">#</span> | 
|  | 4369 4356 <span class="c"># For a neighborhood atom at each radius level, the successor connected atoms correspond to the</span> | 
|  | 4370 4357 <span class="c"># neighborhood atoms at the next radius level. Consequently, the neighborhood atoms at the last</span> | 
|  | 4371 4358 <span class="c"># radius level don't contain any successor atoms which fall outside the range of specified radius.</span> | 
|  | 4372 4359 <span class="c">#</span> | 
|  | 4373 <a name="GetAtomNeighborhoodsWithSuccessorAtomsAndRadiusUpto-"></a>4360 <span class="k">sub </span><span class="m">GetAtomNeighborhoodsWithSuccessorAtomsAndRadiusUpto</span> <span class="s">{</span> | 
|  | 4374 4361   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4375 4362 | 
|  | 4376 4363   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomNeighborhoods</span><span class="s">(</span><span class="q">'WithSuccessorsAndRadiusUpto'</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4377 4364 <span class="s">}</span> | 
|  | 4378 4365 | 
|  | 4379 4366 <span class="c"># Get atom neighborhood around a specified atom, along with their successor connected atoms, collected</span> | 
|  | 4380 4367 <span class="c"># at all radii as a list containing references to lists with first value corresponding to neighborhood</span> | 
|  | 4381 4368 <span class="c"># atom at a specific radius and second value as reference to a list containing its successor connected atoms.</span> | 
|  | 4382 4369 <span class="c">#</span> | 
|  | 4383 4370 <span class="c"># For a neighborhood atom at each radius level, the successor connected atoms correspond to the</span> | 
|  | 4384 4371 <span class="c"># neighborhood atoms at the next radius level. Consequently, the neighborhood atoms at the last</span> | 
|  | 4385 4372 <span class="c"># radius level don't contain any successor atoms which fall outside the range of specified radius.</span> | 
|  | 4386 4373 <span class="c">#</span> | 
|  | 4387 4374 <span class="c">#</span> | 
|  | 4388 <a name="GetAtomNeighborhoodsWithSuccessorAtoms-"></a>4375 <span class="k">sub </span><span class="m">GetAtomNeighborhoodsWithSuccessorAtoms</span> <span class="s">{</span> | 
|  | 4389 4376   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4390 4377 | 
|  | 4391 4378   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetAtomNeighborhoods</span><span class="s">(</span><span class="q">'WithSuccessorsAndAllRadii'</span><span class="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="k">undef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4392 4379 <span class="s">}</span> | 
|  | 4393 4380 | 
|  | 4394 4381 <span class="c"># Get atom neighborhoods...</span> | 
|  | 4395 4382 <span class="c">#</span> | 
|  | 4396 <a name="_GetAtomNeighborhoods-"></a>4383 <span class="k">sub </span><span class="m">_GetAtomNeighborhoods</span> <span class="s">{</span> | 
|  | 4397 4384   <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="cm">,</span> <span class="i">$StartAtom</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4398 4385   <span class="k">my</span><span class="s">(</span><span class="i">@AtomNeighborhoods</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4399 4386 | 
|  | 4400 4387   <span class="i">@AtomNeighborhoods</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4401 4388 | 
|  | 4402 4389   <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">$StartAtom</span><span class="s">)</span> && <span class="i">$This</span><span class="i">->HasAtom</span><span class="s">(</span><span class="i">$StartAtom</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4403 4390     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetAtomNeighborhoods: No atom neighborhoods retrieved: Start atom is not defined  or it doesn't exist..."</span><span class="sc">;</span> | 
|  | 4404 4391     <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span> | 
|  | 4405 4392   <span class="s">}</span> | 
|  | 4406 4393   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^(RadiusUpto|WithSuccessorsAndRadiusUpto)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4407 4394     <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">$Radius</span><span class="s">)</span> && <span class="i">$Radius</span> > <span class="n">0</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4408 4395       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetAtomNeighborhoods: No atom neighborhoods retrieved: Radius is not defined or it's <= 0 ..."</span><span class="sc">;</span> | 
|  | 4409 4396       <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span> | 
|  | 4410 4397     <span class="s">}</span> | 
|  | 4411 4398   <span class="s">}</span> | 
|  | 4412 4399 | 
|  | 4413 4400   <span class="c"># Collect neighborhood atom IDs...</span> | 
|  | 4414 4401   <span class="k">my</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">@NeighborhoodAtomIDs</span><span class="cm">,</span> <span class="i">@NeighborhoodAtomIDsWithSuccessors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4415 4402 | 
|  | 4416 4403   <span class="i">@NeighborhoodAtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@NeighborhoodAtomIDsWithSuccessors</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4417 4404   <span class="i">$StartAtomID</span> = <span class="i">$StartAtom</span><span class="i">->GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4418 4405 | 
|  | 4419 4406   <span class="j">MODE:</span> <span class="s">{</span> | 
|  | 4420 4407     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^RadiusUpto$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@NeighborhoodAtomIDs</span> = <span class="i">$This</span><span class="i">->GetNeighborhoodVerticesWithRadiusUpto</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4421 4408     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AllRadii$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@NeighborhoodAtomIDs</span> = <span class="i">$This</span><span class="i">->GetNeighborhoodVertices</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4422 4409 | 
|  | 4423 4410     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^WithSuccessorsAndRadiusUpto$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@NeighborhoodAtomIDsWithSuccessors</span> = <span class="i">$This</span><span class="i">->GetNeighborhoodVerticesWithSuccessorsAndRadiusUpto</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4424 4411     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^WithSuccessorsAndAllRadii$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@NeighborhoodAtomIDsWithSuccessors</span> = <span class="i">$This</span><span class="i">->GetNeighborhoodVerticesWithSuccessors</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 4425 4412 | 
|  | 4426 4413     <span class="k">print</span> <span class="q">"Warn: ${ClassName}->_GetAtomNeighborhood: No atom neighborhoods retrieved: Mode, $Mode, is not supported..."</span><span class="sc">;</span> | 
|  | 4427 4414     <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span> | 
|  | 4428 4415   <span class="s">}</span> | 
|  | 4429 4416   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^(RadiusUpto|AllRadii)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4430 4417     <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNeighborhoodAtomsFromAtomIDs</span><span class="s">(</span>\<span class="i">@NeighborhoodAtomIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4431 4418   <span class="s">}</span> | 
|  | 4432 4419   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^(WithSuccessorsAndRadiusUpto|WithSuccessorsAndAllRadii)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4433 4420     <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNeighborhoodAtomsWithSuccessorsFromAtomIDs</span><span class="s">(</span>\<span class="i">@NeighborhoodAtomIDsWithSuccessors</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4434 4421   <span class="s">}</span> | 
|  | 4435 4422 | 
|  | 4436 4423   <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span> | 
|  | 4437 4424 <span class="s">}</span> | 
|  | 4438 4425 | 
|  | 4439 4426 <span class="c"># Map neighborhood atom IDs to atoms...</span> | 
|  | 4440 4427 <span class="c">#</span> | 
|  | 4441 <a name="_GetNeighborhoodAtomsFromAtomIDs-"></a>4428 <span class="k">sub </span><span class="m">_GetNeighborhoodAtomsFromAtomIDs</span> <span class="s">{</span> | 
|  | 4442 4429   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NeighborhoodsAtomIDsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4443 4430   <span class="k">my</span><span class="s">(</span><span class="i">$NeighborhoodAtomIDsRef</span><span class="cm">,</span> <span class="i">@AtomNeighborhoods</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4444 4431 | 
|  | 4445 4432   <span class="i">@AtomNeighborhoods</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4446 4433   <span class="k">for</span> <span class="i">$NeighborhoodAtomIDsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$NeighborhoodsAtomIDsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4447 4434     <span class="k">my</span><span class="s">(</span><span class="i">@AtomNeighborhood</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4448 4435 | 
|  | 4449 4436     <span class="i">@AtomNeighborhood</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4450 4437     <span class="i">@AtomNeighborhood</span> = <span class="i">$This</span><span class="i">->_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@</span>{<span class="i">$NeighborhoodAtomIDsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 4451 4438     <span class="k">push</span> <span class="i">@AtomNeighborhoods</span><span class="cm">,</span> \<span class="i">@AtomNeighborhood</span><span class="sc">;</span> | 
|  | 4452 4439   <span class="s">}</span> | 
|  | 4453 4440   <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span> | 
|  | 4454 4441 <span class="s">}</span> | 
|  | 4455 4442 | 
|  | 4456 4443 <span class="c"># Map neighborhood atom IDs with successors to atoms...</span> | 
|  | 4457 4444 <span class="c">#</span> | 
|  | 4458 <a name="_GetNeighborhoodAtomsWithSuccessorsFromAtomIDs-"></a>4445 <span class="k">sub </span><span class="m">_GetNeighborhoodAtomsWithSuccessorsFromAtomIDs</span> <span class="s">{</span> | 
|  | 4459 4446   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NeighborhoodsAtomIDsWithSuccessorsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4460 4447   <span class="k">my</span><span class="s">(</span><span class="i">$Depth</span><span class="cm">,</span> <span class="i">$NeighborhoodAtomIDsWithSuccessorsRef</span><span class="cm">,</span> <span class="i">$NeighborhoodAtomIDWithSuccessorsRef</span><span class="cm">,</span> <span class="i">$NeighborhoodAtomID</span><span class="cm">,</span> <span class="i">$NeighborhoodAtomSuccessorsIDsRef</span><span class="cm">,</span> <span class="i">@AtomNeighborhoods</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4461 4448 | 
|  | 4462 4449   <span class="i">$Depth</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 4463 4450   <span class="i">@AtomNeighborhoods</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4464 4451 | 
|  | 4465 4452   <span class="c"># Go over neighborhoods at each level...</span> | 
|  | 4466 4453   <span class="k">for</span> <span class="i">$NeighborhoodAtomIDsWithSuccessorsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$NeighborhoodsAtomIDsWithSuccessorsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4467 4454     <span class="i">@</span>{<span class="i">$AtomNeighborhoods</span>[<span class="i">$Depth</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4468 4455 | 
|  | 4469 4456     <span class="c"># Go over the neighborhood atoms and their successors at a specific level..</span> | 
|  | 4470 4457     <span class="k">for</span> <span class="i">$NeighborhoodAtomIDWithSuccessorsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$NeighborhoodAtomIDsWithSuccessorsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4471 4458       <span class="k">my</span><span class="s">(</span><span class="i">$NeighborhoodAtom</span><span class="cm">,</span> <span class="i">@NeighborhoodAtomWithSuccessors</span><span class="cm">,</span> <span class="i">@NeighborhoodAtomSuccessorAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4472 4459 | 
|  | 4473 4460       <span class="i">@NeighborhoodAtomWithSuccessors</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@NeighborhoodAtomSuccessorAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4474 4461       <span class="s">(</span><span class="i">$NeighborhoodAtomID</span><span class="cm">,</span> <span class="i">$NeighborhoodAtomSuccessorsIDsRef</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$NeighborhoodAtomIDWithSuccessorsRef</span>}<span class="sc">;</span> | 
|  | 4475 4462 | 
|  | 4476 4463       <span class="c"># Map atom IDs to atoms...</span> | 
|  | 4477 4464       <span class="i">$NeighborhoodAtom</span> = <span class="i">$This</span><span class="i">->_GetAtomFromAtomID</span><span class="s">(</span><span class="i">$NeighborhoodAtomID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4478 4465       <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$NeighborhoodAtomSuccessorsIDsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4479 4466         <span class="i">@NeighborhoodAtomSuccessorAtoms</span> = <span class="i">$This</span><span class="i">->_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@</span>{<span class="i">$NeighborhoodAtomSuccessorsIDsRef</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 4480 4467       <span class="s">}</span> | 
|  | 4481 4468 | 
|  | 4482 4469       <span class="c"># Store an atom and its successors at each level in an array...</span> | 
|  | 4483 4470       <span class="k">push</span> <span class="i">@NeighborhoodAtomWithSuccessors</span><span class="cm">,</span> <span class="s">(</span><span class="i">$NeighborhoodAtom</span><span class="cm">,</span> \<span class="i">@NeighborhoodAtomSuccessorAtoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4484 4471 | 
|  | 4485 4472       <span class="k">push</span> <span class="i">@</span>{<span class="i">$AtomNeighborhoods</span>[<span class="i">$Depth</span>]} <span class="cm">,</span> \<span class="i">@NeighborhoodAtomWithSuccessors</span><span class="sc">;</span> | 
|  | 4486 4473     <span class="s">}</span> | 
|  | 4487 4474       <span class="i">$Depth</span>++<span class="sc">;</span> | 
|  | 4488 4475   <span class="s">}</span> | 
|  | 4489 4476   <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span> | 
|  | 4490 4477 <span class="s">}</span> | 
|  | 4491 4478 | 
|  | 4492 4479 <span class="c"># Get next object ID...</span> | 
|  | 4493 <a name="_GetNewObjectID-"></a>4480 <span class="k">sub </span><span class="m">_GetNewObjectID</span> <span class="s">{</span> | 
|  | 4494 4481   <span class="i">$ObjectID</span>++<span class="sc">;</span> | 
|  | 4495 4482   <span class="k">return</span> <span class="i">$ObjectID</span><span class="sc">;</span> | 
|  | 4496 4483 <span class="s">}</span> | 
|  | 4497 4484 | 
|  | 4498 4485 <span class="c"># Is aromatic property set for the molecule?</span> | 
|  | 4499 <a name="IsAromatic-"></a>4486 <span class="k">sub </span><span class="m">IsAromatic</span> <span class="s">{</span> | 
|  | 4500 4487   <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> | 
|  | 4501 4488   <span class="k">my</span><span class="s">(</span><span class="i">$Aromatic</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4502 4489 | 
|  | 4503 4490   <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> | 
|  | 4504 4491 | 
|  | 4505 4492   <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> | 
|  | 4506 4493 <span class="s">}</span> | 
|  | 4507 4494 | 
|  | 4508 4495 <span class="c"># Does molecule contains any atoms with non-zero Z coordiantes?</span> | 
|  | 4509 <a name="IsThreeDimensional-"></a>4496 <span class="k">sub </span><span class="m">IsThreeDimensional</span> <span class="s">{</span> | 
|  | 4510 4497   <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> | 
|  | 4511 4498   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4512 4499 | 
|  | 4513 4500   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4514 4501   <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4515 4502       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">->GetZ</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4516 4503         <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 4517 4504       <span class="s">}</span> | 
|  | 4518 4505   <span class="s">}</span> | 
|  | 4519 4506   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 4520 4507 <span class="s">}</span> | 
|  | 4521 4508 | 
|  | 4522 4509 <span class="c"># Does molecule contains any atoms with non-zero X or Y coordinates</span> | 
|  | 4523 4510 <span class="c"># and only zero Z-coordinates?</span> | 
|  | 4524 <a name="IsTwoDimensional-"></a>4511 <span class="k">sub </span><span class="m">IsTwoDimensional</span> <span class="s">{</span> | 
|  | 4525 4512   <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> | 
|  | 4526 4513   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4527 4514 | 
|  | 4528 4515   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4529 4516   <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4530 4517       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">->GetZ</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4531 4518         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 4532 4519       <span class="s">}</span> | 
|  | 4533 4520       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">->GetX</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span> || <span class="i">$Atom</span><span class="i">->GetY</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4534 4521         <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 4535 4522       <span class="s">}</span> | 
|  | 4536 4523   <span class="s">}</span> | 
|  | 4537 4524   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 4538 4525 <span class="s">}</span> | 
|  | 4539 4526 | 
|  | 4540 4527 <span class="c"># Get dimensionality of the molecule using one of the following two methods:</span> | 
|  | 4541 4528 <span class="c">#   . Using explicitly set Dimensionality</span> | 
|  | 4542 4529 <span class="c">#   . Going over atomic coordinates</span> | 
|  | 4543 4530 <span class="c">#</span> | 
|  | 4544 4531 <span class="c"># The valid dimensionality values are:</span> | 
|  | 4545 4532 <span class="c">#   . 3D - Three dimensional: One of X, Y or Z coordinate is non-zero</span> | 
|  | 4546 4533 <span class="c">#   . 2D - Two dimensional: One of X or Y coordinate is non-zero; All Z coordinates are zero</span> | 
|  | 4547 4534 <span class="c">#   . 0D - Zero dimensional: All atomic coordinates are zero</span> | 
|  | 4548 4535 <span class="c">#</span> | 
|  | 4549 <a name="GetDimensionality-"></a>4536 <span class="k">sub </span><span class="m">GetDimensionality</span> <span class="s">{</span> | 
|  | 4550 4537   <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> | 
|  | 4551 4538 | 
|  | 4552 4539   <span class="c"># Is Dimensionality property explicitly set?</span> | 
|  | 4553 4540   <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">'Dimensionality'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4554 4541     <span class="k">return</span> <span class="i">$This</span><span class="i">->GetProperty</span><span class="s">(</span><span class="q">'Dimensionality'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4555 4542   <span class="s">}</span> | 
|  | 4556 4543   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="cm">,</span> <span class="i">@Atoms</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4557 4544 | 
|  | 4558 4545   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">->GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4559 4546   <span class="j">ATOM:</span> <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4560 4547       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">->GetZ</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4561 4548         <span class="k">return</span> <span class="q">'3D'</span><span class="sc">;</span> | 
|  | 4562 4549       <span class="s">}</span> | 
|  | 4563 4550       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">->GetX</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span> || <span class="i">$Atom</span><span class="i">->GetY</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4564 4551         <span class="k">return</span> <span class="q">'2D'</span><span class="sc">;</span> | 
|  | 4565 4552       <span class="s">}</span> | 
|  | 4566 4553   <span class="s">}</span> | 
|  | 4567 4554   <span class="k">return</span> <span class="q">'0D'</span><span class="sc">;</span> | 
|  | 4568 4555 <span class="s">}</span> | 
|  | 4569 4556 | 
|  | 4570 4557 <span class="c"># Is it a molecule object?</span> | 
|  | 4571 <a name="IsMolecule-"></a>4558 <span class="k">sub </span><span class="m">IsMolecule ($)</span> <span class="s">{</span> | 
|  | 4572 4559   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4573 4560 | 
|  | 4574 4561   <span class="k">return</span> <span class="i">_IsMolecule</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4575 4562 <span class="s">}</span> | 
|  | 4576 4563 | 
|  | 4577 4564 <span class="c"># Return a string containing vertices, edges and other properties...</span> | 
|  | 4578 <a name="StringifyMolecule-"></a>4565 <span class="k">sub </span><span class="m">StringifyMolecule</span> <span class="s">{</span> | 
|  | 4579 4566   <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> | 
|  | 4580 4567   <span class="k">my</span><span class="s">(</span><span class="i">$MoleculeString</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">$NumOfAtoms</span><span class="cm">,</span> <span class="i">$NumOfBonds</span><span class="cm">,</span> <span class="i">$MolecularFormula</span><span class="cm">,</span> <span class="i">$NumOfRings</span><span class="cm">,</span> <span class="i">$MolecularWeight</span><span class="cm">,</span> <span class="i">$ExactMass</span><span class="cm">,</span> <span class="i">$FormalCharge</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">$Charge</span><span class="cm">,</span> <span class="i">$ElementsRef</span><span class="cm">,</span> <span class="i">$ElementsCompositionRef</span><span class="cm">,</span> <span class="i">$ElementalComposition</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4581 4568 | 
|  | 4582 4569   <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> | 
|  | 4583 4570   <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> | 
|  | 4584 4571   <span class="i">$NumOfAtoms</span> = <span class="i">$This</span><span class="i">->GetNumOfAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4585 4572   <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> | 
|  | 4586 4573 | 
|  | 4587 4574   <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> | 
|  | 4588 4575   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$NumOfRings</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4589 4576     <span class="i">$NumOfRings</span> = <span class="q">'undefined'</span><span class="sc">;</span> | 
|  | 4590 4577   <span class="s">}</span> | 
|  | 4591 4578 | 
|  | 4592 4579   <span class="i">$MolecularFormula</span> = <span class="i">$This</span><span class="i">->GetMolecularFormula</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4593 4580 | 
|  | 4594 4581   <span class="i">$MolecularWeight</span> = <span class="i">$This</span><span class="i">->GetMolecularWeight</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4595 4582   <span class="i">$MolecularWeight</span> = <span class="i">round</span><span class="s">(</span><span class="i">$MolecularWeight</span><span class="cm">,</span> <span class="n">4</span><span class="s">)</span> + <span class="n">0</span><span class="sc">;</span> | 
|  | 4596 4583 | 
|  | 4597 4584   <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> | 
|  | 4598 4585   <span class="i">$ExactMass</span> = <span class="i">round</span><span class="s">(</span><span class="i">$ExactMass</span><span class="cm">,</span> <span class="n">4</span><span class="s">)</span> + <span class="n">0</span><span class="sc">;</span> | 
|  | 4599 4586 | 
|  | 4600 4587   <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> | 
|  | 4601 4588   <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> | 
|  | 4602 4589 | 
|  | 4603 4590   <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> | 
|  | 4604 4591   <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> | 
|  | 4605 4592 | 
|  | 4606 4593   <span class="s">(</span><span class="i">$ElementsRef</span><span class="cm">,</span> <span class="i">$ElementsCompositionRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">->GetElementalComposition</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4607 4594   <span class="i">$ElementalComposition</span> = <span class="q">'None'</span><span class="sc">;</span> | 
|  | 4608 4595   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$ElementsRef</span><span class="s">)</span> && <span class="i">@</span>{<span class="i">$ElementsRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4609 4596     <span class="i">$ElementalComposition</span> = <span class="q">"[ "</span> . <span class="i">FormatElementalCompositionInformation</span><span class="s">(</span><span class="i">$ElementsRef</span><span class="cm">,</span> <span class="i">$ElementsCompositionRef</span><span class="s">)</span> . <span class="q">" ]"</span><span class="sc">;</span> | 
|  | 4610 4597   <span class="s">}</span> | 
|  | 4611 4598 | 
|  | 4612 4599   <span class="i">$MoleculeString</span> = <span class="q">"Molecule: ID: $ID; Name: \"$Name\"; NumOfAtoms: $NumOfAtoms; NumOfBonds: $NumOfBonds; NumOfRings: $NumOfRings; MolecularFormula: $MolecularFormula; MolecularWeight: $MolecularWeight; ExactMass: $ExactMass; FormalCharge: $FormalCharge; Charge: $Charge; SpinMultiplicity: $SpinMultiplicity; FreeRadicalElectrons: $FreeRadicalElectrons; ElementalComposition: $ElementalComposition"</span><span class="sc">;</span> | 
|  | 4613 4600 | 
|  | 4614 4601   <span class="k">return</span> <span class="i">$MoleculeString</span><span class="sc">;</span> | 
|  | 4615 4602 <span class="s">}</span> | 
|  | 4616 4603 | 
|  | 4617 4604 <span class="c"># Load appropriate atom data files from <MayaChemTools>/lib directory used by various</span> | 
|  | 4618 4605 <span class="c"># object methods in the current class...</span> | 
|  | 4619 4606 <span class="c">#</span> | 
|  | 4620 <a name="_LoadMoleculeClassData-"></a>4607 <span class="k">sub </span><span class="m">_LoadMoleculeClassData</span> <span class="s">{</span> | 
|  | 4621 4608   <span class="k">my</span><span class="s">(</span><span class="i">$MayaChemToolsLibDir</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4622 4609 | 
|  | 4623 4610   <span class="i">$MayaChemToolsLibDir</span> = <span class="i">GetMayaChemToolsLibDirName</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4624 4611 | 
|  | 4625 4612   <span class="c"># Load and process data for aromaticity models...</span> | 
|  | 4626 4613   <span class="i">_LoadAromaticityModelsData</span><span class="s">(</span><span class="i">$MayaChemToolsLibDir</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4627 4614   <span class="i">_ProcessAromaticityModelsData</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4628 4615 <span class="s">}</span> | 
|  | 4629 4616 | 
|  | 4630 4617 <span class="c">#</span> | 
|  | 4631 4618 <span class="c"># Load data for supported aromaticity models...</span> | 
|  | 4632 4619 <span class="c">#</span> | 
|  | 4633 <a name="_LoadAromaticityModelsData-"></a>4620 <span class="k">sub </span><span class="m">_LoadAromaticityModelsData</span> <span class="s">{</span> | 
|  | 4634 4621   <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> | 
|  | 4635 4622   <span class="k">my</span><span class="s">(</span><span class="i">$DataFile</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</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">$ParameterName</span><span class="cm">,</span> <span class="i">$ParameterValue</span><span class="cm">,</span> <span class="i">$ModelName</span><span class="cm">,</span> <span class="i">@ColLabels</span><span class="cm">,</span> <span class="i">@LineWords</span><span class="cm">,</span> <span class="i">%ParameterNames</span><span class="cm">,</span> <span class="i">%ColIndexToModelName</span><span class="cm">,</span> <span class="i">%SupportedParameterNames</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4636 4623 | 
|  | 4637 4624   <span class="i">%AromaticityModelsDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4638 4625   <span class="i">%CanonicalAromaticityModelNamesMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4639 4626 | 
|  | 4640 4627   <span class="c"># File format:</span> | 
|  | 4641 4628   <span class="c">#</span> | 
|  | 4642 4629   <span class="c"># "ParameterName","MDLAromaticityModel","TriposAromaticityModel","MMFFAromaticityModel","ChemAxonBasicAromaticityModel","ChemAxonGeneralAromaticityModel","DaylightAromaticityModel","MayaChemToolsAromaticityModel"</span> | 
|  | 4643 4630   <span class="c"># "AllowHeteroRingAtoms","No","No","Yes","Yes","Yes","Yes","Yes"</span> | 
|  | 4644 4631   <span class="c">#</span> | 
|  | 4645 4632   <span class="i">$DataFile</span> = <span class="i">$MayaChemToolsLibDir</span> . <span class="q">"/data/AromaticityModelsData.csv"</span><span class="sc">;</span> | 
|  | 4646 4633   <span class="k">if</span> <span class="s">(</span>! <span class="k">-e</span> <span class="q">"$DataFile"</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4647 4634     <span class="w">croak</span> <span class="q">"Error: ${ClassName}::_LoadAromaticityModelsData: MayaChemTools package file, $DataFile, is missing: Possible installation problems..."</span><span class="sc">;</span> | 
|  | 4648 4635   <span class="s">}</span> | 
|  | 4649 4636 | 
|  | 4650 4637   <span class="c"># Setup a list of currently supported aromaticity parameters...</span> | 
|  | 4651 4638   <span class="c">#</span> | 
|  | 4652 4639   <span class="k">my</span><span class="s">(</span><span class="i">@KnownNames</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4653 4640   <span class="i">@KnownNames</span> = <span class="q">qw(AllowHeteroRingAtoms HeteroRingAtomsList AllowExocyclicDoubleBonds AllowHomoNuclearExocyclicDoubleBonds AllowElectronegativeRingAtomExocyclicDoubleBonds AllowRingAtomFormalCharge AllowHeteroRingAtomFormalCharge MinimumRingSize)</span><span class="sc">;</span> | 
|  | 4654 4641 | 
|  | 4655 4642   <span class="i">%SupportedParameterNames</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4656 4643   <span class="k">for</span> <span class="i">$ParameterName</span> <span class="s">(</span><span class="i">@KnownNames</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4657 4644     <span class="i">$SupportedParameterNames</span>{<span class="i">$ParameterName</span>} = <span class="i">$ParameterName</span><span class="sc">;</span> | 
|  | 4658 4645   <span class="s">}</span> | 
|  | 4659 4646 | 
|  | 4660 4647   <span class="i">$InDelim</span> = <span class="q">"\,"</span><span class="sc">;</span> | 
|  | 4661 4648   <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> | 
|  | 4662 4649 | 
|  | 4663 4650   <span class="c"># Skip lines up to column labels...</span> | 
|  | 4664 4651   <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> | 
|  | 4665 4652     <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> | 
|  | 4666 4653       <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 4667 4654     <span class="s">}</span> | 
|  | 4668 4655   <span class="s">}</span> | 
|  | 4669 4656   <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> | 
|  | 4670 4657   <span class="i">$NumOfCols</span> = <span class="i">@ColLabels</span><span class="sc">;</span> | 
|  | 4671 4658 | 
|  | 4672 4659   <span class="i">%ColIndexToModelName</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4673 4660 | 
|  | 4674 4661   <span class="c"># Process names of aromaticity models...</span> | 
|  | 4675 4662   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#ColLabels</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4676 4663     <span class="i">$ModelName</span> = <span class="i">$ColLabels</span>[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 4677 4664     <span class="i">$ModelName</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 4678 4665 | 
|  | 4679 4666     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$AromaticityModelsDataMap</span>{<span class="i">$ModelName</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4680 4667       <span class="w">croak</span> <span class="q">"Error: ${ClassName}::_LoadAromaticityModelsData: The aromaticity model name, $ModelName, in $DataFile has already exists.\nLine: $Line..."</span><span class="sc">;</span> | 
|  | 4681 4668     <span class="s">}</span> | 
|  | 4682 4669     <span class="i">%</span>{<span class="i">$AromaticityModelsDataMap</span>{<span class="i">$ModelName</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4683 4670 | 
|  | 4684 4671     <span class="c"># Cannonicalize aromatic model name by converting into all lowercase...</span> | 
|  | 4685 4672     <span class="i">$CanonicalAromaticityModelNamesMap</span>{<span class="k">lc</span><span class="s">(</span><span class="i">$ModelName</span><span class="s">)</span>} = <span class="i">$ModelName</span><span class="sc">;</span> | 
|  | 4686 4673 | 
|  | 4687 4674     <span class="i">$ColIndexToModelName</span>{<span class="i">$Index</span>} = <span class="i">$ModelName</span><span class="sc">;</span> | 
|  | 4688 4675   <span class="s">}</span> | 
|  | 4689 4676 | 
|  | 4690 4677   <span class="c"># Process paramater name and their values for specified aromaticity models...</span> | 
|  | 4691 4678   <span class="c">#</span> | 
|  | 4692 4679   <span class="i">%ParameterNames</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4693 4680   <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> | 
|  | 4694 4681     <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> | 
|  | 4695 4682       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 4696 4683     <span class="s">}</span> | 
|  | 4697 4684     <span class="i">@LineWords</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4698 4685     <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> | 
|  | 4699 4686     <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> | 
|  | 4700 4687       <span class="w">croak</span> <span class="q">"Error: ${ClassName}::_LoadAromaticityModelsData: The number of data fields, @LineWords, in $DataFile must be $NumOfCols.\nLine: $Line..."</span><span class="sc">;</span> | 
|  | 4701 4688     <span class="s">}</span> | 
|  | 4702 4689 | 
|  | 4703 4690     <span class="c"># Process parameter name and values for aromaticity models...</span> | 
|  | 4704 4691     <span class="c">#</span> | 
|  | 4705 4692     <span class="i">$ParameterName</span> = <span class="i">$LineWords</span>[<span class="n">0</span>]<span class="sc">;</span> | 
|  | 4706 4693 | 
|  | 4707 4694     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$SupportedParameterNames</span>{<span class="i">$ParameterName</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4708 4695       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}::_LoadAromaticityModelsData: The current release of MayaChemTools doesn't support aromaticity model parameter name, $ParameterName, specified in $DataFile. It would be ignore during aromaticity detection.\nLine: $Line..."</span><span class="sc">;</span> | 
|  | 4709 4696     <span class="s">}</span> | 
|  | 4710 4697 | 
|  | 4711 4698     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ParameterNames</span>{<span class="i">$ParameterName</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 4712 4699       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}::_LoadAromaticityModelsData: Ignoring aromaticity model data for parameter name, $ParameterName, in $DataFile. It has already been loaded.\nLine: $Line..."</span><span class="sc">;</span> | 
|  | 4713 4700       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 4714 4701     <span class="s">}</span> | 
|  | 4715 4702     <span class="i">$ParameterNames</span>{<span class="i">$ParameterName</span>} = <span class="i">$ParameterName</span><span class="sc">;</span> | 
|  | 4716 4703 | 
|  | 4717 4704     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#LineWords</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4718 4705       <span class="i">$ModelName</span> = <span class="i">$ColIndexToModelName</span>{<span class="i">$Index</span>}<span class="sc">;</span> | 
|  | 4719 4706       <span class="i">$ParameterValue</span> = <span class="i">$LineWords</span>[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 4720 4707       <span class="i">$AromaticityModelsDataMap</span>{<span class="i">$ModelName</span>}{<span class="i">$ParameterName</span>} = <span class="i">$ParameterValue</span><span class="sc">;</span> | 
|  | 4721 4708     <span class="s">}</span> | 
|  | 4722 4709   <span class="s">}</span> | 
|  | 4723 4710   <span class="k">close</span> <span class="w">DATAFILE</span><span class="sc">;</span> | 
|  | 4724 4711 <span class="s">}</span> | 
|  | 4725 4712 | 
|  | 4726 4713 <span class="c"># Process already loaded aromaticity model data...</span> | 
|  | 4727 4714 <span class="c">#</span> | 
|  | 4728 <a name="_ProcessAromaticityModelsData-"></a>4715 <span class="k">sub </span><span class="m">_ProcessAromaticityModelsData</span> <span class="s">{</span> | 
|  | 4729 4716   <span class="k">my</span><span class="s">(</span><span class="i">$ParameterName</span><span class="cm">,</span> <span class="i">$ParameterValue</span><span class="cm">,</span> <span class="i">$ModelName</span><span class="cm">,</span> <span class="i">$NewParameterValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4730 4717 | 
|  | 4731 4718   <span class="k">for</span> <span class="i">$ModelName</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%AromaticityModelsDataMap</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4732 4719     <span class="k">for</span> <span class="i">$ParameterName</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%</span>{<span class="i">$AromaticityModelsDataMap</span>{<span class="i">$ModelName</span>}}<span class="s">)</span> <span class="s">{</span> | 
|  | 4733 4720       <span class="i">$ParameterValue</span> = <span class="i">$AromaticityModelsDataMap</span>{<span class="i">$ModelName</span>}{<span class="i">$ParameterName</span>}<span class="sc">;</span> | 
|  | 4734 4721       <span class="i">$ParameterValue</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 4735 4722 | 
|  | 4736 4723       <span class="j">VALUE:</span> <span class="s">{</span> | 
|  | 4737 4724         <span class="k">if</span> <span class="s">(</span><span class="i">$ParameterValue</span> =~ <span class="q">/^Yes$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4738 4725           <span class="i">$NewParameterValue</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 4739 4726           <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span> | 
|  | 4740 4727         <span class="s">}</span> | 
|  | 4741 4728         <span class="k">if</span> <span class="s">(</span><span class="i">$ParameterValue</span> =~ <span class="q">/^(NA|No)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4742 4729           <span class="i">$NewParameterValue</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 4743 4730           <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span> | 
|  | 4744 4731         <span class="s">}</span> | 
|  | 4745 4732         <span class="k">if</span> <span class="s">(</span><span class="i">$ParameterValue</span> =~ <span class="q">/^None$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4746 4733           <span class="i">$NewParameterValue</span> = <span class="q">''</span><span class="sc">;</span> | 
|  | 4747 4734           <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span> | 
|  | 4748 4735         <span class="s">}</span> | 
|  | 4749 4736         <span class="i">$NewParameterValue</span> = <span class="i">$ParameterValue</span><span class="sc">;</span> | 
|  | 4750 4737       <span class="s">}</span> | 
|  | 4751 4738       <span class="i">$AromaticityModelsDataMap</span>{<span class="i">$ModelName</span>}{<span class="i">$ParameterName</span>} = <span class="i">$NewParameterValue</span><span class="sc">;</span> | 
|  | 4752 4739 | 
|  | 4753 4740       <span class="k">if</span> <span class="s">(</span><span class="i">$ParameterName</span> =~ <span class="q">/List/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4754 4741         <span class="c"># Setup a new parameter conatining a reference to a hash for the specified values...</span> | 
|  | 4755 4742         <span class="k">my</span><span class="s">(</span><span class="i">$DataMapRefName</span><span class="cm">,</span> <span class="i">$DataValue</span><span class="cm">,</span> <span class="i">%DataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4756 4743 | 
|  | 4757 4744         <span class="i">$DataMapRefName</span> = <span class="q">"${ParameterName}MapRef"</span><span class="sc">;</span> | 
|  | 4758 4745 | 
|  | 4759 4746         <span class="i">%DataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 4760 4747         <span class="k">for</span> <span class="i">$DataValue</span> <span class="s">(</span><span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$NewParameterValue</span><span class="s">)</span> <span class="s">{</span> | 
|  | 4761 4748           <span class="i">$DataMap</span>{<span class="i">$DataValue</span>} = <span class="i">$DataValue</span><span class="sc">;</span> | 
|  | 4762 4749         <span class="s">}</span> | 
|  | 4763 4750         <span class="i">$AromaticityModelsDataMap</span>{<span class="i">$ModelName</span>}{<span class="i">$DataMapRefName</span>} = \<span class="i">%DataMap</span><span class="sc">;</span> | 
|  | 4764 4751       <span class="s">}</span> | 
|  | 4765 4752     <span class="s">}</span> | 
|  | 4766 4753   <span class="s">}</span> | 
|  | 4767 4754 <span class="s">}</span> | 
|  | 4768 4755 | 
|  | 4769 4756 <span class="c"># Is it a molecule object?</span> | 
|  | 4770 <a name="_IsMolecule-"></a>4757 <span class="k">sub </span><span class="m">_IsMolecule</span> <span class="s">{</span> | 
|  | 4771 4758   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 4772 4759 | 
|  | 4773 4760   <span class="k">return</span> <span class="s">(</span><span class="i">Scalar::Util::blessed</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> && <span class="i">$Object</span><span class="i">->isa</span><span class="s">(</span><span class="i">$ClassName</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> | 
|  | 4774 4761 <span class="s">}</span> | 
|  | 4775 4762 | 
|  | 4776 <a name="EOF-"></a></pre> | 
|  | 4777 <p> </p> | 
|  | 4778 <br /> | 
|  | 4779 <center> | 
|  | 4780 <img src="../../../images/h2o2.png"> | 
|  | 4781 </center> | 
|  | 4782 </body> | 
|  | 4783 </html> |