diff mayachemtools/docs/modules/html/code/Molecule.html @ 0:73ae111cf86f draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 11:55:01 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mayachemtools/docs/modules/html/code/Molecule.html	Wed Jan 20 11:55:01 2016 -0500
@@ -0,0 +1,4783 @@
+<html>
+<head>
+<title>MayaChemTools:Code:Molecule.pm</title>
+<meta http-equiv="content-type" content="text/html;charset=utf-8">
+<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
+</head>
+<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
+<br/>
+<center>
+<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
+</center>
+<br/>
+<pre>
+<a name="package-Molecule-"></a>   1 <span class="k">package </span><span class="i">Molecule</span><span class="sc">;</span>
+   2 <span class="c">#</span>
+   3 <span class="c"># $RCSfile: Molecule.pm,v $</span>
+   4 <span class="c"># $Date: 2015/02/28 20:47:18 $</span>
+   5 <span class="c"># $Revision: 1.59 $</span>
+   6 <span class="c">#</span>
+   7 <span class="c"># Author: Manish Sud &lt;msud@san.rr.com&gt;</span>
+   8 <span class="c">#</span>
+   9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
+  10 <span class="c">#</span>
+  11 <span class="c"># This file is part of MayaChemTools.</span>
+  12 <span class="c">#</span>
+  13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
+  14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
+  15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
+  16 <span class="c"># later version.</span>
+  17 <span class="c">#</span>
+  18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
+  19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
+  20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
+  21 <span class="c"># details.</span>
+  22 <span class="c">#</span>
+  23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
+  24 <span class="c"># along with MayaChemTools; if not, see &lt;http://www.gnu.org/licenses/&gt; or</span>
+  25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
+  26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
+  27 <span class="c">#</span>
+  28 
+  29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
+  30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span>
+  31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span>
+  32 <span class="k">use</span> <span class="w">Storable</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  33 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  34 <span class="k">use</span> <span class="w">ObjectProperty</span><span class="sc">;</span>
+  35 <span class="k">use</span> <span class="w">MathUtil</span><span class="sc">;</span>
+  36 <span class="k">use</span> <span class="w">PeriodicTable</span><span class="sc">;</span>
+  37 <span class="k">use</span> <span class="w">Text::ParseWords</span><span class="sc">;</span>
+  38 <span class="k">use</span> <span class="w">TextUtil</span><span class="sc">;</span>
+  39 <span class="k">use</span> <span class="w">FileUtil</span><span class="sc">;</span>
+  40 <span class="k">use</span> <span class="w">Graph</span><span class="sc">;</span>
+  41 <span class="k">use</span> <span class="w">Atom</span><span class="sc">;</span>
+  42 <span class="k">use</span> <span class="w">Bond</span><span class="sc">;</span>
+  43 <span class="k">use</span> <span class="w">MolecularFormula</span><span class="sc">;</span>
+  44 
+  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>
+  46 
+  47 <span class="i">@ISA</span> = <span class="q">qw(Graph ObjectProperty Exporter)</span><span class="sc">;</span>
+  48 <span class="i">@EXPORT</span> = <span class="q">qw(IsMolecule)</span><span class="sc">;</span>
+  49 <span class="i">@EXPORT_OK</span> = <span class="q">qw(FormatElementalCompositionInformation GetSupportedAromaticityModels IsSupportedAromaticityModel)</span><span class="sc">;</span>
+  50 
+  51 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span><span class="w">all</span>  <span class="cm">=&gt;</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>
+  52 
+  53 <span class="c"># Setup class variables...</span>
+  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>
+  55 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  56 
+  57 <span class="c"># Overload Perl functions...</span>
+  58 <span class="k">use</span> <span class="w">overload</span> <span class="q">&#39;&quot;&quot;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;StringifyMolecule&#39;</span><span class="sc">;</span>
+  59 
+  60 <span class="c"># Class constructor...</span>
+<a name="new-"></a>  61 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span>
+  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>
+  63 
+  64   <span class="c"># Initialize object...</span>
+  65   <span class="k">my</span> <span class="i">$This</span> = <span class="i">$Class</span><span class="i">-&gt;SUPER::new</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  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>
+  67   <span class="i">$This</span><span class="i">-&gt;_InitializeMolecule</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  68 
+  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">-&gt;_InitializeMoleculeProperties</span><span class="s">(</span><span class="i">%NamesAndValues</span><span class="s">)</span><span class="sc">;</span> <span class="s">}</span>
+  70 
+  71   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+  72 <span class="s">}</span>
+  73 
+  74 <span class="c"># Initialize object data...</span>
+<a name="_InitializeMolecule-"></a>  75 <span class="k">sub </span><span class="m">_InitializeMolecule</span> <span class="s">{</span>
+  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>
+  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>
+  78 
+  79   <span class="c"># All other property names and values along with all Set/Get&lt;PropertyName&gt; methods</span>
+  80   <span class="c"># are implemented on-demand using ObjectProperty class.</span>
+  81   <span class="i">$This</span>-&gt;{<span class="w">ID</span>} = <span class="i">$ObjectID</span><span class="sc">;</span>
+  82   <span class="i">$This</span>-&gt;{<span class="w">Name</span>} = <span class="q">&quot;Molecule ${ObjectID}&quot;</span><span class="sc">;</span>
+  83 <span class="s">}</span>
+  84 
+  85 <span class="c"># Initialize molecule properties...</span>
+<a name="_InitializeMoleculeProperties-"></a>  86 <span class="k">sub </span><span class="m">_InitializeMoleculeProperties</span> <span class="s">{</span>
+  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>
+  88 
+  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>
+  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>
+  91     <span class="i">$MethodName</span> = <span class="q">&quot;Set${Name}&quot;</span><span class="sc">;</span>
+  92     <span class="i">$This</span><span class="i">-&gt;$MethodName</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+  93   <span class="s">}</span>
+  94 <span class="s">}</span>
+  95 
+  96 <span class="c"># Initialize class ...</span>
+<a name="_InitializeClass-"></a>  97 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span>
+  98   <span class="c">#Class name...</span>
+  99   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span>
+ 100 
+ 101   <span class="c"># ID to keep track of objects...</span>
+ 102   <span class="i">$ObjectID</span> = <span class="n">0</span><span class="sc">;</span>
+ 103 
+ 104   <span class="c"># Load molecule class data...</span>
+ 105   <span class="i">_LoadMoleculeClassData</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 106 <span class="s">}</span>
+ 107 
+ 108 <span class="c"># Setup an explicit SetID method to block setting of ID by AUTOLOAD function...</span>
+<a name="SetID-"></a> 109 <span class="k">sub </span><span class="m">SetID</span> <span class="s">{</span>
+ 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>
+ 111 
+ 112   <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetID: Object ID can&#39;t be changed: it&#39;s used for internal tracking...&quot;</span><span class="sc">;</span>
+ 113 
+ 114   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 115 <span class="s">}</span>
+ 116 
+ 117 <span class="c"># Add an atom...</span>
+<a name="AddAtom-"></a> 118 <span class="k">sub </span><span class="m">AddAtom</span> <span class="s">{</span>
+ 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>
+ 120 
+ 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>
+ 122     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddAtom: No atom added: Atom must be specified...&quot;</span><span class="sc">;</span>
+ 123     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 124   <span class="s">}</span>
+ 125   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 126     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddAtom: No atom added: Atom already exists...&quot;</span><span class="sc">;</span>
+ 127     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 128   <span class="s">}</span>
+ 129   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_AddAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+ 130 <span class="s">}</span>
+ 131 
+ 132 <span class="c"># Add an atom...</span>
+<a name="_AddAtom-"></a> 133 <span class="k">sub </span><span class="m">_AddAtom</span> <span class="s">{</span>
+ 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>
+ 135 
+ 136   <span class="c"># Assign atom to this molecule...</span>
+ 137   <span class="i">$Atom</span><span class="i">-&gt;_SetMolecule</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+ 138 
+ 139   <span class="c"># Add it to the graph as a vertex...</span>
+ 140   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span>
+ 141   <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 142   <span class="i">$This</span><span class="i">-&gt;AddVertex</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span>
+ 143   <span class="i">$This</span><span class="i">-&gt;SetVertexProperty</span><span class="s">(</span><span class="q">&#39;Atom&#39;</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>
+ 144 
+ 145   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 146 <span class="s">}</span>
+ 147 
+ 148 <span class="c"># Add atoms...</span>
+<a name="AddAtoms-"></a> 149 <span class="k">sub </span><span class="m">AddAtoms</span> <span class="s">{</span>
+ 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>
+ 151 
+ 152   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span>
+ 153     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddAtoms: No atoms added: Atoms list must be specified...&quot;</span><span class="sc">;</span>
+ 154     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 155   <span class="s">}</span>
+ 156   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 158     <span class="i">$This</span><span class="i">-&gt;AddAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+ 159   <span class="s">}</span>
+ 160   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 161 <span class="s">}</span>
+ 162 
+ 163 <span class="c"># Create an atom and add it to molecule...</span>
+<a name="NewAtom-"></a> 164 <span class="k">sub </span><span class="m">NewAtom</span> <span class="s">{</span>
+ 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>
+ 166   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+ 167 
+ 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>
+ 169   <span class="i">$This</span><span class="i">-&gt;AddAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+ 170 
+ 171   <span class="k">return</span> <span class="i">$Atom</span><span class="sc">;</span>
+ 172 <span class="s">}</span>
+ 173 
+ 174 <span class="c"># Delete an atom...</span>
+<a name="DeleteAtom-"></a> 175 <span class="k">sub </span><span class="m">DeleteAtom</span> <span class="s">{</span>
+ 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>
+ 177 
+ 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>
+ 179     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteAtom: No atom deleted: Atom must be specified...&quot;</span><span class="sc">;</span>
+ 180     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 181   <span class="s">}</span>
+ 182   <span class="c"># Does the atom exist in  molecule?</span>
+ 183   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 184     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteAtom: No atom deleted: Atom doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+ 185     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 186   <span class="s">}</span>
+ 187   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_DeleteAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+ 188 <span class="s">}</span>
+ 189 
+ 190 <span class="c"># Delete atom...</span>
+<a name="_DeleteAtom-"></a> 191 <span class="k">sub </span><span class="m">_DeleteAtom</span> <span class="s">{</span>
+ 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>
+ 193 
+ 194   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span>
+ 195   <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 196   <span class="i">$This</span><span class="i">-&gt;DeleteVertex</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span>
+ 197 
+ 198   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 199 <span class="s">}</span>
+ 200 
+ 201 <span class="c"># Delete atoms...</span>
+<a name="DeleteAtoms-"></a> 202 <span class="k">sub </span><span class="m">DeleteAtoms</span> <span class="s">{</span>
+ 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>
+ 204 
+ 205   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Atoms</span><span class="s">)</span> <span class="s">{</span>
+ 206     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteAtoms: No atoms added: Atoms list must be specified...&quot;</span><span class="sc">;</span>
+ 207     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 208   <span class="s">}</span>
+ 209   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 211     <span class="i">$This</span><span class="i">-&gt;DeleteAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+ 212   <span class="s">}</span>
+ 213 
+ 214   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 215 <span class="s">}</span>
+ 216 
+ 217 <span class="c"># Is this atom present?</span>
+<a name="HasAtom-"></a> 218 <span class="k">sub </span><span class="m">HasAtom</span> <span class="s">{</span>
+ 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>
+ 220 
+ 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>
+ 222     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 223   <span class="s">}</span>
+ 224   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;HasProperty</span><span class="s">(</span><span class="q">&#39;Molecule&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 225     <span class="c"># It&#39;s not in molecule...</span>
+ 226     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 227   <span class="s">}</span>
+ 228   <span class="k">my</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span>
+ 229   <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 230   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 231     <span class="c"># It&#39;s not in molecule...</span>
+ 232     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 233   <span class="s">}</span>
+ 234   <span class="k">my</span><span class="s">(</span><span class="i">$Molecule</span><span class="s">)</span><span class="sc">;</span>
+ 235   <span class="i">$Molecule</span> = <span class="i">$Atom</span><span class="i">-&gt;GetProperty</span><span class="s">(</span><span class="q">&#39;Molecule&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 236 
+ 237   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span> &amp;&amp; <span class="i">$This</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Molecule</span><span class="i">-&gt;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>
+ 238 <span class="s">}</span>
+ 239 
+ 240 <span class="c"># Return an array of atoms. In scalar context,  it returns number of atoms. Additionally,</span>
+ 241 <span class="c"># atoms array can be filtered by any user specifiable Atom class method...</span>
+ 242 <span class="c">#</span>
+<a name="GetAtoms-"></a> 243 <span class="k">sub </span><span class="m">GetAtoms</span> <span class="s">{</span>
+ 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>
+ 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>
+ 246 
+ 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>
+ 248 
+ 249   <span class="i">@AtomIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 250   <span class="k">if</span> <span class="s">(</span>!<span class="i">@AtomIDs</span><span class="s">)</span> <span class="s">{</span>
+ 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>
+ 252   <span class="s">}</span>
+ 253 
+ 254   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetVerticesProperty</span><span class="s">(</span><span class="q">&#39;Atom&#39;</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span>
+ 255 
+ 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>
+ 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>
+ 258   <span class="s">}</span>
+ 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> &amp;&amp;  <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>
+ 260 
+ 261   <span class="c"># Filter out atoms...</span>
+ 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>
+ 263   <span class="i">@FilteredAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 265     <span class="i">$KeepAtom</span> = <span class="i">$NegateMethodResult</span> ? <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;$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">-&gt;$AtomCheckMethodName</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 266     <span class="k">if</span> <span class="s">(</span><span class="i">$KeepAtom</span><span class="s">)</span> <span class="s">{</span>
+ 267       <span class="k">push</span> <span class="i">@FilteredAtoms</span><span class="cm">,</span> <span class="i">$Atom</span><span class="sc">;</span>
+ 268     <span class="s">}</span>
+ 269   <span class="s">}</span>
+ 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>
+ 271 <span class="s">}</span>
+ 272 
+ 273 <span class="c"># Return an array of bonds. In scalar context, it returns number of bonds...</span>
+<a name="GetBonds-"></a> 274 <span class="k">sub </span><span class="m">GetBonds</span> <span class="s">{</span>
+ 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>
+ 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>
+ 277 
+ 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>
+ 279 
+ 280   <span class="i">@EdgesAtomsIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 281   <span class="k">if</span> <span class="s">(</span><span class="i">@EdgesAtomsIDs</span><span class="s">)</span> <span class="s">{</span>
+ 282     <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">-&gt;GetEdgesProperty</span><span class="s">(</span><span class="q">&#39;Bond&#39;</span><span class="cm">,</span> <span class="i">@EdgesAtomsIDs</span><span class="s">)</span><span class="sc">;</span>
+ 283   <span class="s">}</span>
+ 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>
+ 285 <span class="s">}</span>
+ 286 
+ 287 <span class="c"># Get number of atoms in molecule...</span>
+<a name="GetNumOfAtoms-"></a> 288 <span class="k">sub </span><span class="m">GetNumOfAtoms</span> <span class="s">{</span>
+ 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>
+ 290   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfAtoms</span><span class="s">)</span><span class="sc">;</span>
+ 291 
+ 292   <span class="i">$NumOfAtoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 293 
+ 294   <span class="k">return</span> <span class="i">$NumOfAtoms</span><span class="sc">;</span>
+ 295 <span class="s">}</span>
+ 296 
+ 297 <span class="c"># Get number of bonds in molecule...</span>
+<a name="GetNumOfBonds-"></a> 298 <span class="k">sub </span><span class="m">GetNumOfBonds</span> <span class="s">{</span>
+ 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>
+ 300   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfBonds</span><span class="s">)</span><span class="sc">;</span>
+ 301 
+ 302   <span class="i">$NumOfBonds</span> = <span class="i">$This</span><span class="i">-&gt;GetBonds</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 303 
+ 304   <span class="k">return</span> <span class="i">$NumOfBonds</span><span class="sc">;</span>
+ 305 <span class="s">}</span>
+ 306 
+ 307 <span class="c"># Get number of heavy atoms in molecule...</span>
+<a name="GetNumOfHeavyAtoms-"></a> 308 <span class="k">sub </span><span class="m">GetNumOfHeavyAtoms</span> <span class="s">{</span>
+ 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>
+ 310 
+ 311   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 312 <span class="s">}</span>
+ 313 
+ 314 <span class="c"># Get number of non-hydrogen atoms in molecule...</span>
+<a name="GetNumOfNonHydrogenAtoms-"></a> 315 <span class="k">sub </span><span class="m">GetNumOfNonHydrogenAtoms</span> <span class="s">{</span>
+ 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>
+ 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>
+ 318 
+ 319   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 320   <span class="i">$NumOfNonHydrogenAtoms</span> = <span class="n">0</span><span class="sc">;</span>
+ 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>
+ 322     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 323       <span class="i">$NumOfNonHydrogenAtoms</span>++<span class="sc">;</span>
+ 324     <span class="s">}</span>
+ 325   <span class="s">}</span>
+ 326   <span class="k">return</span> <span class="i">$NumOfNonHydrogenAtoms</span><span class="sc">;</span>
+ 327 <span class="s">}</span>
+ 328 
+ 329 <span class="c"># Get number of hydrogen atoms in molecule...</span>
+<a name="GetNumOfHydrogenAtoms-"></a> 330 <span class="k">sub </span><span class="m">GetNumOfHydrogenAtoms</span> <span class="s">{</span>
+ 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>
+ 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>
+ 333 
+ 334   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 335   <span class="i">$NumOfHydrogenAtoms</span> = <span class="n">0</span><span class="sc">;</span>
+ 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>
+ 337     <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 338       <span class="i">$NumOfHydrogenAtoms</span>++<span class="sc">;</span>
+ 339     <span class="s">}</span>
+ 340   <span class="s">}</span>
+ 341   <span class="k">return</span> <span class="i">$NumOfHydrogenAtoms</span><span class="sc">;</span>
+ 342 <span class="s">}</span>
+ 343 
+ 344 <span class="c"># Get number of missing hydrogen atoms in molecule...</span>
+<a name="GetNumOfMissingHydrogenAtoms-"></a> 345 <span class="k">sub </span><span class="m">GetNumOfMissingHydrogenAtoms</span> <span class="s">{</span>
+ 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>
+ 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>
+ 348 
+ 349   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 350   <span class="i">$NumOfMissingHydrogenAtoms</span> = <span class="n">0</span><span class="sc">;</span>
+ 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>
+ 352     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 353       <span class="i">$NumOfMissingHydrogenAtoms</span> += <span class="i">$Atom</span><span class="i">-&gt;GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 354     <span class="s">}</span>
+ 355   <span class="s">}</span>
+ 356   <span class="k">return</span> <span class="i">$NumOfMissingHydrogenAtoms</span><span class="sc">;</span>
+ 357 <span class="s">}</span>
+ 358 
+ 359 <span class="c"># Add bond...</span>
+<a name="AddBond-"></a> 360 <span class="k">sub </span><span class="m">AddBond</span> <span class="s">{</span>
+ 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>
+ 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>
+ 363 
+ 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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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> &amp;&amp; <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>
+ 366     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddBond: No bond added: Both atoms must be specified...&quot;</span><span class="sc">;</span>
+ 367     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 368   <span class="s">}</span>
+ 369   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasAtom</span><span class="s">(</span><span class="i">$Atom1</span><span class="s">)</span> &amp;&amp; <span class="i">$This</span><span class="i">-&gt;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>
+ 370     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddBond: No bond added: Both atoms must be present...&quot;</span><span class="sc">;</span>
+ 371     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 372   <span class="s">}</span>
+ 373   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 374     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddBond: No bond added: Bond already exists...&quot;</span><span class="sc">;</span>
+ 375     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 376   <span class="s">}</span>
+ 377   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_AddBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span>
+ 378 <span class="s">}</span>
+ 379 
+ 380 <span class="c"># Add bond...</span>
+<a name="_AddBond-"></a> 381 <span class="k">sub </span><span class="m">_AddBond</span> <span class="s">{</span>
+ 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>
+ 383 
+ 384   <span class="c"># Assign bond to this molecule...</span>
+ 385   <span class="i">$Bond</span><span class="i">-&gt;_SetMolecule</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+ 386 
+ 387   <span class="c"># Add it to the graph as an edge...</span>
+ 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>
+ 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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 390   <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">-&gt;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">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 391   <span class="i">$This</span><span class="i">-&gt;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>
+ 392   <span class="i">$This</span><span class="i">-&gt;SetEdgeProperty</span><span class="s">(</span><span class="q">&#39;Bond&#39;</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>
+ 393 
+ 394   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 395 <span class="s">}</span>
+ 396 
+ 397 <span class="c"># Add Bonds...</span>
+<a name="AddBonds-"></a> 398 <span class="k">sub </span><span class="m">AddBonds</span> <span class="s">{</span>
+ 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>
+ 400 
+ 401   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Bonds</span><span class="s">)</span> <span class="s">{</span>
+ 402     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddBonds: No bonds added: Bonds list must be specified...&quot;</span><span class="sc">;</span>
+ 403     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 404   <span class="s">}</span>
+ 405   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 407     <span class="i">$This</span><span class="i">-&gt;AddBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span>
+ 408   <span class="s">}</span>
+ 409   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 410 <span class="s">}</span>
+ 411 
+ 412 <span class="c"># Create a bond and add it to molecule...</span>
+<a name="NewBond-"></a> 413 <span class="k">sub </span><span class="m">NewBond</span> <span class="s">{</span>
+ 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>
+ 415   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span>
+ 416 
+ 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>
+ 418   <span class="i">$This</span><span class="i">-&gt;AddBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span>
+ 419 
+ 420   <span class="k">return</span> <span class="i">$Bond</span><span class="sc">;</span>
+ 421 <span class="s">}</span>
+ 422 
+ 423 <span class="c"># Delete a bond...</span>
+<a name="DeleteBond-"></a> 424 <span class="k">sub </span><span class="m">DeleteBond</span> <span class="s">{</span>
+ 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>
+ 426 
+ 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>
+ 428     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteBond: No bond deleted: Bond must be specified...&quot;</span><span class="sc">;</span>
+ 429     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 430   <span class="s">}</span>
+ 431   <span class="c"># Does the bond exist in molecule?</span>
+ 432   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 433     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteBond: No bond deleted: Bond doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+ 434     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 435   <span class="s">}</span>
+ 436   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_DeleteBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span>
+ 437 <span class="s">}</span>
+ 438 
+ 439 <span class="c"># Delete bond...</span>
+<a name="_DeleteBond-"></a> 440 <span class="k">sub </span><span class="m">_DeleteBond</span> <span class="s">{</span>
+ 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>
+ 442 
+ 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>
+ 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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 445   <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">-&gt;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">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 446   <span class="i">$This</span><span class="i">-&gt;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>
+ 447 
+ 448   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 449 <span class="s">}</span>
+ 450 
+ 451 <span class="c"># Delete bonds...</span>
+<a name="DeleteBonds-"></a> 452 <span class="k">sub </span><span class="m">DeleteBonds</span> <span class="s">{</span>
+ 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>
+ 454 
+ 455   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Bonds</span><span class="s">)</span> <span class="s">{</span>
+ 456     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteBonds: No bonds added: Bonds list must be specified...&quot;</span><span class="sc">;</span>
+ 457     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 458   <span class="s">}</span>
+ 459   <span class="k">my</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 461     <span class="i">$This</span><span class="i">-&gt;DeleteBond</span><span class="s">(</span><span class="i">$Bond</span><span class="s">)</span><span class="sc">;</span>
+ 462   <span class="s">}</span>
+ 463 
+ 464   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 465 <span class="s">}</span>
+ 466 
+ 467 <span class="c"># Has bond...</span>
+<a name="HasBond-"></a> 468 <span class="k">sub </span><span class="m">HasBond</span> <span class="s">{</span>
+ 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>
+ 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>
+ 471 
+ 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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 473   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasAtom</span><span class="s">(</span><span class="i">$Atom1</span><span class="s">)</span> &amp;&amp; <span class="i">$This</span><span class="i">-&gt;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>
+ 474     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 475   <span class="s">}</span>
+ 476   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Bond</span><span class="i">-&gt;HasProperty</span><span class="s">(</span><span class="q">&#39;Molecule&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 477     <span class="c"># It&#39;s not in molecule...</span>
+ 478     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 479   <span class="s">}</span>
+ 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>
+ 481   <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">-&gt;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">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 482   <span class="i">$Molecule</span> = <span class="i">$Bond</span><span class="i">-&gt;GetMolecule</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 483 
+ 484   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasEdge</span><span class="s">(</span><span class="i">$AtomID1</span><span class="cm">,</span> <span class="i">$AtomID2</span><span class="s">)</span> &amp;&amp; <span class="i">$This</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span> == <span class="i">$Molecule</span><span class="i">-&gt;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>
+ 485 <span class="s">}</span>
+ 486 
+ 487 <span class="c"># Get atom neighbors...</span>
+<a name="_GetAtomNeighbors-"></a> 488 <span class="k">sub </span><span class="m">_GetAtomNeighbors</span> <span class="s">{</span>
+ 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>
+ 490 
+ 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>
+ 492 
+ 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>
+ 494   <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 495   <span class="i">@AtomIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetNeighbors</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span>
+ 496   <span class="k">if</span> <span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span> <span class="s">{</span>
+ 497     <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetVerticesProperty</span><span class="s">(</span><span class="q">&#39;Atom&#39;</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span>
+ 498   <span class="s">}</span>
+ 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>
+ 500 <span class="s">}</span>
+ 501 
+ 502 <span class="c"># Get atom bonds...</span>
+<a name="_GetAtomBonds-"></a> 503 <span class="k">sub </span><span class="m">_GetAtomBonds</span> <span class="s">{</span>
+ 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>
+ 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>
+ 506 
+ 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>
+ 508   <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 509   <span class="i">@AtomIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span>
+ 510   <span class="k">if</span> <span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span> <span class="s">{</span>
+ 511     <span class="i">@Bonds</span> = <span class="i">$This</span><span class="i">-&gt;GetEdgesProperty</span><span class="s">(</span><span class="q">&#39;Bond&#39;</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span>
+ 512   <span class="s">}</span>
+ 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>
+ 514 <span class="s">}</span>
+ 515 
+ 516 <span class="c"># Get bond to specified atom...</span>
+<a name="_GetBondToAtom-"></a> 517 <span class="k">sub </span><span class="m">_GetBondToAtom</span> <span class="s">{</span>
+ 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>
+ 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>
+ 520 
+ 521   <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 522   <span class="i">$AtomID2</span> = <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 523 
+ 524   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetEdgeProperty</span><span class="s">(</span><span class="q">&#39;Bond&#39;</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>
+ 525 <span class="s">}</span>
+ 526 
+ 527 <span class="c"># Are two specified atoms bonded?</span>
+<a name="_IsBondedToAtom-"></a> 528 <span class="k">sub </span><span class="m">_IsBondedToAtom</span> <span class="s">{</span>
+ 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>
+ 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>
+ 531 
+ 532   <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 533   <span class="i">$AtomID2</span> = <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 534 
+ 535   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;HasEdgeProperty</span><span class="s">(</span><span class="q">&#39;Bond&#39;</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>
+ 536 <span class="s">}</span>
+ 537 
+ 538 <span class="c"># Add hydrogens to each atoms in molecule and return total number of hydrogens added...</span>
+<a name="AddHydrogens-"></a> 539 <span class="k">sub </span><span class="m">AddHydrogens</span> <span class="s">{</span>
+ 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>
+ 541 
+ 542   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_AddHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 543 <span class="s">}</span>
+ 544 
+ 545 <span class="c"># Add hydrogens to polar atoms (N, O, P, S) in molecule and return total number of hydrogens added...</span>
+<a name="AddPolarHydrogens-"></a> 546 <span class="k">sub </span><span class="m">AddPolarHydrogens</span> <span class="s">{</span>
+ 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>
+ 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>
+ 549 
+ 550   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_AddHydrogens</span><span class="s">(</span><span class="i">$PolarHydrogensOnly</span><span class="s">)</span><span class="sc">;</span>
+ 551 <span class="s">}</span>
+ 552 
+ 553 <span class="c"># Add all the hydrogens or hydrogens for polar atoms only...</span>
+ 554 <span class="c">#</span>
+ 555 <span class="c"># Note:</span>
+ 556 <span class="c">#   . The current release of MayaChemTools doesn&#39;t assign any hydrogen positions.</span>
+ 557 <span class="c">#</span>
+<a name="_AddHydrogens-"></a> 558 <span class="k">sub </span><span class="m">_AddHydrogens</span> <span class="s">{</span>
+ 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>
+ 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>
+ 561 
+ 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>
+ 563     <span class="i">$PolarHydrogensOnly</span> = <span class="n">0</span><span class="sc">;</span>
+ 564   <span class="s">}</span>
+ 565 
+ 566   <span class="i">$NumOfHydrogensAdded</span> = <span class="n">0</span><span class="sc">;</span>
+ 567   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 568   <span class="i">$HydrogenPositionsWarning</span> = <span class="n">0</span><span class="sc">;</span>
+ 569 
+ 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>
+ 571     <span class="k">if</span> <span class="s">(</span><span class="i">$PolarHydrogensOnly</span><span class="s">)</span> <span class="s">{</span>
+ 572       <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;IsPolarAtom</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 573         <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span>
+ 574       <span class="s">}</span>
+ 575     <span class="s">}</span>
+ 576     <span class="i">$NumOfHydrogensAdded</span> += <span class="i">$Atom</span><span class="i">-&gt;AddHydrogens</span><span class="s">(</span><span class="i">$HydrogenPositionsWarning</span><span class="s">)</span><span class="sc">;</span>
+ 577   <span class="s">}</span>
+ 578   <span class="k">return</span> <span class="i">$NumOfHydrogensAdded</span><span class="sc">;</span>
+ 579 <span class="s">}</span>
+ 580 
+ 581 <span class="c"># Delete all hydrogens atoms in molecule and return total number of hydrogens removed...</span>
+<a name="DeleteHydrogens-"></a> 582 <span class="k">sub </span><span class="m">DeleteHydrogens</span> <span class="s">{</span>
+ 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>
+ 584 
+ 585   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_DeleteHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 586 <span class="s">}</span>
+ 587 
+ 588 <span class="c"># Delete hydrogens to polar atoms (N, O, P, S) in molecule and return total number of hydrogens removed...</span>
+<a name="DeletePolarHydrogens-"></a> 589 <span class="k">sub </span><span class="m">DeletePolarHydrogens</span> <span class="s">{</span>
+ 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>
+ 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>
+ 592 
+ 593   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_DeleteHydrogens</span><span class="s">(</span><span class="i">$PolarHydrogensOnly</span><span class="s">)</span><span class="sc">;</span>
+ 594 <span class="s">}</span>
+ 595 
+ 596 <span class="c"># Delete all hydrogens atoms in molecule and return total number of hydrogens removed...</span>
+<a name="_DeleteHydrogens-"></a> 597 <span class="k">sub </span><span class="m">_DeleteHydrogens</span> <span class="s">{</span>
+ 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>
+ 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>
+ 600 
+ 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>
+ 602     <span class="i">$PolarHydrogensOnly</span> = <span class="n">0</span><span class="sc">;</span>
+ 603   <span class="s">}</span>
+ 604 
+ 605   <span class="i">$NumOfHydrogensRemoved</span> = <span class="n">0</span><span class="sc">;</span>
+ 606   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 607 
+ 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>
+ 609     <span class="k">if</span> <span class="s">(</span><span class="i">$PolarHydrogensOnly</span><span class="s">)</span> <span class="s">{</span>
+ 610       <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;IsPolarHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 611         <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span>
+ 612       <span class="s">}</span>
+ 613     <span class="s">}</span>
+ 614     <span class="k">elsif</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 615       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span>
+ 616     <span class="s">}</span>
+ 617     <span class="i">$This</span><span class="i">-&gt;_DeleteAtom</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+ 618     <span class="i">$NumOfHydrogensRemoved</span>++<span class="sc">;</span>
+ 619   <span class="s">}</span>
+ 620   <span class="k">return</span> <span class="i">$NumOfHydrogensRemoved</span><span class="sc">;</span>
+ 621 <span class="s">}</span>
+ 622 
+ 623 <span class="c"># Get molecular weight by summing up atomic weights of all the atoms...</span>
+<a name="GetMolecularWeight-"></a> 624 <span class="k">sub </span><span class="m">GetMolecularWeight</span> <span class="s">{</span>
+ 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>
+ 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>
+ 627 
+ 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>
+ 629 
+ 630   <span class="i">$MolecularWeight</span> = <span class="n">0</span><span class="sc">;</span>
+ 631   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 633     <span class="i">$AtomicWeight</span> = <span class="i">$Atom</span><span class="i">-&gt;GetAtomicWeight</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 635       <span class="i">$MolecularWeight</span> += <span class="i">$AtomicWeight</span><span class="sc">;</span>
+ 636     <span class="s">}</span>
+ 637   <span class="s">}</span>
+ 638 
+ 639   <span class="k">if</span> <span class="s">(</span>!<span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> <span class="s">{</span>
+ 640     <span class="k">return</span> <span class="i">$MolecularWeight</span><span class="sc">;</span>
+ 641   <span class="s">}</span>
+ 642 
+ 643   <span class="c"># Account for missing hydrogen atoms...</span>
+ 644   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfMissingHydrogenAtoms</span><span class="s">)</span><span class="sc">;</span>
+ 645 
+ 646   <span class="i">$NumOfMissingHydrogenAtoms</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfMissingHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 647   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfMissingHydrogenAtoms</span><span class="s">)</span> <span class="s">{</span>
+ 648     <span class="i">$MolecularWeight</span> += <span class="i">$NumOfMissingHydrogenAtoms</span> * <span class="i">PeriodicTable::GetElementAtomicWeight</span><span class="s">(</span><span class="q">&#39;H&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 649   <span class="s">}</span>
+ 650 
+ 651   <span class="k">return</span> <span class="i">$MolecularWeight</span><span class="sc">;</span>
+ 652 <span class="s">}</span>
+ 653 
+ 654 <span class="c"># Get exact mass by summing up exact masses of all the atoms...</span>
+<a name="GetExactMass-"></a> 655 <span class="k">sub </span><span class="m">GetExactMass</span> <span class="s">{</span>
+ 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>
+ 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>
+ 658 
+ 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>
+ 660 
+ 661   <span class="i">$ExactMass</span> = <span class="n">0</span><span class="sc">;</span>
+ 662   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 664     <span class="i">$AtomicMass</span> = <span class="i">$Atom</span><span class="i">-&gt;GetExactMass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 666       <span class="i">$ExactMass</span> += <span class="i">$AtomicMass</span><span class="sc">;</span>
+ 667     <span class="s">}</span>
+ 668   <span class="s">}</span>
+ 669 
+ 670   <span class="k">if</span> <span class="s">(</span>!<span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> <span class="s">{</span>
+ 671     <span class="k">return</span> <span class="i">$ExactMass</span><span class="sc">;</span>
+ 672   <span class="s">}</span>
+ 673 
+ 674   <span class="c"># Account for missing hydrogen atoms...</span>
+ 675   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfMissingHydrogenAtoms</span><span class="s">)</span><span class="sc">;</span>
+ 676 
+ 677   <span class="i">$NumOfMissingHydrogenAtoms</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfMissingHydrogenAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 678   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfMissingHydrogenAtoms</span><span class="s">)</span> <span class="s">{</span>
+ 679     <span class="i">$ExactMass</span> += <span class="i">$NumOfMissingHydrogenAtoms</span> * <span class="i">PeriodicTable::GetElementMostAbundantNaturalIsotopeMass</span><span class="s">(</span><span class="q">&#39;H&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 680   <span class="s">}</span>
+ 681 
+ 682   <span class="k">return</span> <span class="i">$ExactMass</span><span class="sc">;</span>
+ 683 <span class="s">}</span>
+ 684 
+ 685 <span class="c"># Get net formal charge on the molecule using one of the following two methods:</span>
+ 686 <span class="c">#   . Using explicitly set FormalCharge property</span>
+ 687 <span class="c">#   . Adding up formal charge on each atom in the molecule</span>
+ 688 <span class="c">#</span>
+ 689 <span class="c"># Caveats:</span>
+ 690 <span class="c">#   . FormalCharge is different from Charge property of the molecule which corresponds to</span>
+ 691 <span class="c">#     sum of partial atomic charges explicitly set for each atom using a specific methodology.</span>
+ 692 <span class="c">#</span>
+<a name="GetFormalCharge-"></a> 693 <span class="k">sub </span><span class="m">GetFormalCharge</span> <span class="s">{</span>
+ 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>
+ 695 
+ 696   <span class="c"># Is FormalCharge property explicitly set?</span>
+ 697   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasProperty</span><span class="s">(</span><span class="q">&#39;FormalCharge&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 698     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetProperty</span><span class="s">(</span><span class="q">&#39;FormalCharge&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 699   <span class="s">}</span>
+ 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>
+ 701 
+ 702   <span class="i">$FormalCharge</span> = <span class="n">0</span><span class="sc">;</span>
+ 703   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 705     <span class="i">$AtomicFormalCharge</span> = <span class="i">$Atom</span><span class="i">-&gt;GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 707       <span class="i">$FormalCharge</span> += <span class="i">$AtomicFormalCharge</span><span class="sc">;</span>
+ 708     <span class="s">}</span>
+ 709   <span class="s">}</span>
+ 710   <span class="k">return</span> <span class="i">$FormalCharge</span><span class="sc">;</span>
+ 711 <span class="s">}</span>
+ 712 
+ 713 <span class="c"># Get net charge on the molecule using one of the following two methods:</span>
+ 714 <span class="c">#   . Using explicitly set Charge property</span>
+ 715 <span class="c">#   . Adding up charge on each atom in the molecule</span>
+ 716 <span class="c">#</span>
+ 717 <span class="c"># Caveats:</span>
+ 718 <span class="c">#   . FormalCharge is different from Charge property of the molecule which corresponds to</span>
+ 719 <span class="c">#     sum of partial atomic charges explicitly set for each atom using a specific methodology.</span>
+ 720 <span class="c">#</span>
+<a name="GetCharge-"></a> 721 <span class="k">sub </span><span class="m">GetCharge</span> <span class="s">{</span>
+ 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>
+ 723 
+ 724   <span class="c"># Is Charge property explicitly set?</span>
+ 725   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasProperty</span><span class="s">(</span><span class="q">&#39;Charge&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 726     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetProperty</span><span class="s">(</span><span class="q">&#39;Charge&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 727   <span class="s">}</span>
+ 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>
+ 729 
+ 730   <span class="i">$Charge</span> = <span class="n">0</span><span class="sc">;</span>
+ 731   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 733     <span class="i">$AtomicCharge</span> = <span class="i">$Atom</span><span class="i">-&gt;GetCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 735       <span class="i">$Charge</span> += <span class="i">$AtomicCharge</span><span class="sc">;</span>
+ 736     <span class="s">}</span>
+ 737   <span class="s">}</span>
+ 738   <span class="k">return</span> <span class="i">$Charge</span><span class="sc">;</span>
+ 739 <span class="s">}</span>
+ 740 
+ 741 <span class="c"># Get total SpinMultiplicity for the molecule using one of the following two methods:</span>
+ 742 <span class="c">#   . Using explicitly set SpinMultiplicity property</span>
+ 743 <span class="c">#   . Adding up SpinMultiplicity on each atom in the molecule</span>
+ 744 <span class="c">#</span>
+ 745 <span class="c">#</span>
+<a name="GetSpinMultiplicity-"></a> 746 <span class="k">sub </span><span class="m">GetSpinMultiplicity</span> <span class="s">{</span>
+ 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>
+ 748 
+ 749   <span class="c"># Is SpinMultiplicity property explicitly set?</span>
+ 750   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasProperty</span><span class="s">(</span><span class="q">&#39;SpinMultiplicity&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 751     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetProperty</span><span class="s">(</span><span class="q">&#39;SpinMultiplicity&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 752   <span class="s">}</span>
+ 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>
+ 754 
+ 755   <span class="i">$SpinMultiplicity</span> = <span class="n">0</span><span class="sc">;</span>
+ 756   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 758     <span class="i">$AtomicSpinMultiplicity</span> = <span class="i">$Atom</span><span class="i">-&gt;GetSpinMultiplicity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 760       <span class="i">$SpinMultiplicity</span> += <span class="i">$AtomicSpinMultiplicity</span><span class="sc">;</span>
+ 761     <span class="s">}</span>
+ 762   <span class="s">}</span>
+ 763   <span class="k">return</span> <span class="i">$SpinMultiplicity</span><span class="sc">;</span>
+ 764 <span class="s">}</span>
+ 765 
+ 766 <span class="c"># Get total FreeRadicalElectrons for the molecule using one of the following two methods:</span>
+ 767 <span class="c">#   . Using explicitly set FreeRadicalElectrons property</span>
+ 768 <span class="c">#   . Adding up FreeRadicalElectrons on each atom in the molecule</span>
+ 769 <span class="c">#</span>
+ 770 <span class="c">#</span>
+<a name="GetFreeRadicalElectrons-"></a> 771 <span class="k">sub </span><span class="m">GetFreeRadicalElectrons</span> <span class="s">{</span>
+ 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>
+ 773 
+ 774   <span class="c"># Is FreeRadicalElectrons property explicitly set?</span>
+ 775   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasProperty</span><span class="s">(</span><span class="q">&#39;FreeRadicalElectrons&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 776     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetProperty</span><span class="s">(</span><span class="q">&#39;FreeRadicalElectrons&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 777   <span class="s">}</span>
+ 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>
+ 779 
+ 780   <span class="i">$FreeRadicalElectrons</span> = <span class="n">0</span><span class="sc">;</span>
+ 781   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 783     <span class="i">$AtomicFreeRadicalElectrons</span> = <span class="i">$Atom</span><span class="i">-&gt;GetFreeRadicalElectrons</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 785       <span class="i">$FreeRadicalElectrons</span> += <span class="i">$AtomicFreeRadicalElectrons</span><span class="sc">;</span>
+ 786     <span class="s">}</span>
+ 787   <span class="s">}</span>
+ 788   <span class="k">return</span> <span class="i">$FreeRadicalElectrons</span><span class="sc">;</span>
+ 789 <span class="s">}</span>
+ 790 
+ 791 <span class="c"># Set valence model...</span>
+ 792 <span class="c">#</span>
+<a name="SetValenceModel-"></a> 793 <span class="k">sub </span><span class="m">SetValenceModel</span> <span class="s">{</span>
+ 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>
+ 795 
+ 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>
+ 797     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetValenceModel: The current release of MayaChemTools doesn&#39;t support the specified valence model $ValenceModel. Supported valence models: MDLValenceModel, DaylightValenceModel, InternalValenceModel or MayaChemToolsValenceModel. Using internal valence model...&quot;</span><span class="sc">;</span>
+ 798     <span class="i">$ValenceModel</span> = <span class="q">&#39;InternalValenceModel&#39;</span><span class="sc">;</span>
+ 799   <span class="s">}</span>
+ 800 
+ 801   <span class="i">$This</span><span class="i">-&gt;SetProperty</span><span class="s">(</span><span class="q">&#39;ValenceModel&#39;</span><span class="cm">,</span> <span class="i">$ValenceModel</span><span class="s">)</span><span class="sc">;</span>
+ 802 
+ 803   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 804 <span class="s">}</span>
+ 805 
+ 806 <span class="c"># Get valence model...</span>
+ 807 <span class="c">#</span>
+<a name="GetValenceModel-"></a> 808 <span class="k">sub </span><span class="m">GetValenceModel</span> <span class="s">{</span>
+ 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>
+ 810 
+ 811   <span class="c"># Is ValenceModel property explicitly set?</span>
+ 812   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasProperty</span><span class="s">(</span><span class="q">&#39;ValenceModel&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 813     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetProperty</span><span class="s">(</span><span class="q">&#39;ValenceModel&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 814   <span class="s">}</span>
+ 815 
+ 816   <span class="c"># Used internal valence model as default model...</span>
+ 817   <span class="k">return</span> <span class="q">&#39;InternalValenceModel&#39;</span><span class="sc">;</span>
+ 818 <span class="s">}</span>
+ 819 
+ 820 <span class="c"># Get molecular formula by collecting information about all atoms in the molecule and</span>
+ 821 <span class="c"># composing the formula using Hills ordering system:</span>
+ 822 <span class="c">#   . C shows up first and H follows assuming C is present</span>
+ 823 <span class="c">#   . All other standard elements are sorted alphanumerically</span>
+ 824 <span class="c">#   . All other non-stanard atom symbols are also sorted alphanumerically and follow standard elements</span>
+ 825 <span class="c">#</span>
+ 826 <span class="c"># Caveats:</span>
+ 827 <span class="c">#   . By default, missing hydrogens and nonelements are also included</span>
+ 828 <span class="c">#   . Elements for disconnected fragments are combined into the same formula</span>
+ 829 <span class="c">#</span>
+ 830 <span class="c"># Handle formula generation for disconnected structures. e.g: molecule generated by</span>
+ 831 <span class="c"># [Na+].[O-]c1ccccc1</span>
+ 832 <span class="c">#</span>
+<a name="GetMolecularFormula-"></a> 833 <span class="k">sub </span><span class="m">GetMolecularFormula</span> <span class="s">{</span>
+ 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>
+ 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>
+ 836 
+ 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>
+ 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>
+ 839 
+ 840   <span class="c"># Get elements count and setup molecular formula...</span>
+ 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">-&gt;GetElementsAndNonElements</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span><span class="sc">;</span>
+ 842   <span class="i">$MolecularFormula</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+ 843 
+ 844   <span class="c"># Count C and H first...</span>
+ 845   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ElementsCountRef</span>-&gt;{<span class="w">C</span>} <span class="s">)</span> <span class="s">{</span>
+ 846     <span class="i">$MolecularFormula</span> .= <span class="q">&#39;C&#39;</span> . <span class="s">(</span><span class="i">$ElementsCountRef</span>-&gt;{<span class="w">C</span>} &gt; <span class="n">1</span> ? <span class="i">$ElementsCountRef</span>-&gt;{<span class="w">C</span>} <span class="co">:</span> <span class="q">&#39;&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 847     <span class="k">delete</span> <span class="i">$ElementsCountRef</span>-&gt;{<span class="w">C</span>}<span class="sc">;</span>
+ 848 
+ 849     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ElementsCountRef</span>-&gt;{<span class="w">H</span>} <span class="s">)</span> <span class="s">{</span>
+ 850       <span class="i">$MolecularFormula</span> .= <span class="q">&#39;H&#39;</span> . <span class="s">(</span><span class="i">$ElementsCountRef</span>-&gt;{<span class="w">H</span>} &gt; <span class="n">1</span> ? <span class="i">$ElementsCountRef</span>-&gt;{<span class="w">H</span>} <span class="co">:</span> <span class="q">&#39;&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 851       <span class="k">delete</span> <span class="i">$ElementsCountRef</span>-&gt;{<span class="w">H</span>}<span class="sc">;</span>
+ 852     <span class="s">}</span>
+ 853   <span class="s">}</span>
+ 854 
+ 855   <span class="c"># Sort elements...</span>
+ 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>
+ 857     <span class="i">$MolecularFormula</span> .= <span class="i">$AtomSymbol</span> . <span class="s">(</span><span class="i">$ElementsCountRef</span>-&gt;{<span class="i">$AtomSymbol</span>} &gt; <span class="n">1</span> ? <span class="i">$ElementsCountRef</span>-&gt;{<span class="i">$AtomSymbol</span>} <span class="co">:</span> <span class="q">&#39;&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 858   <span class="s">}</span>
+ 859 
+ 860   <span class="c"># Sort non-elements...</span>
+ 861   <span class="k">if</span> <span class="s">(</span><span class="i">$IncludeNonElements</span><span class="s">)</span> <span class="s">{</span>
+ 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>
+ 863       <span class="i">$MolecularFormula</span> .= <span class="i">$AtomSymbol</span> . <span class="s">(</span><span class="i">$NonElementsCountRef</span>-&gt;{<span class="i">$AtomSymbol</span>} &gt; <span class="n">1</span> ? <span class="i">$NonElementsCountRef</span>-&gt;{<span class="i">$AtomSymbol</span>} <span class="co">:</span> <span class="q">&#39;&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 864     <span class="s">}</span>
+ 865   <span class="s">}</span>
+ 866 
+ 867   <span class="c"># Check formal charge...</span>
+ 868   <span class="k">my</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span><span class="sc">;</span>
+ 869   <span class="i">$FormalCharge</span> = <span class="i">$This</span><span class="i">-&gt;GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 870   <span class="k">if</span> <span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span> <span class="s">{</span>
+ 871     <span class="c"># Setup formal charge string...</span>
+ 872     <span class="k">my</span><span class="s">(</span><span class="i">$FormalChargeString</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 874       <span class="i">$FormalChargeString</span> =  <span class="q">&quot;+&quot;</span><span class="sc">;</span>
+ 875     <span class="s">}</span>
+ 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>
+ 877       <span class="i">$FormalChargeString</span> =  <span class="q">&quot;-&quot;</span><span class="sc">;</span>
+ 878     <span class="s">}</span>
+ 879     <span class="k">else</span> <span class="s">{</span>
+ 880       <span class="i">$FormalChargeString</span> = <span class="s">(</span><span class="i">$FormalCharge</span> &gt; <span class="n">0</span><span class="s">)</span> ? <span class="s">(</span><span class="q">&quot;+&quot;</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">&quot;-&quot;</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>
+ 881     <span class="s">}</span>
+ 882     <span class="i">$MolecularFormula</span> = <span class="q">&quot;${MolecularFormula}${FormalChargeString}&quot;</span><span class="sc">;</span>
+ 883   <span class="s">}</span>
+ 884 
+ 885   <span class="k">return</span> <span class="i">$MolecularFormula</span><span class="sc">;</span>
+ 886 <span class="s">}</span>
+ 887 
+ 888 <span class="c"># Count elements and non-elements in molecule and return references to hashes</span>
+ 889 <span class="c"># containing count of elements and non-elements respectively. By default, missing</span>
+ 890 <span class="c"># hydrogens are not added to the element hash.</span>
+ 891 <span class="c">#</span>
+ 892 <span class="c">#</span>
+<a name="GetElementsAndNonElements-"></a> 893 <span class="k">sub </span><span class="m">GetElementsAndNonElements</span> <span class="s">{</span>
+ 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>
+ 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>
+ 896 
+ 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>
+ 898 
+ 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>
+ 900   <span class="i">$NumOfMissingHydrogens</span> = <span class="n">0</span><span class="sc">;</span>
+ 901 
+ 902   <span class="c"># Count elements and non elements...</span>
+ 903   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 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>
+ 905     <span class="i">$AtomicNumber</span> = <span class="i">$Atom</span><span class="i">-&gt;GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 906     <span class="i">$AtomSymbol</span> = <span class="i">$Atom</span><span class="i">-&gt;GetAtomSymbol</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 907     <span class="k">if</span> <span class="s">(</span><span class="i">$AtomicNumber</span><span class="s">)</span> <span class="s">{</span>
+ 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>
+ 909         <span class="i">$ElementsCount</span>{<span class="i">$AtomSymbol</span>} += <span class="n">1</span><span class="sc">;</span>
+ 910       <span class="s">}</span>
+ 911       <span class="k">else</span> <span class="s">{</span>
+ 912         <span class="i">$ElementsCount</span>{<span class="i">$AtomSymbol</span>} = <span class="n">1</span><span class="sc">;</span>
+ 913       <span class="s">}</span>
+ 914       <span class="k">if</span> <span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> <span class="s">{</span>
+ 915         <span class="i">$NumOfMissingHydrogens</span> += <span class="i">$Atom</span><span class="i">-&gt;GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 916       <span class="s">}</span>
+ 917     <span class="s">}</span>
+ 918     <span class="k">else</span> <span class="s">{</span>
+ 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>
+ 920         <span class="i">$NonElementsCount</span>{<span class="i">$AtomSymbol</span>} += <span class="n">1</span><span class="sc">;</span>
+ 921       <span class="s">}</span>
+ 922       <span class="k">else</span> <span class="s">{</span>
+ 923         <span class="i">$NonElementsCount</span>{<span class="i">$AtomSymbol</span>} = <span class="n">1</span><span class="sc">;</span>
+ 924       <span class="s">}</span>
+ 925     <span class="s">}</span>
+ 926   <span class="s">}</span>
+ 927   <span class="k">if</span> <span class="s">(</span><span class="i">$IncludeMissingHydrogens</span> &amp;&amp; <span class="i">$NumOfMissingHydrogens</span><span class="s">)</span> <span class="s">{</span>
+ 928     <span class="i">$AtomSymbol</span> = <span class="q">&#39;H&#39;</span><span class="sc">;</span>
+ 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>
+ 930       <span class="i">$ElementsCount</span>{<span class="i">$AtomSymbol</span>} += <span class="i">$NumOfMissingHydrogens</span><span class="sc">;</span>
+ 931     <span class="s">}</span>
+ 932     <span class="k">else</span> <span class="s">{</span>
+ 933       <span class="i">$ElementsCount</span>{<span class="i">$AtomSymbol</span>} = <span class="i">$NumOfMissingHydrogens</span><span class="sc">;</span>
+ 934     <span class="s">}</span>
+ 935   <span class="s">}</span>
+ 936 
+ 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>
+ 938 <span class="s">}</span>
+ 939 
+ 940 <span class="c"># Get number of element and non-elements in molecule. By default, missing</span>
+ 941 <span class="c"># hydrogens are not added to element count.</span>
+ 942 <span class="c">#</span>
+<a name="GetNumOfElementsAndNonElements-"></a> 943 <span class="k">sub </span><span class="m">GetNumOfElementsAndNonElements</span> <span class="s">{</span>
+ 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>
+ 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>
+ 946 
+ 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>
+ 948 
+ 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>
+ 950 
+ 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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 952     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 953       <span class="i">$NonElementCount</span>++<span class="sc">;</span>
+ 954       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span>
+ 955     <span class="s">}</span>
+ 956     <span class="c"># Process element...</span>
+ 957     <span class="i">$ElementCount</span>++<span class="sc">;</span>
+ 958     <span class="k">if</span> <span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span> <span class="s">{</span>
+ 959       <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;IsHydrogen</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 960         <span class="i">$ElementCount</span> += <span class="i">$Atom</span><span class="i">-&gt;GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 961       <span class="s">}</span>
+ 962     <span class="s">}</span>
+ 963   <span class="s">}</span>
+ 964 
+ 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>
+ 966 <span class="s">}</span>
+ 967 
+ 968 <span class="c"># Calculate elemental composition and return reference to arrays</span>
+ 969 <span class="c"># containing elements and their percent composition.</span>
+ 970 <span class="c">#</span>
+ 971 <span class="c"># Caveats:</span>
+ 972 <span class="c">#   . By default, missing hydrogens are included</span>
+ 973 <span class="c">#   . Non elemnents are ignored</span>
+ 974 <span class="c">#   . Mass number are ignored</span>
+ 975 <span class="c">#</span>
+<a name="GetElementalComposition-"></a> 976 <span class="k">sub </span><span class="m">GetElementalComposition</span> <span class="s">{</span>
+ 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>
+ 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>
+ 979 
+ 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>
+ 981 
+ 982   <span class="i">$IncludeNonElements</span> = <span class="n">0</span><span class="sc">;</span>
+ 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">-&gt;GetElementsAndNonElements</span><span class="s">(</span><span class="i">$IncludeMissingHydrogens</span><span class="s">)</span><span class="sc">;</span>
+ 984 
+ 985   <span class="i">$MolecularFormula</span> = <span class="i">$This</span><span class="i">-&gt;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>
+ 986 
+ 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>
+ 988 
+ 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>
+ 990 <span class="s">}</span>
+ 991 
+ 992 <span class="c"># Using refernece to element and its composition arrays, format composition information</span>
+ 993 <span class="c"># as: Element: Composition;...</span>
+ 994 <span class="c">#</span>
+<a name="FormatElementalCompositionInformation-"></a> 995 <span class="k">sub </span><span class="m">FormatElementalCompositionInformation</span> <span class="s">{</span>
+ 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>
+ 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>
+ 998 
+ 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>
+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>
+1001   <span class="s">}</span>
+1002   <span class="k">else</span> <span class="s">{</span>
+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>
+1004   <span class="s">}</span>
+1005   <span class="k">my</span><span class="s">(</span><span class="i">$FormattedInfo</span><span class="s">)</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+1006 
+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> &amp;&amp; <span class="i">@</span>{<span class="i">$ElementsRef</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1008     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;FormatElementalCompositionInformation: Elements list is not defined or empty...&quot;</span><span class="sc">;</span>
+1009     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1010   <span class="s">}</span>
+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> &amp;&amp; <span class="i">@</span>{<span class="i">$ElementCompositionRef</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1012     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;FormatElementalCompositionInformation: Elements composition list is not defined or empty...&quot;</span><span class="sc">;</span>
+1013     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1014   <span class="s">}</span>
+1015 
+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>
+1017     <span class="i">$Precision</span> = <span class="n">2</span><span class="sc">;</span>
+1018   <span class="s">}</span>
+1019 
+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>
+1021 
+1022   <span class="k">return</span> <span class="i">$FormattedInfo</span><span class="sc">;</span>
+1023 <span class="s">}</span>
+1024 
+1025 <span class="c"># Copy molecule and its associated data using Storable::dclone and update:</span>
+1026 <span class="c">#</span>
+1027 <span class="c">#   o Atom references corresponding atoms and bonds objects</span>
+1028 <span class="c">#   o Bond object references</span>
+1029 <span class="c">#</span>
+1030 <span class="c"># Object IDs for Atoms and Bonds don&#39;t get changed. So there is no need to clear</span>
+1031 <span class="c"># up any exisiting ring data attached to molecule via graph as vertex IDs.</span>
+1032 <span class="c">#</span>
+<a name="Copy-"></a>1033 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span>
+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>
+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>
+1036 
+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>
+1038 
+1039   <span class="c"># Update atom references stored as vertex property...</span>
+1040 
+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>
+1042   <span class="i">%AtomsIDsToNewAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1043 
+1044   <span class="i">@AtomIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1045   <span class="k">if</span> <span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span> <span class="s">{</span>
+1046     <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetVerticesProperty</span><span class="s">(</span><span class="q">&#39;Atom&#39;</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span>
+1047   <span class="s">}</span>
+1048 
+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>
+1050     <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1051 
+1052     <span class="c"># Setup a reference to copied atom object...</span>
+1053     <span class="i">$NewAtom</span> = <span class="i">$Atom</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1054     <span class="i">$AtomsIDsToNewAtoms</span>{<span class="i">$AtomID</span>} = <span class="i">$NewAtom</span><span class="sc">;</span>
+1055 
+1056     <span class="c"># Update atom reference to new atom object...</span>
+1057     <span class="i">$NewMolecule</span><span class="i">-&gt;UpdateVertexProperty</span><span class="s">(</span><span class="q">&#39;Atom&#39;</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>
+1058   <span class="s">}</span>
+1059 
+1060   <span class="c"># Update bond object and bond atom references stored as edge property...</span>
+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>
+1062   <span class="i">@EdgesAtomsIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1063   <span class="i">@EdgesAtomsIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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> &lt; <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>
+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>
+1066 
+1067     <span class="c"># Get reference to bond object...</span>
+1068     <span class="i">$Bond</span> = <span class="i">$This</span><span class="i">-&gt;GetEdgeProperty</span><span class="s">(</span><span class="q">&#39;Bond&#39;</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>
+1069 
+1070     <span class="c"># Make a new bond object and update its atom references...</span>
+1071     <span class="i">$NewBond</span> = <span class="i">$Bond</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1072     <span class="i">$NewAtom1</span> = <span class="i">$AtomsIDsToNewAtoms</span>{<span class="i">$AtomID1</span>}<span class="sc">;</span>
+1073     <span class="i">$NewAtom2</span> = <span class="i">$AtomsIDsToNewAtoms</span>{<span class="i">$AtomID2</span>}<span class="sc">;</span>
+1074     <span class="i">$NewBond</span><span class="i">-&gt;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>
+1075 
+1076     <span class="c"># Update bond object reference in the new molecule...</span>
+1077     <span class="i">$NewMolecule</span><span class="i">-&gt;UpdateEdgeProperty</span><span class="s">(</span><span class="q">&#39;Bond&#39;</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>
+1078   <span class="s">}</span>
+1079 
+1080   <span class="k">return</span> <span class="i">$NewMolecule</span><span class="sc">;</span>
+1081 <span class="s">}</span>
+1082 
+1083 <span class="c"># Get number of connected components...</span>
+1084 <span class="c">#</span>
+<a name="GetNumOfConnectedComponents-"></a>1085 <span class="k">sub </span><span class="m">GetNumOfConnectedComponents</span> <span class="s">{</span>
+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>
+1087   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfComponents</span><span class="s">)</span><span class="sc">;</span>
+1088 
+1089   <span class="i">$NumOfComponents</span> = <span class="i">$This</span><span class="i">-&gt;GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1090 
+1091   <span class="k">return</span> <span class="i">$NumOfComponents</span><span class="sc">;</span>
+1092 <span class="s">}</span>
+1093 
+1094 <span class="c"># Return a reference to an array containing molecules corresponding</span>
+1095 <span class="c"># to connected components sorted in decreasing order of component size...</span>
+1096 <span class="c">#</span>
+<a name="GetConnectedComponents-"></a>1097 <span class="k">sub </span><span class="m">GetConnectedComponents</span> <span class="s">{</span>
+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>
+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>
+1100 
+1101   <span class="i">@ConnectedComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1102   <span class="i">@ConnectedComponents</span> = <span class="i">$This</span><span class="i">-&gt;GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1103   <span class="i">@ComponentMolecules</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1104 
+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>
+1106     <span class="k">push</span> <span class="i">@ComponentMolecules</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_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>
+1107   <span class="s">}</span>
+1108   <span class="k">return</span> <span class="i">@ComponentMolecules</span><span class="sc">;</span>
+1109 <span class="s">}</span>
+1110 
+1111 <span class="c"># Return a reference to largest connected component as a molecule object...</span>
+1112 <span class="c">#</span>
+<a name="GetLargestConnectedComponent-"></a>1113 <span class="k">sub </span><span class="m">GetLargestConnectedComponent</span> <span class="s">{</span>
+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>
+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>
+1116 
+1117   <span class="i">$LargestComponentIndex</span> = <span class="n">0</span><span class="sc">;</span>
+1118   <span class="i">@ConnectedComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1119   <span class="i">@ConnectedComponents</span> = <span class="i">$This</span><span class="i">-&gt;GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1120 
+1121   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_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>
+1122 <span class="s">}</span>
+1123 
+1124 <span class="c"># Return connected component as a molecule...</span>
+1125 <span class="c">#</span>
+<a name="_GetConnectedComponent-"></a>1126 <span class="k">sub </span><span class="m">_GetConnectedComponent</span> <span class="s">{</span>
+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>
+1128   <span class="k">my</span><span class="s">(</span><span class="i">$ComponentMolecule</span><span class="s">)</span><span class="sc">;</span>
+1129 
+1130   <span class="c"># Copy existing molecule...</span>
+1131   <span class="i">$ComponentMolecule</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1132 
+1133   <span class="c"># Delete all atoms besides the ones in specified component...</span>
+1134   <span class="i">$ComponentMolecule</span><span class="i">-&gt;_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>
+1135 
+1136   <span class="c"># Clear any deteced rings...</span>
+1137   <span class="k">if</span> <span class="s">(</span><span class="i">$ComponentMolecule</span><span class="i">-&gt;HasRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1138     <span class="i">$ComponentMolecule</span><span class="i">-&gt;ClearRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1139   <span class="s">}</span>
+1140   <span class="k">return</span> <span class="i">$ComponentMolecule</span><span class="sc">;</span>
+1141 <span class="s">}</span>
+1142 
+1143 <span class="c"># Delete atoms corresponding to all connected components except the one specified...</span>
+1144 <span class="c">#</span>
+<a name="_DeleteConnectedComponents-"></a>1145 <span class="k">sub </span><span class="m">_DeleteConnectedComponents</span> <span class="s">{</span>
+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>
+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>
+1148 
+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>
+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>
+1151       <span class="k">next</span> <span class="j">INDEX</span><span class="sc">;</span>
+1152     <span class="s">}</span>
+1153     <span class="k">for</span> <span class="i">$AtomID</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConnectedComponentsRef</span>-&gt;[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span>
+1154       <span class="i">$This</span><span class="i">-&gt;DeleteVertex</span><span class="s">(</span><span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span>
+1155     <span class="s">}</span>
+1156   <span class="s">}</span>
+1157   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1158 <span class="s">}</span>
+1159 
+1160 <span class="c"># Return an array containing references to atom arrays corresponding to atoms of</span>
+1161 <span class="c"># connected components sorted in order of their decreasing size...</span>
+1162 <span class="c">#</span>
+<a name="GetConnectedComponentsAtoms-"></a>1163 <span class="k">sub </span><span class="m">GetConnectedComponentsAtoms</span> <span class="s">{</span>
+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>
+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>
+1166 
+1167   <span class="i">@ConnectedComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1168   <span class="i">@ConnectedComponents</span> = <span class="i">$This</span><span class="i">-&gt;GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1169 
+1170   <span class="i">@ComponentsAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+1172     <span class="k">my</span><span class="s">(</span><span class="i">@ComponentAtoms</span><span class="s">)</span><span class="sc">;</span>
+1173 
+1174     <span class="i">@ComponentAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1175     <span class="i">@ComponentAtoms</span> = <span class="i">$This</span><span class="i">-&gt;_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>
+1176     <span class="k">push</span> <span class="i">@ComponentsAtoms</span><span class="cm">,</span> \<span class="i">@ComponentAtoms</span><span class="sc">;</span>
+1177   <span class="s">}</span>
+1178   <span class="k">return</span> <span class="i">@ComponentsAtoms</span><span class="sc">;</span>
+1179 <span class="s">}</span>
+1180 
+1181 <span class="c"># Return an array containing atoms correspondig to largest connected component...</span>
+1182 <span class="c">#</span>
+<a name="GetLargestConnectedComponentAtoms-"></a>1183 <span class="k">sub </span><span class="m">GetLargestConnectedComponentAtoms</span> <span class="s">{</span>
+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>
+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>
+1186 
+1187   <span class="i">$LargestComponentIndex</span> = <span class="n">0</span><span class="sc">;</span>
+1188   <span class="i">@ConnectedComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1189   <span class="i">@ConnectedComponents</span> = <span class="i">$This</span><span class="i">-&gt;GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1190 
+1191   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_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>
+1192 <span class="s">}</span>
+1193 
+1194 <span class="c"># Return an array containing atoms corresponding to specified connected component...</span>
+1195 <span class="c">#</span>
+<a name="_GetConnectedComponentAtoms-"></a>1196 <span class="k">sub </span><span class="m">_GetConnectedComponentAtoms</span> <span class="s">{</span>
+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>
+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>
+1199 
+1200   <span class="i">@ComponentAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1201   <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1202 
+1203   <span class="k">for</span> <span class="i">$AtomID</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConnectedComponentsRef</span>-&gt;[<span class="i">$ComponentIndex</span>]}<span class="s">)</span> <span class="s">{</span>
+1204     <span class="k">push</span> <span class="i">@AtomIDs</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="sc">;</span>
+1205   <span class="s">}</span>
+1206   <span class="i">@ComponentAtoms</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span>
+1207 
+1208   <span class="k">return</span> <span class="i">@ComponentAtoms</span><span class="sc">;</span>
+1209 <span class="s">}</span>
+1210 
+1211 <span class="c"># Except for the largest connected component, delete atoms corresponding to all other</span>
+1212 <span class="c"># connected components...</span>
+1213 <span class="c">#</span>
+<a name="KeepLargestComponent-"></a>1214 <span class="k">sub </span><span class="m">KeepLargestComponent</span> <span class="s">{</span>
+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>
+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>
+1217 
+1218   <span class="i">@ConnectedComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1219   <span class="i">@ConnectedComponents</span> = <span class="i">$This</span><span class="i">-&gt;GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+1221     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1222   <span class="s">}</span>
+1223   <span class="i">$LargestComponentIndex</span> = <span class="n">0</span><span class="sc">;</span>
+1224   <span class="i">$This</span><span class="i">-&gt;_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>
+1225 
+1226   <span class="c"># Clear any deteced rings...</span>
+1227   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1228     <span class="i">$This</span><span class="i">-&gt;ClearRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1229   <span class="s">}</span>
+1230 
+1231   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1232 <span class="s">}</span>
+1233 
+1234 <span class="c"># Get an array of topologically sorted atoms starting from a specified atom or</span>
+1235 <span class="c"># an arbitrary atom in the molecule...</span>
+1236 <span class="c">#</span>
+<a name="GetTopologicallySortedAtoms-"></a>1237 <span class="k">sub </span><span class="m">GetTopologicallySortedAtoms</span> <span class="s">{</span>
+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>
+1239   <span class="k">my</span><span class="s">(</span><span class="i">@SortedAtoms</span><span class="s">)</span><span class="sc">;</span>
+1240 
+1241   <span class="i">@SortedAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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> &amp;&amp; !<span class="i">$This</span><span class="i">-&gt;HasAtom</span><span class="s">(</span><span class="i">$StartAtom</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1243     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetTopologicallySortedAtoms: No atoms retrieved: Start atom doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+1244     <span class="k">return</span> <span class="i">@SortedAtoms</span><span class="sc">;</span>
+1245   <span class="s">}</span>
+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>
+1247 
+1248   <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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">-&gt;GetID</span><span class="s">(</span><span class="s">)</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span>
+1250 
+1251   <span class="i">@AtomIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetTopologicallySortedVertices</span><span class="s">(</span><span class="i">$StartAtomID</span><span class="s">)</span><span class="sc">;</span>
+1252   <span class="i">@SortedAtoms</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span>
+1253 
+1254   <span class="k">return</span> <span class="i">@SortedAtoms</span><span class="sc">;</span>
+1255 <span class="s">}</span>
+1256 
+1257 <span class="c"># Detect rings in molecule...</span>
+1258 <span class="c">#</span>
+<a name="DetectRings-"></a>1259 <span class="k">sub </span><span class="m">DetectRings</span> <span class="s">{</span>
+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>
+1261 
+1262   <span class="c"># Use graph method to detect all cycles and associate &#39;em to graph as graph</span>
+1263   <span class="c"># and vertex properties...</span>
+1264   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;DetectCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1265 <span class="s">}</span>
+1266 
+1267 <span class="c"># Clear rings in molecule...</span>
+1268 <span class="c">#</span>
+<a name="ClearRings-"></a>1269 <span class="k">sub </span><span class="m">ClearRings</span> <span class="s">{</span>
+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>
+1271 
+1272   <span class="c"># Use graph method to clear all cycles...</span>
+1273   <span class="i">$This</span><span class="i">-&gt;ClearCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1274 
+1275   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1276 <span class="s">}</span>
+1277 
+1278 <span class="c"># Setup rings type paths to use during all ring related methods. Possible values:</span>
+1279 <span class="c"># Independent or All. Default is to use Independent rings.</span>
+1280 <span class="c">#</span>
+<a name="SetActiveRings-"></a>1281 <span class="k">sub </span><span class="m">SetActiveRings</span> <span class="s">{</span>
+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>
+1283 
+1284   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$This</span><span class="i">-&gt;SetActiveCyclicPaths</span><span class="s">(</span><span class="i">$RingsType</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1285     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1286   <span class="s">}</span>
+1287   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1288 <span class="s">}</span>
+1289 
+1290 <span class="c"># Is it a supported aromaticity model?</span>
+1291 <span class="c">#</span>
+<a name="IsSupportedAromaticityModel-"></a>1292 <span class="k">sub </span><span class="m">IsSupportedAromaticityModel</span> <span class="s">{</span>
+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>
+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>
+1295 
+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>
+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>
+1298   <span class="s">}</span>
+1299   <span class="k">else</span> <span class="s">{</span>
+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>
+1301   <span class="s">}</span>
+1302 
+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>
+1304 <span class="s">}</span>
+1305 
+1306 <span class="c"># Get a list of supported aromaticity model names...</span>
+1307 <span class="c">#</span>
+<a name="GetSupportedAromaticityModels-"></a>1308 <span class="k">sub </span><span class="m">GetSupportedAromaticityModels</span> <span class="s">{</span>
+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>
+1310 <span class="s">}</span>
+1311 
+1312 <span class="c"># Set aromaticity model...</span>
+1313 <span class="c">#</span>
+<a name="SetAromaticityModel-"></a>1314 <span class="k">sub </span><span class="m">SetAromaticityModel</span> <span class="s">{</span>
+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>
+1316 
+1317   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSupportedAromaticityModel</span><span class="s">(</span><span class="i">$AromaticityModel</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+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">-&gt;GetSupportedAromaticityModels</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1319 
+1320     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetAromaticityModel: The current release of MayaChemTools doesn&#39;t support the specified aromaticity model $AromaticityModel. Supported aromaticity models defined in AromaticityModelsData.csv file are: @SupportedModels . Using MayaChemToolsAromaticityModel...&quot;</span><span class="sc">;</span>
+1321     <span class="i">$AromaticityModel</span> = <span class="q">&#39;MayaChemToolsAromaticityModel&#39;</span><span class="sc">;</span>
+1322   <span class="s">}</span>
+1323 
+1324   <span class="i">$This</span><span class="i">-&gt;SetProperty</span><span class="s">(</span><span class="q">&#39;AromaticityModel&#39;</span><span class="cm">,</span> <span class="i">$AromaticityModel</span><span class="s">)</span><span class="sc">;</span>
+1325 
+1326   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1327 <span class="s">}</span>
+1328 
+1329 <span class="c"># Get aromaticity model...</span>
+1330 <span class="c">#</span>
+<a name="GetAromaticityModel-"></a>1331 <span class="k">sub </span><span class="m">GetAromaticityModel</span> <span class="s">{</span>
+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>
+1333 
+1334   <span class="c"># Is ValenceModel property explicitly set?</span>
+1335   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasProperty</span><span class="s">(</span><span class="q">&#39;AromaticityModel&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1336     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetProperty</span><span class="s">(</span><span class="q">&#39;AromaticityModel&#39;</span><span class="s">)</span><span class="sc">;</span>
+1337   <span class="s">}</span>
+1338 
+1339   <span class="c"># Used internal aromaticity model as default model...</span>
+1340   <span class="k">return</span> <span class="q">&#39;MayaChemToolsAromaticityModel&#39;</span><span class="sc">;</span>
+1341 <span class="s">}</span>
+1342 
+1343 <span class="c"># Identify aromatic rings and ring systems in a molecule and set aromaticity for</span>
+1344 <span class="c"># corresponding atoms and bonds.</span>
+1345 <span class="c">#</span>
+1346 <span class="c"># What is aromaticity? [ Ref 124 ] It&#39;s in the code of the implementer, did you</span>
+1347 <span class="c"># say? Agree. The implementation of aromaticity varies widely across different</span>
+1348 <span class="c"># packages [ Ref 125 ]; additionally, the implementation details are not always</span>
+1349 <span class="c"># completely available, and it&#39;s not possible to figure out the exact implementation</span>
+1350 <span class="c"># of aromaticity across various packages. Using the publicly available information,</span>
+1351 <span class="c"># however, one can try to reproduce the available results to the extent possible,</span>
+1352 <span class="c"># along with parameterizing all the control parameters used to implement different</span>
+1353 <span class="c"># aromaticity models, and that&#39;s exactly what the current release of MayaChemTools</span>
+1354 <span class="c"># does.</span>
+1355 <span class="c">#</span>
+1356 <span class="c"># The implementation of aromaticity corresponding to various aromaticity models in</span>
+1357 <span class="c"># MayaChemTools package is driven by an external CSV file AromaticityModelsData.csv,</span>
+1358 <span class="c"># which is distributed with the package and is available in lib/data directory. The CSV</span>
+1359 <span class="c"># files contains names of supported aromaticity models, along with various control</span>
+1360 <span class="c"># parameters and their values. This file is loaded and processed during instantiation</span>
+1361 <span class="c"># of Molecule class and data corresponding to specific aromaticity model are used</span>
+1362 <span class="c"># to detect aromaticity for that model. Any new aromaticity model added to the</span>
+1363 <span class="c"># aromaticity data file, using different combinations of values for existing control</span>
+1364 <span class="c"># parameters would work without any changes to the code; the addition of any new</span>
+1365 <span class="c"># control parameters, however, requires its implementation in the code used to</span>
+1366 <span class="c"># calculate number of pi electrons available towards delocalization in a ring or ring</span>
+1367 <span class="c"># systems.</span>
+1368 <span class="c">#</span>
+1369 <span class="c"># The current release of MayaChemTools package supports these aromaticity</span>
+1370 <span class="c"># models: MDLAromaticityModel, TriposAromaticityModel, MMFFAromaticityModel,</span>
+1371 <span class="c"># ChemAxonBasicAromaticityModel, ChemAxonGeneralAromaticityModel,</span>
+1372 <span class="c"># DaylightAromaticityModel, MayaChemToolsAromaticityModel.</span>
+1373 <span class="c">#</span>
+1374 <span class="c"># The current list of control parameters available to detect aromaticity corresponding</span>
+1375 <span class="c"># to different aromaticity models are: AllowHeteroRingAtoms, HeteroRingAtomsList,</span>
+1376 <span class="c"># AllowExocyclicDoubleBonds, AllowHomoNuclearExocyclicDoubleBonds,</span>
+1377 <span class="c"># AllowElectronegativeRingAtomExocyclicDoubleBonds, AllowRingAtomFormalCharge,</span>
+1378 <span class="c"># AllowHeteroRingAtomFormalCharge, MinimumRingSize. The values for these control</span>
+1379 <span class="c"># parameters are specified in AromaticityModelsData.csv file.</span>
+1380 <span class="c">#</span>
+1381 <span class="c"># Although definition of aromaticity differs across various aromaticity models, a ring</span>
+1382 <span class="c"># or a ring system containing 4n + 2 pi electrons (Huckel&#39;s rule) corresponding to</span>
+1383 <span class="c"># alternate single and double bonds, in general, is considered aromatic.</span>
+1384 <span class="c">#</span>
+1385 <span class="c"># The available valence free electrons on heterocyclic ring atoms, involved in two single</span>
+1386 <span class="c"># ring bonds, are also allowed to participate in pi electron delocalizaiton for most of</span>
+1387 <span class="c"># the supported aromaticity models.</span>
+1388 <span class="c">#</span>
+1389 <span class="c"># The presence of exocyclic terminal double bond on ring atoms involved in pi electron</span>
+1390 <span class="c"># delocalization is only allowed for some of the aromaticity models. Additionally, the type</span>
+1391 <span class="c"># atoms involved in exocyclic terminal double bonds may result in making a ring or ring</span>
+1392 <span class="c"># system non-aromatic.</span>
+1393 <span class="c">#</span>
+<a name="DetectAromaticity-"></a>1394 <span class="k">sub </span><span class="m">DetectAromaticity</span> <span class="s">{</span>
+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>
+1396 
+1397   <span class="c"># Delete aromaticity property for atoms and bonds...</span>
+1398   <span class="i">$This</span><span class="i">-&gt;DeleteAromaticity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1399 
+1400   <span class="c"># Any ring out there...</span>
+1401   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1402     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1403   <span class="s">}</span>
+1404 
+1405   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasFusedRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1406     <span class="i">$This</span><span class="i">-&gt;_DetectAromaticityUsingFusedRingSets</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1407   <span class="s">}</span>
+1408   <span class="k">else</span> <span class="s">{</span>
+1409     <span class="i">$This</span><span class="i">-&gt;_DetectAromaticityUsingIndividualRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1410   <span class="s">}</span>
+1411   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1412 <span class="s">}</span>
+1413 
+1414 <span class="c"># Go over all rings and set aromaticity property for corresponding ring atoms</span>
+1415 <span class="c"># and bonds involved in aromatic rings...</span>
+1416 <span class="c">#</span>
+<a name="_DetectAromaticityUsingIndividualRings-"></a>1417 <span class="k">sub </span><span class="m">_DetectAromaticityUsingIndividualRings</span> <span class="s">{</span>
+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>
+1419 
+1420   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_DetectRingsAromaticity</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+1421 <span class="s">}</span>
+1422 
+1423 <span class="c"># For each fused ring set, detect aromaticity by treating all of its ring as one aromatic</span>
+1424 <span class="c"># system for counting pi electrons to satisfy Huckel&#39;s rule; In case of a failure, rings in</span>
+1425 <span class="c"># fused set are treated individually for aromaticity detection. Additionally, non-fused</span>
+1426 <span class="c"># rings are handled on their own during aromaticity detection.</span>
+1427 <span class="c">#</span>
+1428 <span class="c"># Note:</span>
+1429 <span class="c">#   . pi electrons in common bonds involved in fused ring sets are only counted once.</span>
+1430 <span class="c">#</span>
+1431 <span class="c">#</span>
+<a name="_DetectAromaticityUsingFusedRingSets-"></a>1432 <span class="k">sub </span><span class="m">_DetectAromaticityUsingFusedRingSets</span> <span class="s">{</span>
+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>
+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>
+1435 
+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">-&gt;GetFusedAndNonFusedRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1437 
+1438   <span class="i">@FusedRingSetIsAromatic</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+1440     <span class="i">$FusedRingSetRef</span> = <span class="i">$FusedRingSetsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+1441     <span class="i">$FusedRingSetIsAromatic</span>[<span class="i">$Index</span>] = <span class="n">0</span><span class="sc">;</span>
+1442 
+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>
+1444 
+1445     <span class="i">$NumOfPiElectronsInRingSet</span> = <span class="n">0</span><span class="sc">;</span>
+1446 
+1447     <span class="i">%FusedRingSetsBondsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1448     <span class="i">%FusedRingSetsBondsVisitedMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1449     <span class="i">%FusedRingBondsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1450 
+1451     <span class="c"># Setup a bond ID map for all bonds in fused ring set and another one</span>
+1452     <span class="c"># for bonds involved in more than one ring...</span>
+1453     <span class="c">#</span>
+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>
+1455       <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;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>
+1456         <span class="i">$BondID</span> = <span class="i">$Bond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1457         <span class="i">$FusedRingSetsBondsMap</span>{<span class="i">$BondID</span>} = <span class="i">$BondID</span><span class="sc">;</span>
+1458 
+1459         <span class="k">if</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">-&gt;GetNumOfRings</span><span class="s">(</span><span class="s">)</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1460           <span class="i">$FusedRingBondsMap</span>{<span class="i">$BondID</span>} = <span class="i">$BondID</span><span class="sc">;</span>
+1461         <span class="s">}</span>
+1462       <span class="s">}</span>
+1463     <span class="s">}</span>
+1464 
+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>
+1466       <span class="k">my</span><span class="s">(</span><span class="i">@RingBonds</span><span class="s">)</span><span class="sc">;</span>
+1467 
+1468       <span class="i">@RingBonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1469       <span class="i">@RingBonds</span> = <span class="i">$This</span><span class="i">-&gt;GetRingBonds</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="sc">;</span>
+1470       <span class="i">$NumOfPiElectronsInRing</span> = <span class="i">$This</span><span class="i">-&gt;_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>
+1471 
+1472       <span class="k">if</span> <span class="s">(</span>!<span class="i">$NumOfPiElectronsInRing</span><span class="s">)</span> <span class="s">{</span>
+1473         <span class="k">next</span> <span class="j">RINGSET</span><span class="sc">;</span>
+1474       <span class="s">}</span>
+1475       <span class="i">$NumOfPiElectronsInRingSet</span> += <span class="i">$NumOfPiElectronsInRing</span><span class="sc">;</span>
+1476     <span class="s">}</span>
+1477     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;_DoPiElectronSatifyHuckelsRule</span><span class="s">(</span><span class="i">$NumOfPiElectronsInRingSet</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1478       <span class="i">$FusedRingSetIsAromatic</span>[<span class="i">$Index</span>] = <span class="n">1</span><span class="sc">;</span>
+1479     <span class="s">}</span>
+1480   <span class="s">}</span>
+1481 
+1482   <span class="c"># Set atom and bond aromatic flags for ring sets whose pi electrons satisfy Huckel&#39;s rule; otherwise,</span>
+1483   <span class="c"># treat rings in a ring set as individual rings for detecting aromaticity...</span>
+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>
+1485     <span class="i">$FusedRingSetRef</span> = <span class="i">$FusedRingSetsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+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>
+1487       <span class="i">$This</span><span class="i">-&gt;_SetRingsAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$FusedRingSetRef</span>}<span class="s">)</span><span class="sc">;</span>
+1488     <span class="s">}</span>
+1489     <span class="k">else</span> <span class="s">{</span>
+1490       <span class="i">$This</span><span class="i">-&gt;_DetectRingsAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$FusedRingSetRef</span>}<span class="s">)</span><span class="sc">;</span>
+1491     <span class="s">}</span>
+1492   <span class="s">}</span>
+1493 
+1494   <span class="i">$This</span><span class="i">-&gt;_DetectRingsAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$NonFusedRingsRef</span>}<span class="s">)</span><span class="sc">;</span>
+1495 
+1496   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1497 <span class="s">}</span>
+1498 
+1499 <span class="c"># Detect and set aromaticity for rings...</span>
+1500 <span class="c">#</span>
+<a name="_DetectRingsAromaticity-"></a>1501 <span class="k">sub </span><span class="m">_DetectRingsAromaticity</span> <span class="s">{</span>
+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>
+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>
+1504 
+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>
+1506     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_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>
+1507       <span class="k">next</span> <span class="j">RING</span><span class="sc">;</span>
+1508     <span class="s">}</span>
+1509     <span class="i">$This</span><span class="i">-&gt;_SetRingAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="sc">;</span>
+1510   <span class="s">}</span>
+1511   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1512 <span class="s">}</span>
+1513 
+1514 <span class="c"># Set aromatic property for all all atoms and bonds involved in all specified rings..</span>
+1515 <span class="c">#</span>
+<a name="_SetRingsAromaticity-"></a>1516 <span class="k">sub </span><span class="m">_SetRingsAromaticity</span> <span class="s">{</span>
+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>
+1518   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtomsRef</span> <span class="s">)</span><span class="sc">;</span>
+1519 
+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>
+1521     <span class="i">$This</span><span class="i">-&gt;_SetRingAromaticity</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="sc">;</span>
+1522   <span class="s">}</span>
+1523   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1524 <span class="s">}</span>
+1525 
+1526 <span class="c"># Set aromatic property for all all atoms and bonds involved in ring..</span>
+1527 <span class="c">#</span>
+<a name="_SetRingAromaticity-"></a>1528 <span class="k">sub </span><span class="m">_SetRingAromaticity</span> <span class="s">{</span>
+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>
+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>
+1531 
+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>
+1533     <span class="i">$RingAtom</span><span class="i">-&gt;SetAromatic</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span>
+1534   <span class="s">}</span>
+1535   <span class="k">for</span> <span class="i">$RingBond</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetRingBonds</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1536     <span class="i">$RingBond</span><span class="i">-&gt;SetAromatic</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span>
+1537   <span class="s">}</span>
+1538   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1539 <span class="s">}</span>
+1540 
+1541 
+1542 <span class="c"># For a ring to be an aromatic ring, all of its atoms must have aromatic property</span>
+1543 <span class="c"># set.</span>
+1544 <span class="c">#</span>
+<a name="IsRingAromatic-"></a>1545 <span class="k">sub </span><span class="m">IsRingAromatic</span> <span class="s">{</span>
+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>
+1547   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtom</span><span class="s">)</span><span class="sc">;</span>
+1548 
+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>
+1550     <span class="k">if</span> <span class="s">(</span>!<span class="i">$RingAtom</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1551       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1552     <span class="s">}</span>
+1553   <span class="s">}</span>
+1554   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1555 <span class="s">}</span>
+1556 
+1557 <span class="c"># Delete aromatic property for all atoms and bonds...</span>
+1558 <span class="c">#</span>
+<a name="DeleteAromaticity-"></a>1559 <span class="k">sub </span><span class="m">DeleteAromaticity</span> <span class="s">{</span>
+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>
+1561 
+1562   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_DeleteAtomsAndBondsAromaticity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1563 <span class="s">}</span>
+1564 
+1565 <span class="c"># Check ring aromaticity...</span>
+1566 <span class="c">#</span>
+<a name="_CheckRingAromaticity-"></a>1567 <span class="k">sub </span><span class="m">_CheckRingAromaticity</span> <span class="s">{</span>
+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>
+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>
+1570 
+1571   <span class="i">@RingBonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1572   <span class="i">@RingBonds</span> = <span class="i">$This</span><span class="i">-&gt;GetRingBonds</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="sc">;</span>
+1573 
+1574   <span class="i">$NumOfPiElectrons</span> = <span class="i">$This</span><span class="i">-&gt;_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>
+1575 
+1576   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_DoPiElectronSatifyHuckelsRule</span><span class="s">(</span><span class="i">$NumOfPiElectrons</span><span class="s">)</span><span class="sc">;</span>
+1577 <span class="s">}</span>
+1578 
+1579 <span class="c"># Get number of pi electrons available for delocalizaiton in a ring or ring system...</span>
+1580 <span class="c">#</span>
+<a name="_GetNumOfPiElectronsAvailableForDelocalization-"></a>1581 <span class="k">sub </span><span class="m">_GetNumOfPiElectronsAvailableForDelocalization</span> <span class="s">{</span>
+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>
+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>
+1584 
+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">-&gt;GetAromaticityModel</span><span class="s">(</span><span class="s">)</span><span class="s">)</span>}<span class="sc">;</span>
+1586   <span class="i">$AromaticityModelDataRef</span> = \<span class="i">%</span>{<span class="i">$AromaticityModelsDataMap</span>{<span class="i">$AromaticityModelName</span>}}<span class="sc">;</span>
+1587 
+1588   <span class="c"># Perform an intial check for potential atomatic ring atoms..</span>
+1589   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_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>
+1590     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1591   <span class="s">}</span>
+1592 
+1593   <span class="i">$ExocyclicDoubleBondsDataMapRef</span> = <span class="k">undef</span><span class="sc">;</span>
+1594   <span class="i">$ExcludeFreeRadicalElectrons</span> = <span class="n">1</span><span class="sc">;</span>
+1595 
+1596   <span class="i">%ElectronPairContributionProcessedMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1597 
+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">&#39;0&#39;</span><span class="s">)</span> x <span class="n">5</span><span class="sc">;</span>
+1599 
+1600   <span class="c"># Go over ring atoms and bonds to check their participation in aromaticity and count</span>
+1601   <span class="c"># pi electrons available for delocalization corresponding to various aromaticity models...</span>
+1602   <span class="c">#</span>
+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>
+1604     <span class="i">$RingBond</span> = <span class="i">$RingBondsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+1605     <span class="i">$RingAtom</span> = <span class="i">$RingAtomsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+1606     <span class="i">$BondOrder</span> = <span class="i">$RingBond</span><span class="i">-&gt;GetBondOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1607 
+1608     <span class="c"># Is this ring bond part of a fused ring system which has been already processed?</span>
+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> &amp;&amp; <span class="i">$RingBond</span><span class="i">-&gt;GetNumOfRings</span><span class="s">(</span><span class="s">)</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1610       <span class="i">$RingBondID</span> = <span class="i">$RingBond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1611       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$FusedRingSetsBondsVisitedMapRef</span>-&gt;{<span class="i">$RingBondID</span>}<span class="s">)</span> <span class="s">{</span>
+1612         <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span>
+1613       <span class="s">}</span>
+1614       <span class="i">$FusedRingSetsBondsVisitedMapRef</span>-&gt;{<span class="i">$RingBondID</span>} = <span class="i">$RingBondID</span><span class="sc">;</span>
+1615     <span class="s">}</span>
+1616     <span class="i">$NumOfRingBondsProcessed</span>++<span class="sc">;</span>
+1617 
+1618     <span class="c"># For first ring, previous ring bond corrresponds to last ring bond...</span>
+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>
+1620     <span class="i">$PreviousRingBond</span> = <span class="i">$RingBondsRef</span>-&gt;[<span class="i">$PreviousIndex</span>]<span class="sc">;</span>
+1621 
+1622     <span class="c"># Check for presence of alternate single/double bond configuration, and pesence of</span>
+1623     <span class="c"># hetero atoms with two single ring bonds along with any exocyclic double bonds...</span>
+1624     <span class="c">#</span>
+1625     <span class="j">BONDORDER:</span> <span class="s">{</span>
+1626       <span class="c"># Is current ring double bond in an alternate single/double bond configuration?</span>
+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>
+1628         <span class="k">if</span> <span class="s">(</span><span class="i">$PreviousRingBond</span><span class="i">-&gt;GetBondOrder</span><span class="s">(</span><span class="s">)</span> != <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+1629           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1630         <span class="s">}</span>
+1631         <span class="i">$NumOfConjugatedDoubleBonds</span> += <span class="n">1</span><span class="sc">;</span>
+1632         <span class="k">last</span> <span class="j">BONDORDER</span><span class="sc">;</span>
+1633       <span class="s">}</span>
+1634 
+1635       <span class="c"># Is current ring bond order correspond to an explicit aromatic bond?</span>
+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>
+1637         <span class="k">if</span> <span class="s">(</span><span class="i">$PreviousRingBond</span><span class="i">-&gt;GetBondOrder</span><span class="s">(</span><span class="s">)</span> != <span class="n">1.5</span><span class="s">)</span> <span class="s">{</span>
+1638           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1639         <span class="s">}</span>
+1640         <span class="i">$NumOfExplicitAromaticBonds</span> += <span class="n">1</span><span class="sc">;</span>
+1641         <span class="k">last</span> <span class="j">BONDORDER</span><span class="sc">;</span>
+1642       <span class="s">}</span>
+1643 
+1644       <span class="c"># Check for potential hetero atoms involved in two single ring bonds along</span>
+1645       <span class="c"># with any terminal exocyclic bonds...</span>
+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>
+1647         <span class="k">if</span> <span class="s">(</span><span class="i">$PreviousRingBond</span><span class="i">-&gt;GetBondOrder</span><span class="s">(</span><span class="s">)</span> != <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+1648           <span class="c"># Part of a conjugated system...</span>
+1649           <span class="k">last</span> <span class="j">BONDORDER</span><span class="sc">;</span>
+1650         <span class="s">}</span>
+1651 
+1652         <span class="c"># Identify any exocylic bonds on rings atoms...</span>
+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>
+1654           <span class="i">$ExocyclicDoubleBondsDataMapRef</span> = <span class="i">$This</span><span class="i">-&gt;_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>
+1655         <span class="s">}</span>
+1656 
+1657         <span class="c"># Is current ring atom part of an allowed exocyclic terminal bond?</span>
+1658         <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_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>
+1659           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1660         <span class="s">}</span>
+1661 
+1662         <span class="c"># Is it allowed to have any formal charge?</span>
+1663         <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_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>
+1664           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1665         <span class="s">}</span>
+1666 
+1667         <span class="c"># It it an allowed hetero ring atom or a carbon atom?</span>
+1668         <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_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>
+1669           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1670         <span class="s">}</span>
+1671 
+1672         <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1673         <span class="i">$ElectronPairContributionProcessedMap</span>{<span class="i">$RingAtomID</span>} = <span class="i">$RingAtomID</span><span class="sc">;</span>
+1674 
+1675         <span class="c"># Is it able to donate a pair for electrons towards pi electron delocalization?</span>
+1676         <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">-&gt;GetValenceFreeElectrons</span><span class="s">(</span><span class="i">$ExcludeFreeRadicalElectrons</span><span class="s">)</span> &gt;= <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1677           <span class="c"># Possibilites:</span>
+1678           <span class="c">#   . Hetero atom with or without formal charge and an available electron pair</span>
+1679           <span class="c">#   . Carbon atom with -ve formal charge and with an available electron pair</span>
+1680           <span class="c">#</span>
+1681           <span class="i">$NumOfRingAtomElectronPairs</span> += <span class="n">1</span><span class="sc">;</span>
+1682         <span class="s">}</span>
+1683         <span class="k">else</span> <span class="s">{</span>
+1684           <span class="c"># Is ring atom involved in two single bonds without any electron pair allowed?</span>
+1685           <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_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>
+1686             <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1687           <span class="s">}</span>
+1688         <span class="s">}</span>
+1689         <span class="k">last</span> <span class="j">BONDORDER</span><span class="sc">;</span>
+1690       <span class="s">}</span>
+1691 
+1692       <span class="c"># Any other type of ring atom/bond is not allowed to contribute towards pi electron count</span>
+1693       <span class="c"># and caused loss of aromaticity...</span>
+1694       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1695     <span class="s">}</span>
+1696   <span class="s">}</span>
+1697 
+1698   <span class="c"># Check for any electron pair contributions towards pi electron delocalization due to</span>
+1699   <span class="c"># -ve formal charge on ring atoms which haven&#39;t been already processed and part of</span>
+1700   <span class="c"># conjugated single/double bond system...</span>
+1701   <span class="c">#</span>
+1702   <span class="i">$NumOfRingAtomElectronPairs</span> += <span class="i">$This</span><span class="i">-&gt;_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>
+1703 
+1704   <span class="c"># Setup pi electron count available for delocalization...</span>
+1705   <span class="j">COUNT:</span> <span class="s">{</span>
+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>
+1707       <span class="c"># Each aromatic bond contribute one electron towards pi electron delocalization...</span>
+1708       <span class="i">$NumOfPiElectrons</span> = <span class="i">$NumOfExplicitAromaticBonds</span><span class="sc">;</span>
+1709       <span class="k">last</span> <span class="j">COUNT</span><span class="sc">;</span>
+1710     <span class="s">}</span>
+1711 
+1712     <span class="c"># Each conjugated double bond contribute two electrons towards pi electron delocalization...</span>
+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>
+1714   <span class="s">}</span>
+1715 
+1716   <span class="k">return</span> <span class="i">$NumOfPiElectrons</span><span class="sc">;</span>
+1717 <span class="s">}</span>
+1718 
+1719 <span class="c"># Check ring atoms for their potential participation in aromatic systems..</span>
+1720 <span class="c">#</span>
+<a name="_CheckRingAtomsForPotentialAromaticity-"></a>1721 <span class="k">sub </span><span class="m">_CheckRingAtomsForPotentialAromaticity</span> <span class="s">{</span>
+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>
+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>
+1724 
+1725   <span class="c"># Check availability of ring atoms and bonds...</span>
+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> &amp;&amp; <span class="i">@</span>{<span class="i">$RingBondsRef</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1727     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1728   <span class="s">}</span>
+1729 
+1730   <span class="c"># Is there any minimum ring size limit?</span>
+1731   <span class="k">if</span> <span class="s">(</span><span class="i">$AromaticityModelDataRef</span>-&gt;{<span class="w">MinimumRingSize</span>}<span class="s">)</span> <span class="s">{</span>
+1732     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>} &lt; <span class="i">$AromaticityModelDataRef</span>-&gt;{<span class="w">MinimumRingSize</span>}<span class="s">)</span> <span class="s">{</span>
+1733       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1734     <span class="s">}</span>
+1735   <span class="s">}</span>
+1736 
+1737   <span class="c"># Make sure ring bond order is not greater than 2 and ring atom is not connected to more</span>
+1738   <span class="c"># than 3 other atoms to eliminate any non sp2 carbon atoms and still allow for hetero atoms</span>
+1739   <span class="c"># to contrbute towards electron delocalization...</span>
+1740   <span class="c">#</span>
+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>
+1742     <span class="i">$RingBond</span> = <span class="i">$RingBondsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+1743     <span class="i">$RingAtom</span> = <span class="i">$RingAtomsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+1744 
+1745     <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">$RingBond</span><span class="i">-&gt;GetBondOrder</span><span class="s">(</span><span class="s">)</span> &gt; <span class="n">2</span><span class="s">)</span> || <span class="s">(</span><span class="i">$RingAtom</span><span class="i">-&gt;GetNumOfBonds</span><span class="s">(</span><span class="s">)</span> + <span class="i">$RingAtom</span><span class="i">-&gt;GetNumOfMissingHydrogens</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> &gt; <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
+1746       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1747     <span class="s">}</span>
+1748   <span class="s">}</span>
+1749 
+1750   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1751 <span class="s">}</span>
+1752 
+1753 <span class="c"># Identify any exocylic double bonds on ring atoms...</span>
+1754 <span class="c">#</span>
+<a name="_IdentifyRingAtomsInvolvedInExocyclicDoubleBonds-"></a>1755 <span class="k">sub </span><span class="m">_IdentifyRingAtomsInvolvedInExocyclicDoubleBonds</span> <span class="s">{</span>
+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>
+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>
+1758 
+1759   <span class="c"># Setup a ring bond map to process exocyclic bonds...</span>
+1760   <span class="i">$RingBondsMapRef</span> = <span class="k">undef</span><span class="sc">;</span>
+1761   <span class="i">%RingBondsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1762 
+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>
+1764     <span class="i">$RingBondsMapRef</span> = <span class="i">$FusedRingSetsBondsMapRef</span><span class="sc">;</span>
+1765   <span class="s">}</span>
+1766   <span class="k">else</span> <span class="s">{</span>
+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">-&gt;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>
+1768       <span class="i">$RingBondsMap</span>{<span class="i">$BondID</span>} = <span class="i">$BondID</span><span class="sc">;</span>
+1769     <span class="s">}</span>
+1770     <span class="i">$RingBondsMapRef</span> = \<span class="i">%RingBondsMap</span><span class="sc">;</span>
+1771   <span class="s">}</span>
+1772 
+1773   <span class="c"># Intialize exocyclic terminal double bond data...</span>
+1774   <span class="i">%ExocyclicDoubleBondsDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+1776 
+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>
+1778     <span class="i">$RingBond</span> = <span class="i">$RingBondsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+1779     <span class="i">$RingAtom</span> = <span class="i">$RingAtomsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+1780 
+1781     <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1782 
+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">-&gt;GetBonds</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1784       <span class="k">if</span> <span class="s">(</span><span class="i">$Bond</span><span class="i">-&gt;GetBondOrder</span> != <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1785         <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span>
+1786       <span class="s">}</span>
+1787 
+1788       <span class="c"># Is it part of ring or ring system under consideration?</span>
+1789       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$RingBondsMapRef</span>-&gt;{<span class="i">$Bond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span>}<span class="s">)</span> <span class="s">{</span>
+1790         <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span>
+1791       <span class="s">}</span>
+1792 
+1793       <span class="c"># Is bonded atom in a ring or a non-terminal atom?</span>
+1794       <span class="i">$BondedAtom</span> = <span class="i">$Bond</span><span class="i">-&gt;GetBondedAtom</span><span class="s">(</span><span class="i">$RingAtom</span><span class="s">)</span><span class="sc">;</span>
+1795       <span class="k">if</span> <span class="s">(</span><span class="i">$BondedAtom</span><span class="i">-&gt;IsInRing</span><span class="s">(</span><span class="s">)</span> || !<span class="i">$BondedAtom</span><span class="i">-&gt;IsTerminal</span><span class="s">(</span><span class="s">)</span> <span class="s">)</span> <span class="s">{</span>
+1796         <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span>
+1797       <span class="s">}</span>
+1798 
+1799       <span class="c"># Track exocyclic terminal double bond information...</span>
+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>
+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>
+1802       <span class="s">}</span>
+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>
+1804     <span class="s">}</span>
+1805   <span class="s">}</span>
+1806 
+1807   <span class="k">return</span> \<span class="i">%ExocyclicDoubleBondsDataMap</span><span class="sc">;</span>
+1808 <span class="s">}</span>
+1809 
+1810 <span class="c"># Check to see whether ring atoms are allowed to participate in exocyclic terminal double</span>
+1811 <span class="c"># bonds...</span>
+1812 <span class="c">#</span>
+<a name="_CheckPotentialAromaticRingAtomForExocylicDoubleBonds-"></a>1813 <span class="k">sub </span><span class="m">_CheckPotentialAromaticRingAtomForExocylicDoubleBonds</span> <span class="s">{</span>
+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>
+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>
+1816 
+1817   <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1818 
+1819   <span class="c"># Is it part of an exocyclic terminal double bond?</span>
+1820   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$ExocyclicDoubleBondsDataMapRef</span>-&gt;{<span class="w">RingAtomID</span>}{<span class="i">$RingAtomID</span>}<span class="s">)</span> <span class="s">{</span>
+1821     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1822   <span class="s">}</span>
+1823 
+1824   <span class="c"># Are exocyclic terminal double bonds allowed?</span>
+1825   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>-&gt;{<span class="w">AllowExocyclicDoubleBonds</span>}<span class="s">)</span> <span class="s">{</span>
+1826     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1827   <span class="s">}</span>
+1828 
+1829   <span class="c"># Are there multiple exocyclic double bonds?</span>
+1830   <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ExocyclicDoubleBondsDataMapRef</span>-&gt;{<span class="w">RingAtomID</span>}{<span class="i">$RingAtomID</span>}} &gt; <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+1831     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1832   <span class="s">}</span>
+1833   <span class="s">(</span><span class="i">$ExocyclicTerminalAtom</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$ExocyclicDoubleBondsDataMapRef</span>-&gt;{<span class="w">RingAtomID</span>}{<span class="i">$RingAtomID</span>}}<span class="sc">;</span>
+1834 
+1835   <span class="c"># Are homo nuclear exocyclic terminal double bonds allowed?</span>
+1836   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>-&gt;{<span class="w">AllowHomoNuclearExocyclicDoubleBonds</span>}<span class="s">)</span> <span class="s">{</span>
+1837     <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">-&gt;GetAtomicNumber</span><span class="s">(</span><span class="s">)</span> == <span class="i">$ExocyclicTerminalAtom</span><span class="i">-&gt;GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1838       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1839     <span class="s">}</span>
+1840   <span class="s">}</span>
+1841 
+1842   <span class="c"># Are ring atoms with higher electronegativity allowed in exocyclic double bonds?</span>
+1843   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>-&gt;{<span class="w">AllowElectronegativeRingAtomExocyclicDoubleBonds</span>}<span class="s">)</span> <span class="s">{</span>
+1844     <span class="i">$RingAtomElectronegativity</span> = <span class="i">PeriodicTable::GetElementPaulingElectronegativity</span><span class="s">(</span><span class="i">$RingAtom</span><span class="i">-&gt;GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+1845     <span class="i">$TerminalAtomElectronagativity</span> = <span class="i">PeriodicTable::GetElementPaulingElectronegativity</span><span class="s">(</span><span class="i">$ExocyclicTerminalAtom</span><span class="i">-&gt;GetAtomicNumber</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+1846 
+1847     <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtomElectronegativity</span> &amp;&amp; <span class="i">$TerminalAtomElectronagativity</span><span class="s">)</span> <span class="s">{</span>
+1848       <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtomElectronegativity</span> &gt; <span class="i">$TerminalAtomElectronagativity</span><span class="s">)</span> <span class="s">{</span>
+1849         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1850       <span class="s">}</span>
+1851     <span class="s">}</span>
+1852   <span class="s">}</span>
+1853 
+1854   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1855 <span class="s">}</span>
+1856 
+1857 <span class="c">#</span>
+1858 <span class="c"># Check for any formal charge participation into electron delocalization...</span>
+1859 <span class="c">#</span>
+<a name="_CheckPotentialAromaticRingAtomForFormalCharge-"></a>1860 <span class="k">sub </span><span class="m">_CheckPotentialAromaticRingAtomForFormalCharge</span> <span class="s">{</span>
+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>
+1862   <span class="k">my</span><span class="s">(</span><span class="i">$FormalCharge</span><span class="s">)</span><span class="sc">;</span>
+1863 
+1864   <span class="c"># Does atom has any formal charge?</span>
+1865   <span class="i">$FormalCharge</span> = <span class="i">$RingAtom</span><span class="i">-&gt;GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1866   <span class="k">if</span> <span class="s">(</span>!<span class="i">$FormalCharge</span><span class="s">)</span> <span class="s">{</span>
+1867     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1868   <span class="s">}</span>
+1869 
+1870   <span class="c"># Are ring atoms with formal charge allowed to participate in electron delocalization?</span>
+1871   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>-&gt;{<span class="w">AllowRingAtomFormalCharge</span>}<span class="s">)</span> <span class="s">{</span>
+1872     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1873   <span class="s">}</span>
+1874 
+1875   <span class="c"># Are hetero ring atoms with formal charge allowed to participate in electron delocalization?</span>
+1876   <span class="k">if</span> <span class="s">(</span>!<span class="i">$RingAtom</span><span class="i">-&gt;IsCarbon</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1877     <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>-&gt;{<span class="w">AllowHeteroRingAtomFormalCharge</span>}<span class="s">)</span> <span class="s">{</span>
+1878       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1879     <span class="s">}</span>
+1880   <span class="s">}</span>
+1881 
+1882   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1883 <span class="s">}</span>
+1884 
+1885 <span class="c">#</span>
+1886 <span class="c"># Check ring atoms for allowed hetero atoms...</span>
+1887 <span class="c">#</span>
+<a name="_CheckPotentialAromaticRingAtomForAllowedHeteroAtoms-"></a>1888 <span class="k">sub </span><span class="m">_CheckPotentialAromaticRingAtomForAllowedHeteroAtoms</span> <span class="s">{</span>
+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>
+1890   <span class="k">my</span><span class="s">(</span><span class="i">$RingAtomSymbol</span><span class="s">)</span><span class="sc">;</span>
+1891 
+1892   <span class="c"># Is it a Carbon atom?</span>
+1893   <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">-&gt;IsCarbon</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1894     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1895   <span class="s">}</span>
+1896 
+1897   <span class="c"># Are heteroatoms allowed?</span>
+1898   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>-&gt;{<span class="w">AllowHeteroRingAtoms</span>}<span class="s">)</span> <span class="s">{</span>
+1899     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1900   <span class="s">}</span>
+1901 
+1902   <span class="c"># Is it an allowed hetero atom?</span>
+1903   <span class="i">$RingAtomSymbol</span> = <span class="i">$RingAtom</span><span class="i">-&gt;GetAtomSymbol</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1904   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$AromaticityModelDataRef</span>-&gt;{<span class="w">HeteroRingAtomsListMapRef</span>}-&gt;{<span class="i">$RingAtomSymbol</span>}<span class="s">)</span> <span class="s">{</span>
+1905     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1906   <span class="s">}</span>
+1907 
+1908   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1909 <span class="s">}</span>
+1910 
+1911 <span class="c"># Check for any electron pair contributions toward pi electron delocalization due to</span>
+1912 <span class="c"># -ve formal charge on ring atoms which haven&#39;t been already processed and part of</span>
+1913 <span class="c"># conjugated single/double bond system...</span>
+1914 <span class="c">#</span>
+<a name="_GetElectronPairsContributionFromConjugatedRingAtoms-"></a>1915 <span class="k">sub </span><span class="m">_GetElectronPairsContributionFromConjugatedRingAtoms</span> <span class="s">{</span>
+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>
+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>
+1918 
+1919   <span class="c"># Is formal charge allowed on ring atoms?</span>
+1920   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AromaticityModelDataRef</span>-&gt;{<span class="w">AllowRingAtomFormalCharge</span>}<span class="s">)</span> <span class="s">{</span>
+1921     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1922   <span class="s">}</span>
+1923 
+1924   <span class="i">$NumOfRingAtomElectronPairs</span> = <span class="n">0</span><span class="sc">;</span>
+1925 
+1926   <span class="c"># Process ring atoms...</span>
+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>
+1928     <span class="i">$RingBond</span> = <span class="i">$RingBondsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+1929     <span class="i">$RingAtom</span> = <span class="i">$RingAtomsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+1930     <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1931 
+1932     <span class="c"># Is is already processed?</span>
+1933     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ElectronPairContributionProcessedMapRef</span>-&gt;{<span class="i">$RingAtomID</span>}<span class="s">)</span> <span class="s">{</span>
+1934       <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span>
+1935     <span class="s">}</span>
+1936     <span class="i">$ElectronPairContributionProcessedMapRef</span>-&gt;{<span class="i">$RingAtomID</span>} = <span class="i">$RingAtomID</span><span class="sc">;</span>
+1937 
+1938     <span class="c"># Is it allowed to have any formal charge?</span>
+1939     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_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>
+1940       <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span>
+1941     <span class="s">}</span>
+1942 
+1943     <span class="c"># It it an allowed hetero ring atom or a carbon atom?</span>
+1944     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_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>
+1945       <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span>
+1946     <span class="s">}</span>
+1947 
+1948     <span class="c"># It is an atom with -ve formal charge?</span>
+1949     <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">-&gt;GetFormalCharge</span><span class="s">(</span><span class="s">)</span> &gt;= <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
+1950       <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span>
+1951     <span class="s">}</span>
+1952 
+1953     <span class="c"># Is it able to donate a pair for electrons towards pi electron delocalization?</span>
+1954     <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">-&gt;GetValenceFreeElectrons</span><span class="s">(</span><span class="i">$ExcludeFreeRadicalElectrons</span><span class="s">)</span> &lt; <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1955       <span class="k">next</span> <span class="j">RINGBOND</span><span class="sc">;</span>
+1956     <span class="s">}</span>
+1957     <span class="i">$NumOfRingAtomElectronPairs</span> += <span class="n">1</span><span class="sc">;</span>
+1958   <span class="s">}</span>
+1959 
+1960   <span class="k">return</span> <span class="i">$NumOfRingAtomElectronPairs</span><span class="sc">;</span>
+1961 <span class="s">}</span>
+1962 
+1963 <span class="c"># Check for ring atoms involved in two single ring bonds without any available electron</span>
+1964 <span class="c"># pair which are allowed to participate in aromatic system, after all other checks</span>
+1965 <span class="c"># corresponding to specified aromaticity models have already been performed...</span>
+1966 <span class="c">#</span>
+<a name="_AllowRingAtomInTwoSingleBondsWithoutElectronPair-"></a>1967 <span class="k">sub </span><span class="m">_AllowRingAtomInTwoSingleBondsWithoutElectronPair</span> <span class="s">{</span>
+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>
+1969 
+1970   <span class="j">ALLOWRINGATOM:</span> <span class="s">{</span>
+1971     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ExocyclicDoubleBondsDataMapRef</span>-&gt;{<span class="w">RingAtomID</span>}{<span class="i">$RingAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span>}<span class="s">)</span> <span class="s">{</span>
+1972       <span class="c"># Ring atom in an exocylic terminal double bond without any available electron pair...</span>
+1973       <span class="k">last</span> <span class="j">ALLOWRINGATOM</span><span class="sc">;</span>
+1974     <span class="s">}</span>
+1975 
+1976     <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">-&gt;GetFormalCharge</span><span class="s">(</span><span class="s">)</span> &gt; <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
+1977       <span class="c"># Ring atom with positive formal charge without any available electron pair...</span>
+1978       <span class="k">last</span> <span class="j">ALLOWRINGATOM</span><span class="sc">;</span>
+1979     <span class="s">}</span>
+1980 
+1981     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$FusedRingBondsMapRef</span> &amp;&amp; <span class="s">(</span><span class="k">exists</span> <span class="i">$FusedRingBondsMapRef</span>-&gt;{<span class="i">$RingBond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span>} || <span class="k">exists</span> <span class="i">$FusedRingBondsMapRef</span>-&gt;{<span class="i">$PreviousRingBond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1982       <span class="c"># Ring atom involved in fused ring bond, which might end up being part of a conjugated</span>
+1983       <span class="c"># system in another fused ring...</span>
+1984       <span class="k">last</span> <span class="j">ALLOWRINGATOM</span><span class="sc">;</span>
+1985     <span class="s">}</span>
+1986 
+1987     <span class="c"># Ring atom in any other environment is not allowed...</span>
+1988     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1989   <span class="s">}</span>
+1990 
+1991   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1992 <span class="s">}</span>
+1993 
+1994 <span class="c"># Do pi electrons satify huckel&#39;s rule: Number of pi electrons correspond to 4n + 2 where</span>
+1995 <span class="c"># n is a positive integer...</span>
+1996 <span class="c">#</span>
+<a name="_DoPiElectronSatifyHuckelsRule-"></a>1997 <span class="k">sub </span><span class="m">_DoPiElectronSatifyHuckelsRule</span> <span class="s">{</span>
+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>
+1999 
+2000   <span class="i">$NumOfPiElectrons</span> = <span class="i">$NumOfPiElectrons</span> - <span class="n">2</span><span class="sc">;</span>
+2001 
+2002   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfPiElectrons</span> &gt; <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>
+2003 <span class="s">}</span>
+2004 
+2005 <span class="c"># Delete aromatic property for all atoms and bonds...</span>
+2006 <span class="c">#</span>
+<a name="_DeleteAtomsAndBondsAromaticity-"></a>2007 <span class="k">sub </span><span class="m">_DeleteAtomsAndBondsAromaticity</span> <span class="s">{</span>
+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>
+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>
+2010 
+2011   <span class="k">for</span> <span class="i">$Atom</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2012     <span class="i">$Atom</span><span class="i">-&gt;DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2013   <span class="s">}</span>
+2014   <span class="k">for</span> <span class="i">$Bond</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetBonds</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2015     <span class="i">$Bond</span><span class="i">-&gt;DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2016   <span class="s">}</span>
+2017   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+2018 <span class="s">}</span>
+2019 
+2020 <span class="c"># Kekulize marked ring and non-ring aromatic atoms in a molecule...</span>
+2021 <span class="c">#</span>
+<a name="KekulizeAromaticAtoms-"></a>2022 <span class="k">sub </span><span class="m">KekulizeAromaticAtoms</span> <span class="s">{</span>
+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>
+2024 
+2025   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_KekulizeAromaticAtomsInRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2026     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2027   <span class="s">}</span>
+2028 
+2029   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_KekulizeAromaticAtomsNotInRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2030     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2031   <span class="s">}</span>
+2032 
+2033   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2034 <span class="s">}</span>
+2035 
+2036 <span class="c"># Kekulize marked aromatic atoms in rings and fused ring sets...</span>
+2037 <span class="c">#</span>
+<a name="_KekulizeAromaticAtomsInRings-"></a>2038 <span class="k">sub </span><span class="m">_KekulizeAromaticAtomsInRings</span> <span class="s">{</span>
+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>
+2040 
+2041   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2042     <span class="c"># Nothing to do...</span>
+2043     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2044   <span class="s">}</span>
+2045 
+2046   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasAromaticAtomsInRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2047     <span class="c"># Nothing to do...</span>
+2048     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2049   <span class="s">}</span>
+2050 
+2051   <span class="c"># Identify fully aromatic fused and individual rings along with any partially aromatic ring components</span>
+2052   <span class="c"># using marked aromatic atoms in a molecule and kekulize them as individual stes...</span>
+2053   <span class="c">#</span>
+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>
+2055   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasFusedRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+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">-&gt;_GetFusedAndNonFusedRingsContainingAromaticAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2057   <span class="s">}</span>
+2058   <span class="k">else</span> <span class="s">{</span>
+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">-&gt;_GetIndividualRingsContainingAromaticAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2060   <span class="s">}</span>
+2061 
+2062   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_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>
+2063 <span class="s">}</span>
+2064 
+2065 <span class="c"># Identify fully aromatic fused and individual rings along with any partially aromatic ring components</span>
+2066 <span class="c"># using marked aromatic atoms in a molecule...</span>
+2067 <span class="c">#</span>
+<a name="_GetFusedAndNonFusedRingsContainingAromaticAtoms-"></a>2068 <span class="k">sub </span><span class="m">_GetFusedAndNonFusedRingsContainingAromaticAtoms</span> <span class="s">{</span>
+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>
+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>
+2071 
+2072   <span class="i">@FullyAromaticFusedRingSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2073 
+2074   <span class="i">@PotentialFullyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2075   <span class="i">@FullyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2076 
+2077   <span class="i">@PotentialPartiallyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2078   <span class="i">@PartiallyAromaticRingComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2079 
+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">-&gt;GetFusedAndNonFusedRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2081 
+2082   <span class="c"># Go over fused ring sets...</span>
+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>
+2084     <span class="i">$FusedRingSetRef</span> = <span class="i">$FusedRingSetsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+2085 
+2086     <span class="i">$SetAtomsCount</span> = <span class="n">0</span><span class="sc">;</span>
+2087     <span class="i">$SetAromaticAtomsCount</span> = <span class="n">0</span><span class="sc">;</span>
+2088 
+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>
+2090       <span class="i">$SetAtomsCount</span> += <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="sc">;</span>
+2091 
+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>
+2093         <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2094           <span class="i">$SetAromaticAtomsCount</span> += <span class="n">1</span><span class="sc">;</span>
+2095         <span class="s">}</span>
+2096       <span class="s">}</span>
+2097     <span class="s">}</span>
+2098 
+2099     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$SetAtomsCount</span> &amp;&amp; <span class="i">$SetAromaticAtomsCount</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2100       <span class="k">next</span> <span class="j">RINGSET</span><span class="sc">;</span>
+2101     <span class="s">}</span>
+2102 
+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>
+2104       <span class="k">push</span> <span class="i">@FullyAromaticFusedRingSets</span><span class="cm">,</span> <span class="i">$FusedRingSetRef</span><span class="sc">;</span>
+2105     <span class="s">}</span>
+2106     <span class="k">else</span> <span class="s">{</span>
+2107       <span class="c"># Identify any individual rings in partial aromatic fused ring sets which might be</span>
+2108       <span class="c"># fully or partially aromatic...</span>
+2109       <span class="c">#</span>
+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>
+2111         <span class="i">$RingAtomsCount</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="sc">;</span>
+2112         <span class="i">$AromaticAtomsCount</span> = <span class="n">0</span><span class="sc">;</span>
+2113 
+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>
+2115           <span class="k">if</span> <span class="s">(</span>!<span class="i">$RingAtom</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2116             <span class="k">next</span> <span class="j">RINGATOM</span><span class="sc">;</span>
+2117           <span class="s">}</span>
+2118           <span class="i">$AromaticAtomsCount</span> += <span class="n">1</span><span class="sc">;</span>
+2119         <span class="s">}</span>
+2120 
+2121         <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$RingAtomsCount</span> &amp;&amp; <span class="i">$AromaticAtomsCount</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2122           <span class="k">next</span> <span class="j">RING</span><span class="sc">;</span>
+2123         <span class="s">}</span>
+2124 
+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>
+2126           <span class="k">push</span> <span class="i">@PotentialFullyAromaticRings</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="sc">;</span>
+2127         <span class="s">}</span>
+2128         <span class="k">else</span> <span class="s">{</span>
+2129           <span class="c">#  Track partially aromatic rings in an different list before removing them for</span>
+2130           <span class="c">#  any overlap with other rings and then add to fully aromatic rings...</span>
+2131           <span class="k">push</span> <span class="i">@PotentialPartiallyAromaticRings</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="sc">;</span>
+2132         <span class="s">}</span>
+2133       <span class="s">}</span>
+2134     <span class="s">}</span>
+2135   <span class="s">}</span>
+2136 
+2137   <span class="k">if</span> <span class="s">(</span><span class="i">@PotentialFullyAromaticRings</span> &gt; <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+2138     <span class="c"># Get any fully aromatic fused ring subsets from potentially fully aromatic rings...</span>
+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>
+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">-&gt;_GetFullyAromaticFusedAndNonFusedRingsInFusedSubset</span><span class="s">(</span>\<span class="i">@PotentialFullyAromaticRings</span><span class="s">)</span><span class="sc">;</span>
+2141 
+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>
+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>
+2144     <span class="s">}</span>
+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>
+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>
+2147     <span class="s">}</span>
+2148   <span class="s">}</span>
+2149   <span class="k">else</span> <span class="s">{</span>
+2150     <span class="k">push</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">@PotentialFullyAromaticRings</span><span class="sc">;</span>
+2151   <span class="s">}</span>
+2152 
+2153   <span class="c"># Go over partial aromatic ring components...</span>
+2154   <span class="k">if</span> <span class="s">(</span><span class="i">@PotentialPartiallyAromaticRings</span><span class="s">)</span> <span class="s">{</span>
+2155     <span class="i">$PartiallyAromaticRingComponentsRef</span> = <span class="i">$This</span><span class="i">-&gt;_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>
+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>
+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>
+2158     <span class="s">}</span>
+2159   <span class="s">}</span>
+2160 
+2161   <span class="c"># Go over non-fused rings...</span>
+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>
+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">-&gt;_GetRingsContainingAromaticAtoms</span><span class="s">(</span><span class="i">@</span>{<span class="i">$NonFusedRingsRef</span>}<span class="s">)</span><span class="sc">;</span>
+2164 
+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>
+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>
+2167     <span class="s">}</span>
+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>
+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>
+2170     <span class="s">}</span>
+2171   <span class="s">}</span>
+2172 
+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>
+2174 <span class="s">}</span>
+2175 
+2176 <span class="c"># Identify fully aromatic fused sets and non-fused rings in potentially fully aromatic</span>
+2177 <span class="c"># rings in fused ring sets...</span>
+2178 <span class="c">#</span>
+2179 <span class="c"># Fully aromatic rings in fused ring sets might contain fully aromatic fused subsets. These</span>
+2180 <span class="c"># fused subets need to be tracked and treated as fused sets.</span>
+2181 <span class="c">#</span>
+2182 <span class="c"># Note:</span>
+2183 <span class="c">#   . Fused ring sets share at least one common bond, which could be used to identify</span>
+2184 <span class="c">#     any multiple fully aromatic fused rings sets; absence of a shared ring bond implies</span>
+2185 <span class="c">#     there are no fused ring sets.</span>
+2186 <span class="c">#</span>
+2187 <span class="c">#</span>
+<a name="_GetFullyAromaticFusedAndNonFusedRingsInFusedSubset-"></a>2188 <span class="k">sub </span><span class="m">_GetFullyAromaticFusedAndNonFusedRingsInFusedSubset</span> <span class="s">{</span>
+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>
+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>
+2191 
+2192   <span class="i">@FullyAromaticFusedRingSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2193   <span class="i">@FullyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2194 
+2195   <span class="c"># Setup a ring index map for ring atoms...</span>
+2196   <span class="c">#</span>
+2197   <span class="i">%RingIndexToAtomIDMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+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>
+2200     <span class="k">for</span> <span class="i">$RingAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PotentialFullyAromaticFusedRingsRef</span>-&gt;[<span class="i">$RingIndex</span>]}<span class="s">)</span> <span class="s">{</span>
+2201       <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+2203     <span class="s">}</span>
+2204   <span class="s">}</span>
+2205 
+2206   <span class="c"># Identify fused ring pairs...</span>
+2207   <span class="c">#</span>
+2208   <span class="i">@RingIndices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2209   <span class="i">@FusedRingPairIndices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2210 
+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>
+2212     <span class="k">push</span> <span class="i">@RingIndices</span><span class="cm">,</span> <span class="i">$RingIndex1</span><span class="sc">;</span>
+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>
+2214       <span class="i">$RingIsFuesd</span> = <span class="n">0</span><span class="sc">;</span>
+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>-&gt;[<span class="i">$RingIndex2</span>]}<span class="s">)</span> <span class="s">{</span>
+2216         <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+2218           <span class="i">$RingIsFuesd</span> = <span class="n">1</span><span class="sc">;</span>
+2219           <span class="k">last</span> <span class="j">RINGATOM</span><span class="sc">;</span>
+2220         <span class="s">}</span>
+2221       <span class="s">}</span>
+2222       <span class="k">if</span> <span class="s">(</span><span class="i">$RingIsFuesd</span><span class="s">)</span> <span class="s">{</span>
+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>
+2224       <span class="s">}</span>
+2225     <span class="s">}</span>
+2226   <span class="s">}</span>
+2227 
+2228   <span class="k">if</span> <span class="s">(</span>!<span class="i">@FusedRingPairIndices</span><span class="s">)</span> <span class="s">{</span>
+2229     <span class="c"># No fused ring subset out there...</span>
+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>
+2231 
+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>
+2233   <span class="s">}</span>
+2234 
+2235   <span class="c"># Identify fused ring sets...</span>
+2236   <span class="c">#</span>
+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>
+2238   <span class="i">$RingIndicesGraph</span><span class="i">-&gt;AddEdges</span><span class="s">(</span><span class="i">@FusedRingPairIndices</span><span class="s">)</span><span class="sc">;</span>
+2239   <span class="i">@FusedRingSetIndicesRefs</span> = <span class="i">$RingIndicesGraph</span><span class="i">-&gt;GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2240 
+2241   <span class="c"># Collect fully aromatic fused ring sets...</span>
+2242   <span class="c">#</span>
+2243   <span class="i">%FullyAromaticFusedRingIndexMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+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>
+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>
+2247       <span class="i">$FullyAromaticFusedRingIndexMap</span>{<span class="i">$RingIndex</span>} = <span class="i">$RingIndex</span><span class="sc">;</span>
+2248       <span class="k">push</span> <span class="i">@FullyAromaticFusedRingSet</span><span class="cm">,</span> <span class="i">$PotentialFullyAromaticFusedRingsRef</span>-&gt;[<span class="i">$RingIndex</span>]<span class="sc">;</span>
+2249     <span class="s">}</span>
+2250     <span class="k">if</span> <span class="s">(</span><span class="i">@FullyAromaticFusedRingSet</span><span class="s">)</span> <span class="s">{</span>
+2251       <span class="c"># Sort rings by size with in the fused ring set...</span>
+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> &lt;=&gt; <span class="k">scalar</span> <span class="i">@$b</span> <span class="s">}</span> <span class="i">@FullyAromaticFusedRingSet</span><span class="sc">;</span>
+2253       <span class="k">push</span> <span class="i">@FullyAromaticFusedRingSets</span><span class="cm">,</span> \<span class="i">@FullyAromaticFusedRingSet</span><span class="sc">;</span>
+2254     <span class="s">}</span>
+2255   <span class="s">}</span>
+2256 
+2257   <span class="c"># Collect fully aromatic non-fused rings...</span>
+2258   <span class="c">#</span>
+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>
+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>
+2261       <span class="k">next</span> <span class="j">RINGINDEX</span><span class="sc">;</span>
+2262     <span class="s">}</span>
+2263     <span class="k">push</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">$PotentialFullyAromaticFusedRingsRef</span>-&gt;[<span class="i">$RingIndex</span>]<span class="sc">;</span>
+2264   <span class="s">}</span>
+2265 
+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>
+2267 <span class="s">}</span>
+2268 
+2269 <span class="c"># Identify individual non-fused rings containing aromatic atoms...</span>
+2270 <span class="c">#</span>
+<a name="_GetIndividualRingsContainingAromaticAtoms-"></a>2271 <span class="k">sub </span><span class="m">_GetIndividualRingsContainingAromaticAtoms</span> <span class="s">{</span>
+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>
+2273 
+2274   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRingsContainingAromaticAtoms</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+2275 <span class="s">}</span>
+2276 
+2277 <span class="c"># Identify individual non-fused rings containing aromatic atoms...</span>
+2278 <span class="c">#</span>
+<a name="_GetRingsContainingAromaticAtoms-"></a>2279 <span class="k">sub </span><span class="m">_GetRingsContainingAromaticAtoms</span> <span class="s">{</span>
+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>
+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>
+2282 
+2283   <span class="i">@FullyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2284   <span class="i">@PartiallyAromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2285 
+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>
+2287     <span class="i">$RingAtomsCount</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="sc">;</span>
+2288     <span class="i">$AromaticAtomsCount</span> = <span class="n">0</span><span class="sc">;</span>
+2289 
+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>
+2291       <span class="k">if</span> <span class="s">(</span><span class="i">$RingAtom</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2292         <span class="i">$AromaticAtomsCount</span> += <span class="n">1</span><span class="sc">;</span>
+2293       <span class="s">}</span>
+2294     <span class="s">}</span>
+2295 
+2296     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$AromaticAtomsCount</span> &amp;&amp; <span class="i">$RingAtomsCount</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2297       <span class="k">next</span> <span class="j">RING</span><span class="sc">;</span>
+2298     <span class="s">}</span>
+2299 
+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>
+2301       <span class="k">push</span> <span class="i">@FullyAromaticRings</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="sc">;</span>
+2302     <span class="s">}</span>
+2303     <span class="k">else</span> <span class="s">{</span>
+2304       <span class="k">push</span> <span class="i">@PartiallyAromaticRings</span><span class="cm">,</span> <span class="i">$RingAtomsRef</span><span class="sc">;</span>
+2305     <span class="s">}</span>
+2306   <span class="s">}</span>
+2307 
+2308   <span class="i">$PartiallyAromaticRingComponentsRef</span> = <span class="i">$This</span><span class="i">-&gt;_GetPartiallyAromaticRingComponents</span><span class="s">(</span>\<span class="i">@PartiallyAromaticRings</span><span class="s">)</span><span class="sc">;</span>
+2309 
+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>
+2311 <span class="s">}</span>
+2312 
+2313 <span class="c"># Get connected aromatic components with in partially aromatic rings...</span>
+2314 <span class="c">#</span>
+<a name="_GetPartiallyAromaticRingComponents-"></a>2315 <span class="k">sub </span><span class="m">_GetPartiallyAromaticRingComponents</span> <span class="s">{</span>
+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>
+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>
+2318 
+2319   <span class="i">@PartiallyAromaticRingComponents</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2320 
+2321   <span class="c"># Setup a map for atoms involve in fully aromatic rings to remove remove partial rings</span>
+2322   <span class="c"># containing only those atoms which are already part of some other fully aromatic ring</span>
+2323   <span class="c"># in fused ring scenarios or some other partially aromatic ring...</span>
+2324   <span class="c">#</span>
+2325   <span class="i">%FullyAromaticRingAtomsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+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>
+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>
+2329         <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2330         <span class="i">$FullyAromaticRingAtomsMap</span>{<span class="i">$RingAtomID</span>} = <span class="i">$RingAtomID</span><span class="sc">;</span>
+2331       <span class="s">}</span>
+2332     <span class="s">}</span>
+2333   <span class="s">}</span>
+2334 
+2335   <span class="c"># . Identify any connected components with in each partially aromatic ring.</span>
+2336   <span class="c"># . Use ring atom indices to figure out connnected components in rings: All ring atoms</span>
+2337   <span class="c">#   in a connected component have sequential indices and a difference by more than</span>
+2338   <span class="c">#   1 indicates a new component in the list.</span>
+2339   <span class="c">#</span>
+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>
+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>
+2342 
+2343     <span class="i">@AromaticRingAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2344     <span class="i">@AromaticRingAtomsIndices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2345 
+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>
+2347       <span class="i">$RingAtom</span> = <span class="i">$RingAtomsRef</span>-&gt;[<span class="i">$Index</span>]<span class="sc">;</span>
+2348       <span class="i">$RingAtomID</span> = <span class="i">$RingAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2349 
+2350       <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$FullyAromaticRingsRef</span> &amp;&amp; <span class="k">exists</span> <span class="i">$FullyAromaticRingAtomsMap</span>{<span class="i">$RingAtomID</span>}<span class="s">)</span> <span class="s">{</span>
+2351         <span class="k">next</span> <span class="j">RINGATOM</span><span class="sc">;</span>
+2352       <span class="s">}</span>
+2353       <span class="k">if</span> <span class="s">(</span>!<span class="i">$RingAtom</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2354         <span class="k">next</span> <span class="j">RINGATOM</span><span class="sc">;</span>
+2355       <span class="s">}</span>
+2356       <span class="k">push</span> <span class="i">@AromaticRingAtoms</span><span class="cm">,</span> <span class="i">$RingAtom</span><span class="sc">;</span>
+2357       <span class="k">push</span> <span class="i">@AromaticRingAtomsIndices</span><span class="cm">,</span> <span class="i">$Index</span><span class="sc">;</span>
+2358 
+2359     <span class="s">}</span>
+2360     <span class="k">if</span> <span class="s">(</span>!<span class="i">@AromaticRingAtoms</span><span class="s">)</span> <span class="s">{</span>
+2361       <span class="k">next</span> <span class="j">RING</span><span class="sc">;</span>
+2362     <span class="s">}</span>
+2363 
+2364     <span class="c"># Start off with a new connected component...</span>
+2365     <span class="c">#</span>
+2366     <span class="k">my</span><span class="s">(</span><span class="i">$ComponentNum</span><span class="s">)</span><span class="sc">;</span>
+2367     <span class="i">$ComponentNum</span> = <span class="k">scalar</span> <span class="i">@PartiallyAromaticRingComponents</span><span class="sc">;</span>
+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>
+2369 
+2370     <span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span>
+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>
+2372 
+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>
+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> &gt; <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+2375         <span class="c"># New connected component...</span>
+2376         <span class="i">$ComponentNum</span> += <span class="n">1</span><span class="sc">;</span>
+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>
+2378       <span class="s">}</span>
+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>
+2380     <span class="s">}</span>
+2381   <span class="s">}</span>
+2382 
+2383   <span class="k">return</span> <span class="s">(</span>\<span class="i">@PartiallyAromaticRingComponents</span><span class="s">)</span><span class="sc">;</span>
+2384 <span class="s">}</span>
+2385 
+2386 <span class="c"># Kekulize fully aromatic fused and individual rings along with any partially aromatic ring</span>
+2387 <span class="c"># components...</span>
+2388 <span class="c">#</span>
+<a name="_KekulizeCompleteAndPartialAromaticRings-"></a>2389 <span class="k">sub </span><span class="m">_KekulizeCompleteAndPartialAromaticRings</span> <span class="s">{</span>
+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>
+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>
+2392 
+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">-&gt;_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>
+2394 
+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>
+2396     <span class="c"># Nothing to do...</span>
+2397     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2398   <span class="s">}</span>
+2399 
+2400   <span class="c"># Delete any aromaticity property set for non-ring bonds connected any two ring</span>
+2401   <span class="c"># aromatic atoms...</span>
+2402   <span class="c">#</span>
+2403   <span class="i">$This</span><span class="i">-&gt;_ProcessNonRingAromaticBondsBetweenAromaticRingAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2404 
+2405   <span class="i">%PathAtomsProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2406   <span class="i">%PathBondsProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2407 
+2408   <span class="i">$Status</span> = <span class="n">1</span><span class="sc">;</span>
+2409 
+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>
+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>
+2412 
+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>
+2414 
+2415     <span class="k">if</span> <span class="s">(</span><span class="i">$ConnectdPathsSetsTypesRef</span>-&gt;[<span class="i">$PathSetIndex</span>] =~ <span class="q">/^FusedAromatic$/i</span><span class="s">)</span> <span class="s">{</span>
+2416       <span class="c"># Fused set of connected paths...</span>
+2417       <span class="c">#</span>
+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>
+2419 
+2420       <span class="i">$FusedConnectedPathAtomsSetRef</span> = <span class="i">$ConnectedPathsAtomsSetsRef</span>-&gt;[<span class="i">$PathSetIndex</span>]<span class="sc">;</span>
+2421       <span class="i">$FusedConnectedPathBondsSetRef</span> = <span class="i">$ConnectedPathsBondsSetsRef</span>-&gt;[<span class="i">$PathSetIndex</span>]<span class="sc">;</span>
+2422 
+2423       <span class="c"># Prepare for kekulization...</span>
+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">-&gt;_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>
+2425 
+2426       <span class="c"># Perform kekulization starting with the first path set...</span>
+2427       <span class="i">$PathSetProcessingStatusRef</span>-&gt;[<span class="n">0</span>] = <span class="q">&#39;Processed&#39;</span><span class="sc">;</span>
+2428       <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_KekulizeConnectedPathSets</span><span class="s">(</span><span class="i">$FusedConnectedPathAtomsSetRef</span>-&gt;[<span class="n">0</span>]<span class="cm">,</span>  <span class="i">$FusedConnectedPathBondsSetRef</span>-&gt;[<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>
+2429         <span class="c"># Kekulization failed for the current fused paths set...</span>
+2430         <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span>
+2431       <span class="s">}</span>
+2432     <span class="s">}</span>
+2433     <span class="k">else</span> <span class="s">{</span>
+2434       <span class="c"># An individual connected path...</span>
+2435       <span class="c">#</span>
+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>
+2437 
+2438       <span class="i">@ConnectedPathAtomsSet</span> = <span class="s">(</span><span class="i">$ConnectedPathsAtomsSetsRef</span>-&gt;[<span class="i">$PathSetIndex</span>]<span class="s">)</span><span class="sc">;</span>
+2439       <span class="i">@ConnectedPathBondsSet</span> = <span class="s">(</span><span class="i">$ConnectedPathsBondsSetsRef</span>-&gt;[<span class="i">$PathSetIndex</span>]<span class="s">)</span><span class="sc">;</span>
+2440 
+2441       <span class="c"># Prepare for kekulization...</span>
+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">-&gt;_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>
+2443 
+2444       <span class="c"># Perform kekulization...</span>
+2445       <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_KekulizeConnectedPathSets</span><span class="s">(</span><span class="i">$ConnectedPathsAtomsSetsRef</span>-&gt;[<span class="i">$PathSetIndex</span>]<span class="cm">,</span> <span class="i">$ConnectedPathsBondsSetsRef</span>-&gt;[<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>
+2446         <span class="c"># Kekulization failed for the current path...</span>
+2447         <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span>
+2448       <span class="s">}</span>
+2449     <span class="s">}</span>
+2450 
+2451     <span class="c"># Did kekulization succeed for the current path or path set?</span>
+2452     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Status</span><span class="s">)</span> <span class="s">{</span>
+2453       <span class="k">last</span> <span class="j">PATHSET</span><span class="sc">;</span>
+2454     <span class="s">}</span>
+2455 
+2456     <span class="c"># Track atom and bond processing state for final assignment after kekulization</span>
+2457     <span class="c"># is successfully completed for all the paths and fused path sets...</span>
+2458     <span class="c">#</span>
+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>
+2460       <span class="i">$PathAtomsProcessingStatusMap</span>{<span class="i">$AtomID</span>} = <span class="i">$AtomProcessingStatusMapRef</span>-&gt;{<span class="i">$AtomID</span>}<span class="sc">;</span>
+2461     <span class="s">}</span>
+2462 
+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>
+2464       <span class="i">$PathBondsProcessingStatusMap</span>{<span class="i">$BondID</span>} = <span class="i">$BondProcessingStatusMapRef</span>-&gt;{<span class="i">$BondID</span>}<span class="sc">;</span>
+2465     <span class="s">}</span>
+2466   <span class="s">}</span>
+2467 
+2468   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Status</span><span class="s">)</span> <span class="s">{</span>
+2469     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_KekulizeCompleteAndPartialAromaticRings: Couldn&#39;t perform kekulization for marked ring aromatic atoms...&quot;</span><span class="sc">;</span>
+2470     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2471   <span class="s">}</span>
+2472 
+2473   <span class="c"># Use PathAtomsProcessingStatusMap and PathBondsProcessingStatusMap to set</span>
+2474   <span class="c"># single/double bonds in the molecule after successful kekulization along with modification of</span>
+2475   <span class="c"># any aromatic flags...</span>
+2476 
+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>
+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>
+2479 
+2480     <span class="k">if</span> <span class="s">(</span><span class="i">$ConnectdPathsSetsTypesRef</span>-&gt;[<span class="i">$PathSetIndex</span>] =~ <span class="q">/^FusedAromatic$/i</span><span class="s">)</span> <span class="s">{</span>
+2481       <span class="k">for</span> <span class="i">$PathBondsRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConnectedPathsBondsSetsRef</span>-&gt;[<span class="i">$PathSetIndex</span>]}<span class="s">)</span> <span class="s">{</span>
+2482         <span class="i">$This</span><span class="i">-&gt;_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>
+2483       <span class="s">}</span>
+2484     <span class="s">}</span>
+2485     <span class="k">else</span> <span class="s">{</span>
+2486       <span class="k">if</span> <span class="s">(</span><span class="i">$ConnectdPathsSetsTypesRef</span>-&gt;[<span class="i">$PathSetIndex</span>] =~ <span class="q">/^PartiallyAromatic$/i</span> <span class="s">)</span> <span class="s">{</span>
+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>
+2488       <span class="s">}</span>
+2489 
+2490       <span class="k">if</span> <span class="s">(</span><span class="i">$DeleteAtomsAromaticity</span><span class="s">)</span> <span class="s">{</span>
+2491         <span class="k">for</span> <span class="i">$PathAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConnectedPathsAtomsSetsRef</span>-&gt;[<span class="i">$PathSetIndex</span>]}<span class="s">)</span> <span class="s">{</span>
+2492           <span class="i">$PathAtom</span><span class="i">-&gt;DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2493         <span class="s">}</span>
+2494       <span class="s">}</span>
+2495 
+2496       <span class="i">$This</span><span class="i">-&gt;_ProcessBondOrdersAssignedDuringSuccessfulKekulization</span><span class="s">(</span><span class="i">$ConnectedPathsBondsSetsRef</span>-&gt;[<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>
+2497     <span class="s">}</span>
+2498   <span class="s">}</span>
+2499 
+2500   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2501 <span class="s">}</span>
+2502 
+2503 <span class="c"># Look for any aromatic bonds outside the rings between two ring aromatic atoms</span>
+2504 <span class="c"># and turn them into single non-aromatic bonds before kekulization; otherwise, kekulization</span>
+2505 <span class="c"># fails.</span>
+2506 <span class="c">#</span>
+2507 <span class="c"># Note:</span>
+2508 <span class="c">#   . Two atoms marked as aromatic atoms in two different rings, such as two rings</span>
+2509 <span class="c">#     connected through a single bond, are still aromatic, but the bond is outside</span>
+2510 <span class="c">#     the ring and shouldn&#39;t be marked as aromatic. It should be set to single bond without</span>
+2511 <span class="c">#     any aromatic property for kekulization to succeed.</span>
+2512 <span class="c">#</span>
+2513 <span class="c">#     For example, the molecule  generated by SMILES parser for biphenyl SMILES string</span>
+2514 <span class="c">#     &quot;c1ccccc1c2ccccc2&quot; sets up an aromatic bond between the two phenyl rings, as</span>
+2515 <span class="c">#     it&#39;s connected to two aromatic atoms.</span>
+2516 <span class="c">#</span>
+<a name="_ProcessNonRingAromaticBondsBetweenAromaticRingAtoms-"></a>2517 <span class="k">sub </span><span class="m">_ProcessNonRingAromaticBondsBetweenAromaticRingAtoms</span> <span class="s">{</span>
+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>
+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>
+2520 
+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">-&gt;GetBonds</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2522     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$Bond</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span> &amp;&amp; <span class="i">$Bond</span><span class="i">-&gt;IsNotInRing</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2523       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span>
+2524     <span class="s">}</span>
+2525 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2527     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span> &amp;&amp; <span class="i">$Atom2</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span> &amp;&amp; <span class="i">$Atom1</span><span class="i">-&gt;IsInRing</span><span class="s">(</span><span class="s">)</span> &amp;&amp; <span class="i">$Atom2</span><span class="i">-&gt;IsInRing</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2528       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span>
+2529     <span class="s">}</span>
+2530 
+2531     <span class="i">$Bond</span><span class="i">-&gt;SetBondOrder</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span>
+2532     <span class="i">$Bond</span><span class="i">-&gt;DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2533   <span class="s">}</span>
+2534 
+2535   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+2536 <span class="s">}</span>
+2537 
+2538 <span class="c"># Setup completelty aromatic fused and individual rings along with partially aromatic ring</span>
+2539 <span class="c"># components as sets of connected paths...</span>
+2540 <span class="c">#</span>
+<a name="_SetupCompleteAndPartialAromaticRingsForKekulizaiton-"></a>2541 <span class="k">sub </span><span class="m">_SetupCompleteAndPartialAromaticRingsForKekulizaiton</span> <span class="s">{</span>
+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>
+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>
+2544 
+2545   <span class="i">@ConnectedPathsSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2546   <span class="i">@ConnectedPathsBondsSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2547   <span class="i">@ConnectdPathsSetsTypes</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2548 
+2549   <span class="c"># Setup atoms and bonds for connected paths in fused aromatic ring sets...</span>
+2550   <span class="c">#</span>
+2551   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$AromaticFusedRingSetsRef</span> &amp;&amp; <span class="i">@</span>{<span class="i">$AromaticFusedRingSetsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2552     <span class="k">my</span><span class="s">(</span><span class="i">$RingSetIndex</span><span class="s">)</span><span class="sc">;</span>
+2553 
+2554     <span class="k">push</span> <span class="i">@ConnectdPathsSetsTypes</span><span class="cm">,</span> <span class="s">(</span><span class="q">&#39;FusedAromatic&#39;</span><span class="s">)</span> x <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$AromaticFusedRingSetsRef</span>}<span class="sc">;</span>
+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>
+2556 
+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>
+2558       <span class="k">my</span><span class="s">(</span><span class="i">@AromaticFusedRingBondsSet</span><span class="s">)</span><span class="sc">;</span>
+2559 
+2560       <span class="c"># Get ring bonds for each ring set...</span>
+2561       <span class="c">#</span>
+2562       <span class="i">@AromaticFusedRingBondsSet</span> = <span class="i">$This</span><span class="i">-&gt;GetRingBondsFromRings</span><span class="s">(</span><span class="i">@</span>{<span class="i">$AromaticFusedRingSetsRef</span>-&gt;[<span class="i">$RingSetIndex</span>]}<span class="s">)</span><span class="sc">;</span>
+2563       <span class="k">push</span> <span class="i">@ConnectedPathsBondsSets</span><span class="cm">,</span> \<span class="i">@AromaticFusedRingBondsSet</span><span class="sc">;</span>
+2564     <span class="s">}</span>
+2565   <span class="s">}</span>
+2566 
+2567   <span class="c"># Set up atoms and bonds for connected paths in aromatic rings...</span>
+2568   <span class="c">#</span>
+2569   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$AromaticRingsRef</span> &amp;&amp; <span class="i">@</span>{<span class="i">$AromaticRingsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2570     <span class="k">my</span><span class="s">(</span><span class="i">@AromaticRingBondsSets</span><span class="s">)</span><span class="sc">;</span>
+2571 
+2572     <span class="k">push</span> <span class="i">@ConnectdPathsSetsTypes</span><span class="cm">,</span> <span class="s">(</span><span class="q">&#39;Aromatic&#39;</span><span class="s">)</span> x <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$AromaticRingsRef</span>}<span class="sc">;</span>
+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>
+2574 
+2575     <span class="c"># Get ring bonds for each ring...</span>
+2576     <span class="i">@AromaticRingBondsSets</span> = <span class="i">$This</span><span class="i">-&gt;GetRingBondsFromRings</span><span class="s">(</span><span class="i">@</span>{<span class="i">$AromaticRingsRef</span>}<span class="s">)</span><span class="sc">;</span>
+2577     <span class="k">push</span> <span class="i">@ConnectedPathsBondsSets</span><span class="cm">,</span> <span class="i">@AromaticRingBondsSets</span><span class="sc">;</span>
+2578   <span class="s">}</span>
+2579 
+2580   <span class="c"># Set up atoms and bonds for connected paths in partially aromatic rings...</span>
+2581   <span class="c">#</span>
+2582   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$PartiallyAromaticRingComponentsRef</span> &amp;&amp; <span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponentsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2583     <span class="k">my</span><span class="s">(</span><span class="i">$ComponentIndex</span><span class="s">)</span><span class="sc">;</span>
+2584 
+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>
+2586     <span class="k">push</span> <span class="i">@ConnectdPathsSetsTypes</span><span class="cm">,</span> <span class="s">(</span><span class="q">&#39;PartiallyAromatic&#39;</span><span class="s">)</span> x <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponentsRef</span>}<span class="sc">;</span>
+2587 
+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>
+2589       <span class="k">my</span><span class="s">(</span><span class="i">@ComponentBonds</span><span class="s">)</span><span class="sc">;</span>
+2590       <span class="i">@ComponentBonds</span> = <span class="i">$This</span><span class="i">-&gt;_GetPathBonds</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;_GetAtomsIDsFromAtoms</span><span class="s">(</span><span class="i">@</span>{<span class="i">$PartiallyAromaticRingComponentsRef</span>-&gt;[<span class="i">$ComponentIndex</span>]}<span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+2591       <span class="k">push</span> <span class="i">@ConnectedPathsBondsSets</span><span class="cm">,</span> \<span class="i">@ComponentBonds</span><span class="sc">;</span>
+2592     <span class="s">}</span>
+2593   <span class="s">}</span>
+2594 
+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>
+2596 <span class="s">}</span>
+2597 
+2598 <span class="c"># Process non-ring connected atoms which are marked aromatic and set connected</span>
+2599 <span class="c"># bonds as alternate single/double bonds...</span>
+2600 <span class="c">#</span>
+2601 <span class="c"># Notes:</span>
+2602 <span class="c">#   . Atom and bond aromaticity is deleted during kekulization of non-ring atoms.</span>
+2603 <span class="c">#</span>
+<a name="_KekulizeAromaticAtomsNotInRings-"></a>2604 <span class="k">sub </span><span class="m">_KekulizeAromaticAtomsNotInRings</span> <span class="s">{</span>
+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>
+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>
+2607 
+2608   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasAromaticAtomsNotInRings</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2609     <span class="c"># Nothing to do...</span>
+2610     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2611   <span class="s">}</span>
+2612 
+2613   <span class="c"># Identify paths for connected components containing non-ring aromatic atoms...</span>
+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">-&gt;_GetConnectedComponentsPathsForNonRingAromaticAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2615 
+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>
+2617     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_KekulizeAromaticAtomsNotInRings: Couldn&#39;t perform kekulization for marked non-ring aromatic atoms...&quot;</span><span class="sc">;</span>
+2618     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2619   <span class="s">}</span>
+2620 
+2621   <span class="i">%PathAtomsProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2622   <span class="i">%PathBondsProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2623 
+2624   <span class="i">$Status</span> = <span class="n">1</span><span class="sc">;</span>
+2625 
+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>
+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>
+2628 
+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>
+2630 
+2631     <span class="i">@ConnectedPathAtomsSet</span> = <span class="s">(</span><span class="i">$ConnectedPathsAtomsRef</span>-&gt;[<span class="i">$PathIndex</span>]<span class="s">)</span><span class="sc">;</span>
+2632     <span class="i">@ConnectedPathBondsSet</span> = <span class="s">(</span><span class="i">$ConnectedPathsBondsRef</span>-&gt;[<span class="i">$PathIndex</span>]<span class="s">)</span><span class="sc">;</span>
+2633 
+2634     <span class="c"># Prepare for kekulization...</span>
+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">-&gt;_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>
+2636 
+2637     <span class="c"># Perform kekulization...</span>
+2638     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_KekulizeConnectedPathSets</span><span class="s">(</span><span class="i">$ConnectedPathsAtomsRef</span>-&gt;[<span class="i">$PathIndex</span>]<span class="cm">,</span> <span class="i">$ConnectedPathsBondsRef</span>-&gt;[<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>
+2639       <span class="c"># Kekulization failed for the current path...</span>
+2640       <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span>
+2641       <span class="k">last</span> <span class="j">PATH</span><span class="sc">;</span>
+2642     <span class="s">}</span>
+2643 
+2644     <span class="c"># Track atom and bond processing state for final assignment after kekulization</span>
+2645     <span class="c"># is successfully completed for all the paths and fused path sets...</span>
+2646     <span class="c">#</span>
+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>
+2648       <span class="i">$PathAtomsProcessingStatusMap</span>{<span class="i">$PathAtomID</span>} = <span class="i">$AtomProcessingStatusMapRef</span>-&gt;{<span class="i">$PathAtomID</span>}<span class="sc">;</span>
+2649     <span class="s">}</span>
+2650 
+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>
+2652       <span class="i">$PathBondsProcessingStatusMap</span>{<span class="i">$PathBondID</span>} = <span class="i">$BondProcessingStatusMapRef</span>-&gt;{<span class="i">$PathBondID</span>}<span class="sc">;</span>
+2653     <span class="s">}</span>
+2654   <span class="s">}</span>
+2655 
+2656   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Status</span><span class="s">)</span> <span class="s">{</span>
+2657     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_KekulizeAromaticAtomsNotInRings: Couldn&#39;t perform kekulization for marked non-ring aromatic atoms...&quot;</span><span class="sc">;</span>
+2658     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2659   <span class="s">}</span>
+2660 
+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>
+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>
+2663     <span class="k">if</span> <span class="s">(</span><span class="i">$DeleteAtomsAromaticity</span><span class="s">)</span> <span class="s">{</span>
+2664       <span class="k">for</span> <span class="i">$PathAtom</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConnectedPathsAtomsRef</span>-&gt;[<span class="i">$PathIndex</span>]}<span class="s">)</span> <span class="s">{</span>
+2665         <span class="i">$PathAtom</span><span class="i">-&gt;DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2666       <span class="s">}</span>
+2667     <span class="s">}</span>
+2668     <span class="i">$This</span><span class="i">-&gt;_ProcessBondOrdersAssignedDuringSuccessfulKekulization</span><span class="s">(</span><span class="i">$ConnectedPathsBondsRef</span>-&gt;[<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>
+2669   <span class="s">}</span>
+2670 
+2671   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2672 <span class="s">}</span>
+2673 
+2674 <span class="c"># Collect path atoms for connected components paths containing non-ring aromatic atoms...</span>
+2675 <span class="c">#</span>
+<a name="_GetConnectedComponentsPathsForNonRingAromaticAtoms-"></a>2676 <span class="k">sub </span><span class="m">_GetConnectedComponentsPathsForNonRingAromaticAtoms</span> <span class="s">{</span>
+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>
+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>
+2679 
+2680   <span class="c"># Retrieve information for marked aromatic atoms not in the rings...</span>
+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">-&gt;_GetNonRingAromaticAtomIDs</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2682 
+2683   <span class="c"># Identify connected components containing marked aromatic atoms not in the rings...</span>
+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">-&gt;_GetConnectedComponentsForNonRingAromaticAtoms</span><span class="s">(</span><span class="i">$AtomIDsRef</span><span class="s">)</span><span class="sc">;</span>
+2685 
+2686   <span class="c"># Identify paths for connected components containing non-ring aromatic atoms...</span>
+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">-&gt;_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>
+2688 
+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>
+2690 <span class="s">}</span>
+2691 
+2692 <span class="c"># Collect information for marked aromatic atoms not in the rings...</span>
+2693 <span class="c">#</span>
+<a name="_GetNonRingAromaticAtomIDs-"></a>2694 <span class="k">sub </span><span class="m">_GetNonRingAromaticAtomIDs</span> <span class="s">{</span>
+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>
+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>
+2697 
+2698   <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2699   <span class="i">%AtomIDsMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2700 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2702     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2703       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span>
+2704     <span class="s">}</span>
+2705     <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;IsInRing</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2706       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span>
+2707     <span class="s">}</span>
+2708     <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2709 
+2710     <span class="k">push</span> <span class="i">@AtomIDs</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="sc">;</span>
+2711     <span class="i">$AtomIDsMap</span>{<span class="i">$AtomID</span>} = <span class="i">$Atom</span><span class="sc">;</span>
+2712   <span class="s">}</span>
+2713 
+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>
+2715 <span class="s">}</span>
+2716 
+2717 <span class="c"># Retrieve connected non-ring atom components as a reference to an array of references</span>
+2718 <span class="c"># containing atom IDs of connecnted components...</span>
+2719 <span class="c">#</span>
+<a name="_GetConnectedComponentsForNonRingAromaticAtoms-"></a>2720 <span class="k">sub </span><span class="m">_GetConnectedComponentsForNonRingAromaticAtoms</span> <span class="s">{</span>
+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>
+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>
+2723 
+2724   <span class="i">@ComponentsAtomIDsRefs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2725   <span class="i">@ComponentsAtomIDsMapRefs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2726 
+2727   <span class="c"># Get bonded atom pair IDs...</span>
+2728   <span class="i">@BondedAtomPairIDs</span> = <span class="i">$This</span><span class="i">-&gt;_GetBondedAtomPairAtomIDsFromAtomIDs</span><span class="s">(</span><span class="i">@</span>{<span class="i">$AtomIDsRef</span>}<span class="s">)</span><span class="sc">;</span>
+2729 
+2730   <span class="k">if</span> <span class="s">(</span>!<span class="i">@BondedAtomPairIDs</span><span class="s">)</span> <span class="s">{</span>
+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>
+2732   <span class="s">}</span>
+2733 
+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>
+2735   <span class="i">$AtomIDsGraph</span><span class="i">-&gt;AddEdges</span><span class="s">(</span><span class="i">@BondedAtomPairIDs</span><span class="s">)</span><span class="sc">;</span>
+2736 
+2737   <span class="i">@ComponentsAtomIDsRefs</span> = <span class="i">$AtomIDsGraph</span><span class="i">-&gt;GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2738 
+2739   <span class="c"># Setup atom IDs map for each component...</span>
+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>
+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>
+2742 
+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>
+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>
+2745     <span class="s">}</span>
+2746   <span class="s">}</span>
+2747 
+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>
+2749 <span class="s">}</span>
+2750 
+2751 <span class="c"># Get linear paths for connected components starting and ending at terminal aromatic atoms,</span>
+2752 <span class="c"># which are connected to only one other aromatic atom in the connected component..</span>
+2753 <span class="c">#</span>
+<a name="_GetConnectedComponentsPathsAtomsAndBondsForNonRingAromaticAtoms-"></a>2754 <span class="k">sub </span><span class="m">_GetConnectedComponentsPathsAtomsAndBondsForNonRingAromaticAtoms</span> <span class="s">{</span>
+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>
+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>
+2757 
+2758   <span class="i">@PathsAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2759   <span class="i">@PathsBonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2760 
+2761   <span class="i">@TerminalAtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2762 
+2763   <span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span>
+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>
+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>
+2766 
+2767     <span class="c"># Identify terminal atoms for connected components...</span>
+2768     <span class="c">#</span>
+2769     <span class="c"># Notes:</span>
+2770     <span class="c">#   . Terminal atoms are defined as atoms connected to only one marked</span>
+2771     <span class="c">#     aromatic atom.</span>
+2772     <span class="c">#   . Linear connected compoents contain only two terminal atoms.</span>
+2773     <span class="c">#</span>
+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>-&gt;[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span>
+2775       <span class="i">$Atom</span> = <span class="i">$AtomIDsMapRef</span>-&gt;{<span class="i">$AtomID</span>}<span class="sc">;</span>
+2776       <span class="i">$NumOfNonRingAromaticNbrs</span> = <span class="n">0</span><span class="sc">;</span>
+2777 
+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">-&gt;GetNeighbors</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2779         <span class="i">$AtomNbrID</span> = <span class="i">$AtomNbr</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2780 
+2781         <span class="c"># Is neighbor in the same connected components containing aromatic atoms?</span>
+2782         <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$ComponentsAtomIDsMapRef</span>-&gt;[<span class="i">$Index</span>]{<span class="i">$AtomNbrID</span>}<span class="s">)</span> <span class="s">{</span>
+2783           <span class="k">next</span> <span class="j">ATOMNBRID</span><span class="sc">;</span>
+2784         <span class="s">}</span>
+2785         <span class="i">$NumOfNonRingAromaticNbrs</span>++<span class="sc">;</span>
+2786       <span class="s">}</span>
+2787 
+2788       <span class="c"># Is it a terminal atom?</span>
+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>
+2790         <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span>
+2791       <span class="s">}</span>
+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>
+2793     <span class="s">}</span>
+2794 
+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>
+2796       <span class="k">next</span> <span class="j">COMPONENT</span><span class="sc">;</span>
+2797     <span class="s">}</span>
+2798 
+2799     <span class="c"># Setup bonded atom pair IDs for connected component...</span>
+2800     <span class="c">#</span>
+2801     <span class="i">@AtomIDs</span> = <span class="i">@</span>{<span class="i">$ComponentsAtomIDsRef</span>-&gt;[<span class="i">$Index</span>]}<span class="sc">;</span>
+2802     <span class="i">@BondedAtomPairIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2803 
+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>
+2805       <span class="i">$AtomID1</span> = <span class="i">$AtomIDs</span>[<span class="i">$AtomIndex1</span>]<span class="sc">;</span>
+2806       <span class="i">$Atom1</span> = <span class="i">$AtomIDsMapRef</span>-&gt;{<span class="i">$AtomID1</span>}<span class="sc">;</span>
+2807 
+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>
+2809         <span class="i">$AtomID2</span> = <span class="i">$AtomIDs</span>[<span class="i">$AtomIndex2</span>]<span class="sc">;</span>
+2810         <span class="i">$Atom2</span> = <span class="i">$AtomIDsMapRef</span>-&gt;{<span class="i">$AtomID2</span>}<span class="sc">;</span>
+2811 
+2812         <span class="k">if</span> <span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;IsBondedToAtom</span><span class="s">(</span><span class="i">$Atom2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+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>
+2814         <span class="s">}</span>
+2815       <span class="s">}</span>
+2816     <span class="s">}</span>
+2817 
+2818     <span class="k">if</span> <span class="s">(</span>!<span class="i">@BondedAtomPairIDs</span><span class="s">)</span> <span class="s">{</span>
+2819       <span class="k">next</span> <span class="j">COMPONENT</span><span class="sc">;</span>
+2820     <span class="s">}</span>
+2821 
+2822     <span class="c"># Get path for connected component...</span>
+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>
+2824     <span class="i">$AtomIDsGraph</span><span class="i">-&gt;AddEdges</span><span class="s">(</span><span class="i">@BondedAtomPairIDs</span><span class="s">)</span><span class="sc">;</span>
+2825 
+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> &lt;=&gt; <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>
+2827     <span class="i">@Paths</span> = <span class="i">$AtomIDsGraph</span><span class="i">-&gt;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>
+2828 
+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>
+2830       <span class="k">next</span> <span class="j">COMPONENT</span><span class="sc">;</span>
+2831     <span class="s">}</span>
+2832 
+2833     <span class="i">@PathAtomIDs</span> = <span class="i">$Paths</span>[<span class="n">0</span>]<span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2834 
+2835     <span class="k">my</span><span class="s">(</span><span class="i">@PathAtoms</span><span class="s">)</span><span class="sc">;</span>
+2836     <span class="i">@PathAtoms</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@PathAtomIDs</span><span class="s">)</span><span class="sc">;</span>
+2837     <span class="k">push</span> <span class="i">@PathsAtoms</span><span class="cm">,</span> \<span class="i">@PathAtoms</span><span class="sc">;</span>
+2838 
+2839     <span class="k">my</span><span class="s">(</span><span class="i">@PathBonds</span><span class="s">)</span><span class="sc">;</span>
+2840     <span class="i">@PathBonds</span> = <span class="i">$This</span><span class="i">-&gt;_GetPathBonds</span><span class="s">(</span><span class="i">@PathAtomIDs</span><span class="s">)</span><span class="sc">;</span>
+2841     <span class="k">push</span> <span class="i">@PathsBonds</span><span class="cm">,</span> \<span class="i">@PathBonds</span><span class="sc">;</span>
+2842 
+2843   <span class="s">}</span>
+2844 
+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>
+2846 <span class="s">}</span>
+2847 
+2848 <span class="c"># Setup initial processing status of atoms and bonds involved in connected paths</span>
+2849 <span class="c"># before starting kekulization...</span>
+2850 <span class="c">#</span>
+2851 <span class="c"># Possible atom processing status: DoubleBondPossible, DoubleBondAssigned, DoubleBondNotPossible</span>
+2852 <span class="c"># Initial status: DoubleBondPossible or DoubleBondNotPossible</span>
+2853 <span class="c">#</span>
+2854 <span class="c"># Possible bond processing status: DoubleBondAssigned, SingleBondAssigned, NotProcessed</span>
+2855 <span class="c">#</span>
+2856 <span class="c"># Possible paths processing status: Processed, NotProcessed</span>
+2857 <span class="c"># Initial status: NotProcessed</span>
+2858 <span class="c">#</span>
+<a name="_SetupConnectedPathSetsForKekulization-"></a>2859 <span class="k">sub </span><span class="m">_SetupConnectedPathSetsForKekulization</span> <span class="s">{</span>
+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>
+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>
+2862 
+2863   <span class="c"># Possible path set status values: Processed, NotProcessed</span>
+2864   <span class="c"># Initial value: NotProcessed</span>
+2865   <span class="c">#</span>
+2866   <span class="i">@PathsProcessingStatus</span> = <span class="s">(</span><span class="q">&#39;NotProcessed&#39;</span><span class="s">)</span> x <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$PathAtomsSetsRef</span>}<span class="sc">;</span>
+2867 
+2868   <span class="c"># Collect initial bond order of path bonds before setting bond orders to 1</span>
+2869   <span class="c"># and use it to set the bond order back to intial value after it has been processed for</span>
+2870   <span class="c"># availability of double bonds...</span>
+2871   <span class="c">#</span>
+2872   <span class="i">%InitialPathBondOrderMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+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>
+2875       <span class="i">$BondID</span> = <span class="i">$Bond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+2877         <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span>
+2878       <span class="s">}</span>
+2879       <span class="i">$InitialPathBondOrderMap</span>{<span class="i">$BondID</span>} = <span class="i">$Bond</span><span class="i">-&gt;GetBondOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2880       <span class="i">$Bond</span><span class="i">-&gt;SetBondOrder</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span>
+2881     <span class="s">}</span>
+2882   <span class="s">}</span>
+2883 
+2884   <span class="i">%AtomProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2885   <span class="i">%BondProcessingStatusMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2886 
+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>
+2888 
+2889     <span class="i">$PathAtomsRef</span> = <span class="i">$PathAtomsSetsRef</span>-&gt;[<span class="i">$PathIndex</span>]<span class="sc">;</span>
+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>
+2891       <span class="i">$AtomID</span> = <span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+2893         <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span>
+2894       <span class="s">}</span>
+2895       <span class="i">$AtomProcessingStatusMap</span>{<span class="i">$AtomID</span>} = <span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetNumOfBondsAvailableForNonHydrogenAtoms</span><span class="s">(</span><span class="s">)</span> &gt;= <span class="n">1</span><span class="s">)</span> ? <span class="q">&#39;DoubleBondPossible&#39;</span> <span class="co">:</span> <span class="q">&#39;DoubleBondNotPossible&#39;</span><span class="sc">;</span>
+2896     <span class="s">}</span>
+2897 
+2898     <span class="i">$PathBondsRef</span> = <span class="i">$PathBondsSetsRef</span>-&gt;[<span class="i">$PathIndex</span>]<span class="sc">;</span>
+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>
+2900       <span class="i">$BondID</span> = <span class="i">$Bond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+2902         <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span>
+2903       <span class="s">}</span>
+2904       <span class="i">$BondProcessingStatusMap</span>{<span class="i">$BondID</span>} = <span class="q">&#39;NotProcessed&#39;</span><span class="sc">;</span>
+2905     <span class="s">}</span>
+2906   <span class="s">}</span>
+2907 
+2908   <span class="c"># Set bond orders back to initial bond orders...</span>
+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>
+2910     <span class="i">$PathBondsRef</span> = <span class="i">$PathBondsSetsRef</span>-&gt;[<span class="i">$PathIndex</span>]<span class="sc">;</span>
+2911 
+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>
+2913       <span class="i">$BondID</span> = <span class="i">$Bond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+2915         <span class="i">$Bond</span><span class="i">-&gt;SetBondOrder</span><span class="s">(</span><span class="i">$InitialPathBondOrderMap</span>{<span class="i">$BondID</span>}<span class="s">)</span><span class="sc">;</span>
+2916       <span class="s">}</span>
+2917     <span class="s">}</span>
+2918   <span class="s">}</span>
+2919 
+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>
+2921 <span class="s">}</span>
+2922 
+2923 <span class="c"># Kekulize connected path sets corresponding to fused rings, individual rings, or any other</span>
+2924 <span class="c"># connected path...</span>
+2925 <span class="c">#</span>
+2926 <span class="c"># Note:</span>
+2927 <span class="c">#   . PathAtomsRef and PathBondsRef contain paths and bonds corresponding to path</span>
+2928 <span class="c">#     under consideration for kekulization</span>
+2929 <span class="c">#   . PathAtomsSetsRef and PathBondsSetsRef contain any other available paths fused</span>
+2930 <span class="c">#     to the path being kekulized</span>
+2931 <span class="c">#   . _KekulizeConnectedPathSets is invoked recursively to kekulize all available paths</span>
+2932 <span class="c">#</span>
+<a name="_KekulizeConnectedPathSets-"></a>2933 <span class="k">sub </span><span class="m">_KekulizeConnectedPathSets</span> <span class="s">{</span>
+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>
+2935   <span class="k">my</span><span class="s">(</span><span class="i">$PathBond</span><span class="s">)</span><span class="sc">;</span>
+2936 
+2937   <span class="c"># Get next available path bond...</span>
+2938   <span class="i">$PathBond</span> = <span class="i">$This</span><span class="i">-&gt;_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>
+2939 
+2940   <span class="k">if</span> <span class="s">(</span><span class="i">$PathBond</span><span class="s">)</span> <span class="s">{</span>
+2941     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_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>
+2942   <span class="s">}</span>
+2943 
+2944   <span class="c"># Did kekulization succeed for the current path bonds?</span>
+2945   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_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>
+2946     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2947   <span class="s">}</span>
+2948 
+2949   <span class="c"># Is there any other path available for kekulization?</span>
+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">-&gt;_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>
+2951 
+2952   <span class="k">if</span> <span class="s">(</span><span class="i">$PathAtomsRef</span> &amp;&amp; <span class="i">$PathBondsRef</span><span class="s">)</span> <span class="s">{</span>
+2953     <span class="c"># Recursively call itself to kekulize next path, which could either be a new path or part</span>
+2954     <span class="c"># of a fused paths corresponding to fused ring sets...</span>
+2955     <span class="c">#</span>
+2956     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_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>
+2957   <span class="s">}</span>
+2958 
+2959   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2960 <span class="s">}</span>
+2961 
+2962 <span class="c"># Get next available path bond in a list of path bonds...</span>
+2963 <span class="c">#</span>
+<a name="_GetNextAvailablePathBondForKekulization-"></a>2964 <span class="k">sub </span><span class="m">_GetNextAvailablePathBondForKekulization</span> <span class="s">{</span>
+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>
+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>
+2967 
+2968   <span class="i">$AvailablePathBond</span> = <span class="k">undef</span><span class="sc">;</span>
+2969 
+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>
+2971     <span class="i">$PathBondID</span> = <span class="i">$PathBond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2972     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$BondProcessingStatusMapRef</span>-&gt;{<span class="i">$PathBondID</span>}<span class="s">)</span> <span class="s">{</span>
+2973       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span>
+2974     <span class="s">}</span>
+2975     <span class="k">if</span> <span class="s">(</span><span class="i">$BondProcessingStatusMapRef</span>-&gt;{<span class="i">$PathBondID</span>} =~ <span class="q">/^NotProcessed$/i</span><span class="s">)</span> <span class="s">{</span>
+2976       <span class="i">$AvailablePathBond</span> = <span class="i">$PathBond</span><span class="sc">;</span>
+2977       <span class="k">last</span> <span class="j">BOND</span><span class="sc">;</span>
+2978     <span class="s">}</span>
+2979   <span class="s">}</span>
+2980 
+2981   <span class="k">return</span> <span class="s">(</span><span class="i">$AvailablePathBond</span><span class="s">)</span><span class="sc">;</span>
+2982 <span class="s">}</span>
+2983 
+2984 <span class="c"># Process next available path bond for kekulizaiton...</span>
+2985 <span class="c">#</span>
+<a name="_ProcessNextAvailablePathBondForKekulization-"></a>2986 <span class="k">sub </span><span class="m">_ProcessNextAvailablePathBondForKekulization</span> <span class="s">{</span>
+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>
+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>
+2989 
+2990   <span class="i">$PathBondID</span> = <span class="i">$PathBond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2991 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$PathAtom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+2994 
+2995   <span class="i">%CurrentAtomProcessingStatusMap</span> = <span class="i">%</span>{<span class="i">$AtomProcessingStatusMapRef</span>}<span class="sc">;</span>
+2996   <span class="i">%CurrentBondProcessingStatusMap</span> = <span class="i">%</span>{<span class="i">$BondProcessingStatusMapRef</span>}<span class="sc">;</span>
+2997 
+2998   <span class="c"># Is it possible to assign a double bond to the current path bond?</span>
+2999   <span class="k">if</span> <span class="s">(</span><span class="i">$AtomProcessingStatusMapRef</span>-&gt;{<span class="i">$PathAtomID1</span>} =~ <span class="q">/^DoubleBondPossible$/i</span> &amp;&amp; <span class="i">$AtomProcessingStatusMapRef</span>-&gt;{<span class="i">$PathAtomID2</span>} =~ <span class="q">/^DoubleBondPossible$/i</span> <span class="s">)</span> <span class="s">{</span>
+3000     <span class="c"># Set current bond to double bond by appropriately marking atom and bond process status...</span>
+3001     <span class="i">$AtomProcessingStatusMapRef</span>-&gt;{<span class="i">$PathAtomID1</span>} = <span class="q">&#39;DoubleBondAssigned&#39;</span><span class="sc">;</span>
+3002     <span class="i">$AtomProcessingStatusMapRef</span>-&gt;{<span class="i">$PathAtomID2</span>} = <span class="q">&#39;DoubleBondAssigned&#39;</span><span class="sc">;</span>
+3003 
+3004     <span class="i">$BondProcessingStatusMapRef</span>-&gt;{<span class="i">$PathBondID</span>} = <span class="q">&#39;DoubleBondAssigned&#39;</span><span class="sc">;</span>
+3005 
+3006     <span class="c"># Recursively call  _KekulizeConnectedPathSets to kekulize next available bond...</span>
+3007     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;_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>
+3008       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+3009     <span class="s">}</span>
+3010 
+3011     <span class="c"># Double bond at the current ring bond position didn&#39;t lead to successful kekulization...</span>
+3012     <span class="i">%</span>{<span class="i">$AtomProcessingStatusMapRef</span>} = <span class="i">%CurrentAtomProcessingStatusMap</span><span class="sc">;</span>
+3013     <span class="i">%</span>{<span class="i">$BondProcessingStatusMapRef</span>} = <span class="i">%CurrentBondProcessingStatusMap</span><span class="sc">;</span>
+3014   <span class="s">}</span>
+3015 
+3016   <span class="c"># Try single bond at the current ring bond position and recursively call _KekulizeConnectedPathSets to kekulize</span>
+3017   <span class="c"># rest of the ring bonds...</span>
+3018   <span class="c">#</span>
+3019   <span class="i">$BondProcessingStatusMapRef</span>-&gt;{<span class="i">$PathBondID</span>} = <span class="q">&#39;SingleBondAssigned&#39;</span><span class="sc">;</span>
+3020 
+3021   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;_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>
+3022     <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+3023   <span class="s">}</span>
+3024 
+3025   <span class="i">%</span>{<span class="i">$AtomProcessingStatusMapRef</span>} = <span class="i">%CurrentAtomProcessingStatusMap</span><span class="sc">;</span>
+3026   <span class="i">%</span>{<span class="i">$BondProcessingStatusMapRef</span>} = <span class="i">%CurrentBondProcessingStatusMap</span><span class="sc">;</span>
+3027 
+3028   <span class="c"># Kekulization didn&#39;t work out for path bonds...</span>
+3029 
+3030   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+3031 
+3032 <span class="s">}</span>
+3033 
+3034 <span class="c"># Get next available path for kekulization from a set of fused ring paths...</span>
+3035 <span class="c">#</span>
+<a name="_GetNextAvailablePathForKekulization-"></a>3036 <span class="k">sub </span><span class="m">_GetNextAvailablePathForKekulization</span> <span class="s">{</span>
+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>
+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>
+3039 
+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>
+3041 
+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>  &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$PathBondsSetsRef</span><span class="s">)</span> &amp;&amp; <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>
+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>
+3044   <span class="s">}</span>
+3045 
+3046   <span class="i">$MaxNumOfPathBondsProcessed</span> = <span class="n">-999</span><span class="sc">;</span>
+3047   <span class="i">$AvailablePathIndex</span> = <span class="k">undef</span><span class="sc">;</span>
+3048 
+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>
+3050     <span class="k">if</span> <span class="s">(</span><span class="i">$PathsProcessingStatusRef</span>-&gt;[<span class="i">$PathIndex</span>] =~ <span class="q">/^Processed$/i</span><span class="s">)</span> <span class="s">{</span>
+3051       <span class="k">next</span> <span class="j">PATHINDEX</span><span class="sc">;</span>
+3052     <span class="s">}</span>
+3053 
+3054     <span class="c"># Count of already processed bonds in an unprocessed path bonds through</span>
+3055     <span class="c"># their participation in any fused bonds sets...</span>
+3056     <span class="c">#</span>
+3057     <span class="i">$NumOfPathBondsProcessed</span> = <span class="n">0</span><span class="sc">;</span>
+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>-&gt;[<span class="i">$PathIndex</span>]}<span class="s">)</span> <span class="s">{</span>
+3059       <span class="i">$PathBondID</span> = <span class="i">$PathBond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3060       <span class="k">if</span> <span class="s">(</span><span class="i">$BondProcessingStatusMapRef</span>-&gt;{<span class="i">$PathBondID</span>} =~ <span class="q">/^NotProcessed$/i</span><span class="s">)</span> <span class="s">{</span>
+3061         <span class="k">next</span> <span class="j">PATHBOND</span><span class="sc">;</span>
+3062       <span class="s">}</span>
+3063       <span class="i">$NumOfPathBondsProcessed</span>++<span class="sc">;</span>
+3064     <span class="s">}</span>
+3065 
+3066     <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfPathBondsProcessed</span> &gt; <span class="i">$MaxNumOfPathBondsProcessed</span><span class="s">)</span> <span class="s">{</span>
+3067       <span class="i">$AvailablePathIndex</span> = <span class="i">$PathIndex</span><span class="sc">;</span>
+3068       <span class="i">$MaxNumOfPathBondsProcessed</span> = <span class="i">$NumOfPathBondsProcessed</span><span class="sc">;</span>
+3069     <span class="s">}</span>
+3070 
+3071   <span class="s">}</span>
+3072 
+3073   <span class="c"># Is any path available?</span>
+3074   <span class="k">if</span> <span class="s">(</span>!<span class="i">$AvailablePathIndex</span><span class="s">)</span> <span class="s">{</span>
+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>
+3076   <span class="s">}</span>
+3077 
+3078   <span class="i">$PathsProcessingStatusRef</span>-&gt;[<span class="i">$AvailablePathIndex</span>] = <span class="q">&#39;Processed&#39;</span><span class="sc">;</span>
+3079 
+3080   <span class="i">$PathAtomsRef</span> = <span class="i">$PathAtomsSetsRef</span>-&gt;[<span class="i">$AvailablePathIndex</span>]<span class="sc">;</span>
+3081   <span class="i">$PathBondsRef</span> = <span class="i">$PathBondsSetsRef</span>-&gt;[<span class="i">$AvailablePathIndex</span>]<span class="sc">;</span>
+3082 
+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>
+3084 <span class="s">}</span>
+3085 
+3086 <span class="c"># Check for kekulization in a specific set of path bonds. For successful kekulization, all</span>
+3087 <span class="c"># all path atoms marked with DoubleBondPossible must be involved in a path double bond...</span>
+3088 <span class="c">#</span>
+<a name="_DidKekulizationSucceedForPathBonds-"></a>3089 <span class="k">sub </span><span class="m">_DidKekulizationSucceedForPathBonds</span> <span class="s">{</span>
+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>
+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>
+3092 
+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>
+3094     <span class="i">$PathAtomID</span> = <span class="i">$PathAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3095     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$AtomProcessingStatusMapRef</span>-&gt;{<span class="i">$PathAtomID</span>} &amp;&amp; <span class="i">$AtomProcessingStatusMapRef</span>-&gt;{<span class="i">$PathAtomID</span>} =~ <span class="q">/^DoubleBondPossible$/i</span><span class="s">)</span> <span class="s">{</span>
+3096       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+3097     <span class="s">}</span>
+3098   <span class="s">}</span>
+3099   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+3100 <span class="s">}</span>
+3101 
+3102 <span class="c"># Assign bond orders to the bonds in a molecule which have been successfully</span>
+3103 <span class="c"># kekulized along with optional clearing of aromaticty property...</span>
+3104 <span class="c">#</span>
+<a name="_ProcessBondOrdersAssignedDuringSuccessfulKekulization-"></a>3105 <span class="k">sub </span><span class="m">_ProcessBondOrdersAssignedDuringSuccessfulKekulization</span> <span class="s">{</span>
+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>
+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>
+3108 
+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>
+3110 
+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>
+3112     <span class="i">$BondID</span> = <span class="i">$Bond</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3113 
+3114     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$BondsProcessingStatusMapRef</span>-&gt;{<span class="i">$BondID</span>}<span class="s">)</span> <span class="s">{</span>
+3115       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ProcessBondOrdersAssignedDuringSuccessfulKekulization: Couldn&#39;t process bond with bond ID, $BondID: It&#39;s not available in the list of bonds processed for kekulization...&quot;</span><span class="sc">;</span>
+3116       <span class="k">next</span> <span class="j">BOND</span><span class="sc">;</span>
+3117     <span class="s">}</span>
+3118 
+3119     <span class="i">$BondOrder</span> = <span class="s">(</span><span class="i">$BondsProcessingStatusMapRef</span>-&gt;{<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>
+3120     <span class="i">$Bond</span><span class="i">-&gt;SetBondOrder</span><span class="s">(</span><span class="i">$BondOrder</span><span class="s">)</span><span class="sc">;</span>
+3121 
+3122     <span class="k">if</span> <span class="s">(</span><span class="i">$DeleteBondsAromaticity</span><span class="s">)</span> <span class="s">{</span>
+3123       <span class="i">$Bond</span><span class="i">-&gt;DeleteAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3124     <span class="s">}</span>
+3125   <span class="s">}</span>
+3126   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+3127 <span class="s">}</span>
+3128 
+3129 <span class="c"># Does molecule contains aromatic rings?</span>
+3130 <span class="c">#</span>
+<a name="HasAromaticRings-"></a>3131 <span class="k">sub </span><span class="m">HasAromaticRings</span> <span class="s">{</span>
+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>
+3133 
+3134   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;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>
+3135 <span class="s">}</span>
+3136 
+3137 <span class="c"># Does molecule contains any aromatic atom in a ring?</span>
+3138 <span class="c">#</span>
+<a name="HasAromaticAtomsInRings-"></a>3139 <span class="k">sub </span><span class="m">HasAromaticAtomsInRings</span> <span class="s">{</span>
+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>
+3141   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+3142 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+3144     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+3145       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span>
+3146     <span class="s">}</span>
+3147     <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;IsInRing</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+3148       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+3149     <span class="s">}</span>
+3150   <span class="s">}</span>
+3151   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+3152 <span class="s">}</span>
+3153 
+3154 <span class="c"># Does molecule contains any aromatic atom not in a ring?</span>
+3155 <span class="c">#</span>
+<a name="HasAromaticAtomsNotInRings-"></a>3156 <span class="k">sub </span><span class="m">HasAromaticAtomsNotInRings</span> <span class="s">{</span>
+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>
+3158   <span class="k">my</span><span class="s">(</span><span class="i">$Atom</span><span class="s">)</span><span class="sc">;</span>
+3159 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+3161     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom</span><span class="i">-&gt;IsAromatic</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+3162       <span class="k">next</span> <span class="j">ATOM</span><span class="sc">;</span>
+3163     <span class="s">}</span>
+3164     <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;IsNotInRing</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+3165       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+3166     <span class="s">}</span>
+3167   <span class="s">}</span>
+3168   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+3169 <span class="s">}</span>
+3170 
+3171 <span class="c"># Does molecule contains rings?</span>
+3172 <span class="c">#</span>
+<a name="HasRings-"></a>3173 <span class="k">sub </span><span class="m">HasRings</span> <span class="s">{</span>
+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>
+3175 
+3176   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsCyclic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3177 <span class="s">}</span>
+3178 
+3179 <span class="c"># Does molecule contains only one ring?</span>
+3180 <span class="c">#</span>
+<a name="HasOnlyOneRing-"></a>3181 <span class="k">sub </span><span class="m">HasOnlyOneRing</span> <span class="s">{</span>
+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>
+3183 
+3184   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUnicyclic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3185 <span class="s">}</span>
+3186 
+3187 <span class="c"># Does molecule contains any rings?</span>
+3188 <span class="c">#</span>
+<a name="HasNoRings-"></a>3189 <span class="k">sub </span><span class="m">HasNoRings</span> <span class="s">{</span>
+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>
+3191 
+3192   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsAcyclic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3193 <span class="s">}</span>
+3194 
+3195 <span class="c"># Get size of smallest ring...</span>
+3196 <span class="c">#</span>
+<a name="GetSizeOfSmallestRing-"></a>3197 <span class="k">sub </span><span class="m">GetSizeOfSmallestRing</span> <span class="s">{</span>
+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>
+3199 
+3200   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSizeOfSmallestCycle</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3201 <span class="s">}</span>
+3202 
+3203 <span class="c"># Get size of largest ring...</span>
+3204 <span class="c">#</span>
+<a name="GetSizeOfLargestRing-"></a>3205 <span class="k">sub </span><span class="m">GetSizeOfLargestRing</span> <span class="s">{</span>
+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>
+3207 
+3208   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSizeOfLargestCycle</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3209 <span class="s">}</span>
+3210 
+3211 <span class="c"># Get number of rings...</span>
+3212 <span class="c">#</span>
+<a name="GetNumOfRings-"></a>3213 <span class="k">sub </span><span class="m">GetNumOfRings</span> <span class="s">{</span>
+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>
+3215 
+3216   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3217 <span class="s">}</span>
+3218 
+3219 <span class="c"># Get number of aromatic rings...</span>
+3220 <span class="c">#</span>
+<a name="GetNumOfAromaticRings-"></a>3221 <span class="k">sub </span><span class="m">GetNumOfAromaticRings</span> <span class="s">{</span>
+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>
+3223   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRings</span><span class="s">)</span><span class="sc">;</span>
+3224 
+3225   <span class="i">$NumOfRings</span> = <span class="k">scalar</span> <span class="i">$This</span><span class="i">-&gt;GetAromaticRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3226 
+3227   <span class="k">return</span> <span class="i">$NumOfRings</span><span class="sc">;</span>
+3228 <span class="s">}</span>
+3229 
+3230 <span class="c"># Get num of rings with odd size...</span>
+3231 <span class="c">#</span>
+<a name="GetNumOfRingsWithOddSize-"></a>3232 <span class="k">sub </span><span class="m">GetNumOfRingsWithOddSize</span> <span class="s">{</span>
+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>
+3234 
+3235   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfCyclesWithOddSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3236 <span class="s">}</span>
+3237 
+3238 <span class="c"># Get num of rings with even size...</span>
+3239 <span class="c">#</span>
+<a name="GetNumOfRingsWithEvenSize-"></a>3240 <span class="k">sub </span><span class="m">GetNumOfRingsWithEvenSize</span> <span class="s">{</span>
+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>
+3242 
+3243   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfCyclesWithEvenSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3244 <span class="s">}</span>
+3245 
+3246 <span class="c"># Get num of rings with specified size...</span>
+3247 <span class="c">#</span>
+<a name="GetNumOfRingsWithSize-"></a>3248 <span class="k">sub </span><span class="m">GetNumOfRingsWithSize</span> <span class="s">{</span>
+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>
+3250 
+3251   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfCyclesWithSize</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span>
+3252 <span class="s">}</span>
+3253 
+3254 <span class="c"># Get num of rings with size less than a specified size...</span>
+3255 <span class="c">#</span>
+<a name="GetNumOfRingsWithSizeLessThan-"></a>3256 <span class="k">sub </span><span class="m">GetNumOfRingsWithSizeLessThan</span> <span class="s">{</span>
+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>
+3258 
+3259   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span>
+3260 <span class="s">}</span>
+3261 
+3262 <span class="c"># Get num of rings with size greater than a specified size...</span>
+3263 <span class="c">#</span>
+<a name="GetNumOfRingsWithSizeGreaterThan-"></a>3264 <span class="k">sub </span><span class="m">GetNumOfRingsWithSizeGreaterThan</span> <span class="s">{</span>
+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>
+3266 
+3267   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="sc">;</span>
+3268 <span class="s">}</span>
+3269 
+3270 <span class="c"># Get largest ring as an array containing ring atoms...</span>
+3271 <span class="c">#</span>
+<a name="GetLargestRing-"></a>3272 <span class="k">sub </span><span class="m">GetLargestRing</span> <span class="s">{</span>
+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>
+3274 
+3275   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetLargestCycle</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3276 <span class="s">}</span>
+3277 
+3278 <span class="c"># Get smallest ring as an array containing ring atoms...</span>
+3279 <span class="c">#</span>
+<a name="GetSmallestRing-"></a>3280 <span class="k">sub </span><span class="m">GetSmallestRing</span> <span class="s">{</span>
+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>
+3282 
+3283   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSmallestCycle</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3284 <span class="s">}</span>
+3285 
+3286 <span class="c"># Get rings as an array containing references to arrays with ring atoms...</span>
+3287 <span class="c">#</span>
+<a name="GetRings-"></a>3288 <span class="k">sub </span><span class="m">GetRings</span> <span class="s">{</span>
+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>
+3290 
+3291   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetCycles</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3292 <span class="s">}</span>
+3293 
+3294 <span class="c"># Get aromatic rings as an array containing references to arrays with ring atoms...</span>
+3295 <span class="c">#</span>
+<a name="GetAromaticRings-"></a>3296 <span class="k">sub </span><span class="m">GetAromaticRings</span> <span class="s">{</span>
+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>
+3298 
+3299   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAromaticRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetCycles</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3300 <span class="s">}</span>
+3301 
+3302 <span class="c"># Get odd size rings as an array containing references to arrays with ring atoms...</span>
+3303 <span class="c">#</span>
+<a name="GetRingsWithOddSize-"></a>3304 <span class="k">sub </span><span class="m">GetRingsWithOddSize</span> <span class="s">{</span>
+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>
+3306 
+3307   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetCyclesWithOddSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3308 <span class="s">}</span>
+3309 
+3310 <span class="c"># Get even size rings as an array containing references to arrays with ring atoms...</span>
+3311 <span class="c">#</span>
+<a name="GetRingsWithEvenSize-"></a>3312 <span class="k">sub </span><span class="m">GetRingsWithEvenSize</span> <span class="s">{</span>
+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>
+3314 
+3315   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetCyclesWithEvenSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3316 <span class="s">}</span>
+3317 
+3318 <span class="c"># Get rings with a specific size as an array containing references to arrays with ring atoms...</span>
+3319 <span class="c">#</span>
+<a name="GetRingsWithSize-"></a>3320 <span class="k">sub </span><span class="m">GetRingsWithSize</span> <span class="s">{</span>
+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>
+3322 
+3323   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetCyclesWithSize</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3324 <span class="s">}</span>
+3325 
+3326 <span class="c"># Get rings with size less than a specific size as an array containing references to arrays with ring atoms...</span>
+3327 <span class="c">#</span>
+<a name="GetRingsWithSizeLessThan-"></a>3328 <span class="k">sub </span><span class="m">GetRingsWithSizeLessThan</span> <span class="s">{</span>
+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>
+3330 
+3331   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3332 <span class="s">}</span>
+3333 
+3334 <span class="c"># Get rings with size greater than a specific size as an array containing references to arrays with ring atoms...</span>
+3335 <span class="c">#</span>
+<a name="GetRingsWithSizeGreaterThan-"></a>3336 <span class="k">sub </span><span class="m">GetRingsWithSizeGreaterThan</span> <span class="s">{</span>
+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>
+3338 
+3339   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$RingSize</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3340 <span class="s">}</span>
+3341 
+3342 <span class="c"># Generate an array of bond objects for an array of ring atoms and return an array</span>
+3343 <span class="c"># of bond objects...</span>
+3344 <span class="c">#</span>
+<a name="GetRingBonds-"></a>3345 <span class="k">sub </span><span class="m">GetRingBonds</span> <span class="s">{</span>
+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>
+3347   <span class="k">my</span><span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span>
+3348 
+3349   <span class="i">@Bonds</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3350   <span class="k">if</span> <span class="s">(</span>!<span class="i">@RingAtoms</span><span class="s">)</span> <span class="s">{</span>
+3351     <span class="c"># Return an empty ring bonds list...</span>
+3352     <span class="k">return</span> <span class="i">@Bonds</span><span class="sc">;</span>
+3353   <span class="s">}</span>
+3354 
+3355   <span class="k">my</span><span class="s">(</span><span class="i">@RingAtomIDs</span><span class="s">)</span><span class="sc">;</span>
+3356 
+3357   <span class="i">@RingAtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3358   <span class="i">@RingAtomIDs</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomsIDsFromAtoms</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="sc">;</span>
+3359   <span class="k">if</span> <span class="s">(</span>!<span class="i">@RingAtomIDs</span><span class="s">)</span> <span class="s">{</span>
+3360     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;GetRingBonds: No ring bonds retrieved: Atom IDs couldn&#39;t be retrieved for specified atoms...&quot;</span><span class="sc">;</span>
+3361     <span class="k">return</span> <span class="i">@Bonds</span><span class="sc">;</span>
+3362   <span class="s">}</span>
+3363 
+3364   <span class="c"># Add start atom to the end to make it a cyclic path for ring: It&#39;s taken out during conversion</span>
+3365   <span class="c"># of cyclic path to a ring...</span>
+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>
+3367 
+3368   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetPathBonds</span><span class="s">(</span><span class="i">@RingAtomIDs</span><span class="s">)</span><span class="sc">;</span>
+3369 <span class="s">}</span>
+3370 
+3371 <span class="c"># Generate an array containing references to arrays of ring bond objects for rings specified</span>
+3372 <span class="c"># in an array of references to ring atoms...</span>
+3373 <span class="c">#</span>
+<a name="GetRingBondsFromRings-"></a>3374 <span class="k">sub </span><span class="m">GetRingBondsFromRings</span> <span class="s">{</span>
+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>
+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>
+3377 
+3378   <span class="i">@RingBondsSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+3380     <span class="k">my</span><span class="s">(</span><span class="i">@RingBonds</span><span class="s">)</span><span class="sc">;</span>
+3381     <span class="i">@RingBonds</span> = <span class="i">$This</span><span class="i">-&gt;GetRingBonds</span><span class="s">(</span><span class="i">@</span>{<span class="i">$RingAtomsRef</span>}<span class="s">)</span><span class="sc">;</span>
+3382 
+3383     <span class="k">push</span> <span class="i">@RingBondsSets</span><span class="cm">,</span> \<span class="i">@RingBonds</span><span class="sc">;</span>
+3384   <span class="s">}</span>
+3385 
+3386   <span class="k">return</span> <span class="i">@RingBondsSets</span><span class="sc">;</span>
+3387 <span class="s">}</span>
+3388 
+3389 <span class="c"># Does molecule has any fused rings?</span>
+3390 <span class="c">#</span>
+<a name="HasFusedRings-"></a>3391 <span class="k">sub </span><span class="m">HasFusedRings</span> <span class="s">{</span>
+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>
+3393 
+3394   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;HasFusedCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3395 <span class="s">}</span>
+3396 
+3397 <span class="c"># Get references to array of fused ring sets and non-fused rings. Fused ring sets array reference</span>
+3398 <span class="c"># contains refernces to arrays of rings; Non-fused rings array reference contains references to</span>
+3399 <span class="c"># arrays of ring atoms...</span>
+3400 <span class="c"># rings.</span>
+3401 <span class="c">#</span>
+<a name="GetFusedAndNonFusedRings-"></a>3402 <span class="k">sub </span><span class="m">GetFusedAndNonFusedRings</span> <span class="s">{</span>
+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>
+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>
+3405 
+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>
+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">-&gt;GetFusedAndNonFusedCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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> &amp;&amp; <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>
+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>
+3410   <span class="s">}</span>
+3411   <span class="k">my</span><span class="s">(</span><span class="i">$FusedCyclesSetRef</span><span class="s">)</span><span class="sc">;</span>
+3412 
+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>
+3414     <span class="k">my</span><span class="s">(</span><span class="i">@FusedRingSet</span><span class="s">)</span><span class="sc">;</span>
+3415     <span class="i">@FusedRingSet</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3416     <span class="i">@FusedRingSet</span> = <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">@</span>{<span class="i">$FusedCyclesSetRef</span>}<span class="s">)</span><span class="sc">;</span>
+3417     <span class="k">push</span> <span class="i">@FusedRingSets</span><span class="cm">,</span> \<span class="i">@FusedRingSet</span><span class="sc">;</span>
+3418   <span class="s">}</span>
+3419 
+3420   <span class="i">@NonFusedRings</span> = <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">@</span>{<span class="i">$NonFusedCyclesRef</span>}<span class="s">)</span><span class="sc">;</span>
+3421 
+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>
+3423 <span class="s">}</span>
+3424 
+3425 <span class="c"># Get rings as an array containing references to arrays with ring atoms...</span>
+3426 <span class="c">#</span>
+<a name="_GetRings-"></a>3427 <span class="k">sub </span><span class="m">_GetRings</span> <span class="s">{</span>
+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>
+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>
+3430 
+3431   <span class="i">@Rings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3432   <span class="k">if</span> <span class="s">(</span>!<span class="i">@CyclicPaths</span><span class="s">)</span> <span class="s">{</span>
+3433     <span class="k">return</span> <span class="i">@Rings</span><span class="sc">;</span>
+3434   <span class="s">}</span>
+3435   <span class="k">if</span> <span class="s">(</span>!<span class="i">@CyclicPaths</span><span class="s">)</span> <span class="s">{</span>
+3436     <span class="c"># Return an empty ring list...</span>
+3437     <span class="k">return</span> <span class="i">@Rings</span><span class="sc">;</span>
+3438   <span class="s">}</span>
+3439 
+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>
+3441     <span class="k">my</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="sc">;</span>
+3442     <span class="i">@RingAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3443     <span class="k">push</span> <span class="i">@RingAtoms</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetRing</span><span class="s">(</span><span class="i">$CyclicPath</span><span class="s">)</span><span class="sc">;</span>
+3444 
+3445     <span class="k">push</span> <span class="i">@Rings</span><span class="cm">,</span> \<span class="i">@RingAtoms</span><span class="sc">;</span>
+3446   <span class="s">}</span>
+3447   <span class="k">return</span> <span class="i">@Rings</span><span class="sc">;</span>
+3448 <span class="s">}</span>
+3449 
+3450 <span class="c"># Get aromatic rings as an array containing references to arrays with ring atoms...</span>
+3451 <span class="c">#</span>
+<a name="_GetAromaticRings-"></a>3452 <span class="k">sub </span><span class="m">_GetAromaticRings</span> <span class="s">{</span>
+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>
+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>
+3455 
+3456   <span class="i">@AromaticRings</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3457   <span class="i">@Rings</span> = <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">@CyclicPaths</span><span class="s">)</span><span class="sc">;</span>
+3458 
+3459   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Rings</span><span class="s">)</span> <span class="s">{</span>
+3460     <span class="k">return</span> <span class="i">@AromaticRings</span><span class="sc">;</span>
+3461   <span class="s">}</span>
+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>
+3463     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;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>
+3464       <span class="k">next</span> <span class="j">RING</span><span class="sc">;</span>
+3465     <span class="s">}</span>
+3466     <span class="k">my</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="sc">;</span>
+3467     <span class="i">@RingAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+3469 
+3470     <span class="k">push</span> <span class="i">@AromaticRings</span><span class="cm">,</span> \<span class="i">@RingAtoms</span><span class="sc">;</span>
+3471   <span class="s">}</span>
+3472   <span class="k">return</span> <span class="i">@AromaticRings</span><span class="sc">;</span>
+3473 <span class="s">}</span>
+3474 
+3475 <span class="c"># Map atom IDs in cyclic path to atoms and return a reference to an array containing ring atoms...</span>
+3476 <span class="c">#</span>
+3477 <span class="c"># Note:</span>
+3478 <span class="c">#   . Start and end vertex is same for cyclic paths. So end atom is removed before</span>
+3479 <span class="c">#     returning atoms array as ring atoms...</span>
+3480 <span class="c">#</span>
+<a name="_GetRing-"></a>3481 <span class="k">sub </span><span class="m">_GetRing</span> <span class="s">{</span>
+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>
+3483   <span class="k">my</span><span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span><span class="sc">;</span>
+3484 
+3485   <span class="i">@RingAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+3487     <span class="c"># Return an empty atoms list...</span>
+3488     <span class="k">return</span> <span class="i">@RingAtoms</span><span class="sc">;</span>
+3489   <span class="s">}</span>
+3490 
+3491   <span class="i">@RingAtoms</span> = <span class="i">$This</span><span class="i">-&gt;_GetPathAtoms</span><span class="s">(</span><span class="i">$CyclicPath</span><span class="s">)</span><span class="sc">;</span>
+3492   <span class="k">if</span> <span class="s">(</span><span class="i">@RingAtoms</span><span class="s">)</span> <span class="s">{</span>
+3493     <span class="k">pop</span> <span class="i">@RingAtoms</span><span class="sc">;</span>
+3494   <span class="s">}</span>
+3495   <span class="k">return</span> <span class="i">@RingAtoms</span><span class="sc">;</span>
+3496 <span class="s">}</span>
+3497 
+3498 <span class="c"># Map atom IDs to atoms and return a reference to an array containing these atoms...</span>
+3499 <span class="c">#</span>
+<a name="_GetPathAtoms-"></a>3500 <span class="k">sub </span><span class="m">_GetPathAtoms</span> <span class="s">{</span>
+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>
+3502   <span class="k">my</span><span class="s">(</span><span class="i">@PathAtoms</span><span class="s">)</span><span class="sc">;</span>
+3503 
+3504   <span class="i">@PathAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+3506     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetPathAtoms: No path atoms retrieved: Path must be defined...&quot;</span><span class="sc">;</span>
+3507     <span class="k">return</span> <span class="i">@PathAtoms</span><span class="sc">;</span>
+3508   <span class="s">}</span>
+3509   <span class="k">my</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span>
+3510 
+3511   <span class="i">@AtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3512   <span class="i">@AtomIDs</span> = <span class="i">$Path</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3513 
+3514   <span class="i">@PathAtoms</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span>
+3515 
+3516   <span class="k">return</span> <span class="i">@PathAtoms</span><span class="sc">;</span>
+3517 <span class="s">}</span>
+3518 
+3519 <span class="c"># Get bonds for a path specified by atom IDs...</span>
+3520 <span class="c">#</span>
+<a name="_GetPathBonds-"></a>3521 <span class="k">sub </span><span class="m">_GetPathBonds</span> <span class="s">{</span>
+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>
+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>
+3524 
+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>
+3526 
+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>
+3528     <span class="k">return</span> <span class="i">@Bonds</span><span class="sc">;</span>
+3529   <span class="s">}</span>
+3530 
+3531   <span class="c"># Setup edges...</span>
+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>
+3533     <span class="i">$AtomID1</span> = <span class="i">$AtomIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span>
+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>
+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>
+3536   <span class="s">}</span>
+3537   <span class="i">@Bonds</span> =  <span class="i">$This</span><span class="i">-&gt;GetEdgesProperty</span><span class="s">(</span><span class="q">&#39;Bond&#39;</span><span class="cm">,</span> <span class="i">@EdgesAtomIDs</span><span class="s">)</span><span class="sc">;</span>
+3538 
+3539   <span class="k">return</span> <span class="i">@Bonds</span><span class="sc">;</span>
+3540 <span class="s">}</span>
+3541 
+3542 <span class="c"># Map atom ID to an atom...</span>
+3543 <span class="c">#</span>
+<a name="_GetAtomFromAtomID-"></a>3544 <span class="k">sub </span><span class="m">_GetAtomFromAtomID</span> <span class="s">{</span>
+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>
+3546 
+3547   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetVertexProperty</span><span class="s">(</span><span class="q">&#39;Atom&#39;</span><span class="cm">,</span> <span class="i">$AtomID</span><span class="s">)</span><span class="sc">;</span>
+3548 <span class="s">}</span>
+3549 
+3550 <span class="c"># Map atom IDs to atoms and return an array containing these atoms...</span>
+3551 <span class="c">#</span>
+<a name="_GetAtomsFromAtomIDs-"></a>3552 <span class="k">sub </span><span class="m">_GetAtomsFromAtomIDs</span> <span class="s">{</span>
+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>
+3554 
+3555   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetVerticesProperty</span><span class="s">(</span><span class="q">&#39;Atom&#39;</span><span class="cm">,</span> <span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span>
+3556 <span class="s">}</span>
+3557 
+3558 <span class="c"># Map atoms to atom IDs and return an array containing these atoms...</span>
+3559 <span class="c">#</span>
+<a name="_GetAtomsIDsFromAtoms-"></a>3560 <span class="k">sub </span><span class="m">_GetAtomsIDsFromAtoms</span> <span class="s">{</span>
+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>
+3562 
+3563   <span class="k">return</span> <span class="k">map</span> <span class="s">{</span> <span class="i">$_</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span> <span class="s">}</span> <span class="i">@Atoms</span><span class="sc">;</span>
+3564 <span class="s">}</span>
+3565 
+3566 <span class="c"># Get bonded atom pair atom IDs for specified list of atom IDs...</span>
+3567 <span class="c">#</span>
+<a name="_GetBondedAtomPairAtomIDsFromAtomIDs-"></a>3568 <span class="k">sub </span><span class="m">_GetBondedAtomPairAtomIDsFromAtomIDs</span> <span class="s">{</span>
+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>
+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>
+3571 
+3572   <span class="i">@BondedAtomPairIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3573   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@AtomIDs</span><span class="s">)</span><span class="sc">;</span>
+3574 
+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>
+3576     <span class="i">$Atom1</span> = <span class="i">$Atoms</span>[<span class="i">$AtomIndex1</span>]<span class="sc">;</span>
+3577     <span class="i">$AtomID1</span> = <span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3578 
+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>
+3580       <span class="i">$Atom2</span> = <span class="i">$Atoms</span>[<span class="i">$AtomIndex2</span>]<span class="sc">;</span>
+3581       <span class="k">if</span> <span class="s">(</span>!<span class="i">$Atom1</span><span class="i">-&gt;IsBondedToAtom</span><span class="s">(</span><span class="i">$Atom2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+3582         <span class="k">next</span> <span class="j">ATOMINDEX2</span><span class="sc">;</span>
+3583        <span class="s">}</span>
+3584       <span class="i">$AtomID2</span> = <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3585 
+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>
+3587     <span class="s">}</span>
+3588   <span class="s">}</span>
+3589 
+3590   <span class="k">return</span> <span class="i">@BondedAtomPairIDs</span><span class="sc">;</span>
+3591 <span class="s">}</span>
+3592 
+3593 <span class="c"># Get bonded atom pair atoms for specified list of atoms...</span>
+3594 <span class="c">#</span>
+<a name="_GetBondedAtomPairAtomsFromAtoms-"></a>3595 <span class="k">sub </span><span class="m">_GetBondedAtomPairAtomsFromAtoms</span> <span class="s">{</span>
+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>
+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>
+3598 
+3599   <span class="i">@BondedAtomPairAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3600 
+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>
+3602     <span class="i">$Atom1</span> = <span class="i">$Atoms</span>[<span class="i">$AtomIndex1</span>]<span class="sc">;</span>
+3603 
+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>
+3605       <span class="i">$Atom2</span> = <span class="i">$Atoms</span>[<span class="i">$AtomIndex2</span>]<span class="sc">;</span>
+3606       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;IsBondedToAtom</span><span class="s">(</span><span class="i">$Atom2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+3607         <span class="k">next</span> <span class="j">ATOMINDEX2</span><span class="sc">;</span>
+3608        <span class="s">}</span>
+3609 
+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>
+3611     <span class="s">}</span>
+3612   <span class="s">}</span>
+3613 
+3614   <span class="k">return</span> <span class="i">@BondedAtomPairAtoms</span><span class="sc">;</span>
+3615 <span class="s">}</span>
+3616 
+3617 <span class="c"># Is atom in a ring?</span>
+3618 <span class="c">#</span>
+<a name="_IsAtomInRing-"></a>3619 <span class="k">sub </span><span class="m">_IsAtomInRing</span> <span class="s">{</span>
+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>
+3621 
+3622   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsCyclicVertex</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3623 <span class="s">}</span>
+3624 
+3625 <span class="c"># Is atom not in a ring?</span>
+3626 <span class="c">#</span>
+<a name="_IsAtomNotInRing-"></a>3627 <span class="k">sub </span><span class="m">_IsAtomNotInRing</span> <span class="s">{</span>
+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>
+3629 
+3630   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsAcyclicVertex</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3631 <span class="s">}</span>
+3632 
+3633 <span class="c"># Is atom only in one ring?</span>
+3634 <span class="c">#</span>
+<a name="_IsAtomInOnlyOneRing-"></a>3635 <span class="k">sub </span><span class="m">_IsAtomInOnlyOneRing</span> <span class="s">{</span>
+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>
+3637 
+3638   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUnicyclicVertex</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3639 <span class="s">}</span>
+3640 
+3641 <span class="c"># Is atom in a ring of specified size?</span>
+3642 <span class="c">#</span>
+<a name="_IsAtomInRingOfSize-"></a>3643 <span class="k">sub </span><span class="m">_IsAtomInRingOfSize</span> <span class="s">{</span>
+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>
+3645 
+3646   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfVertexCyclesWithSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;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>
+3647 <span class="s">}</span>
+3648 
+3649 <span class="c"># Get size of smallest ring containing specified atom...</span>
+3650 <span class="c">#</span>
+<a name="_GetSizeOfSmallestAtomRing-"></a>3651 <span class="k">sub </span><span class="m">_GetSizeOfSmallestAtomRing</span> <span class="s">{</span>
+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>
+3653 
+3654   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSizeOfSmallestVertexCycle</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3655 <span class="s">}</span>
+3656 
+3657 <span class="c"># Get size of largest ring containing specified atom...</span>
+3658 <span class="c">#</span>
+<a name="_GetSizeOfLargestAtomRing-"></a>3659 <span class="k">sub </span><span class="m">_GetSizeOfLargestAtomRing</span> <span class="s">{</span>
+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>
+3661 
+3662   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSizeOfLargestVertexCycle</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3663 <span class="s">}</span>
+3664 
+3665 <span class="c"># Get number of  rings containing specified atom...</span>
+3666 <span class="c">#</span>
+<a name="_GetNumOfAtomRings-"></a>3667 <span class="k">sub </span><span class="m">_GetNumOfAtomRings</span> <span class="s">{</span>
+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>
+3669 
+3670   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfVertexCycles</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3671 <span class="s">}</span>
+3672 
+3673 <span class="c"># Get number of  rings with odd size containing specified atom...</span>
+3674 <span class="c">#</span>
+<a name="_GetNumOfAtomRingsWithOddSize-"></a>3675 <span class="k">sub </span><span class="m">_GetNumOfAtomRingsWithOddSize</span> <span class="s">{</span>
+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>
+3677 
+3678   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfVertexCyclesWithOddSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3679 <span class="s">}</span>
+3680 
+3681 <span class="c"># Get number of  rings with even size containing specified atom...</span>
+3682 <span class="c">#</span>
+<a name="_GetNumOfAtomRingsWithEvenSize-"></a>3683 <span class="k">sub </span><span class="m">_GetNumOfAtomRingsWithEvenSize</span> <span class="s">{</span>
+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>
+3685 
+3686   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfVertexCyclesWithEvenSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3687 <span class="s">}</span>
+3688 
+3689 <span class="c"># Get number of  rings with specified size containing specified atom...</span>
+3690 <span class="c">#</span>
+<a name="_GetNumOfAtomRingsWithSize-"></a>3691 <span class="k">sub </span><span class="m">_GetNumOfAtomRingsWithSize</span> <span class="s">{</span>
+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>
+3693 
+3694   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfVertexCyclesWithSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;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>
+3695 <span class="s">}</span>
+3696 
+3697 <span class="c"># Get number of  rings with size less than specified containing specified atom...</span>
+3698 <span class="c">#</span>
+<a name="_GetNumOfAtomRingsWithSizeLessThan-"></a>3699 <span class="k">sub </span><span class="m">_GetNumOfAtomRingsWithSizeLessThan</span> <span class="s">{</span>
+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>
+3701 
+3702   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfVertexCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;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>
+3703 <span class="s">}</span>
+3704 
+3705 <span class="c"># Get number of  rings with size greater than specified containing specified atom...</span>
+3706 <span class="c">#</span>
+<a name="_GetNumOfAtomRingsWithSizeGreaterThan-"></a>3707 <span class="k">sub </span><span class="m">_GetNumOfAtomRingsWithSizeGreaterThan</span> <span class="s">{</span>
+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>
+3709 
+3710   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfVertexCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;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>
+3711 <span class="s">}</span>
+3712 
+3713 <span class="c"># Get smallest ring as an array containing ring atoms...</span>
+3714 <span class="c">#</span>
+<a name="_GetSmallestAtomRing-"></a>3715 <span class="k">sub </span><span class="m">_GetSmallestAtomRing</span> <span class="s">{</span>
+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>
+3717 
+3718   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSmallestVertexCycle</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3719 <span class="s">}</span>
+3720 
+3721 <span class="c"># Get odd size rings an array of references to arrays containing ring atoms...</span>
+3722 <span class="c">#</span>
+<a name="_GetLargestAtomRing-"></a>3723 <span class="k">sub </span><span class="m">_GetLargestAtomRing</span> <span class="s">{</span>
+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>
+3725 
+3726   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetLargestVertexCycle</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3727 <span class="s">}</span>
+3728 
+3729 <span class="c"># Get all rings an array of references to arrays containing ring atoms...</span>
+3730 <span class="c">#</span>
+<a name="_GetAtomRings-"></a>3731 <span class="k">sub </span><span class="m">_GetAtomRings</span> <span class="s">{</span>
+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>
+3733 
+3734   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetVertexCycles</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3735 <span class="s">}</span>
+3736 
+3737 <span class="c"># Get odd size rings an array of references to arrays containing ring atoms...</span>
+3738 <span class="c">#</span>
+<a name="_GetAtomRingsWithOddSize-"></a>3739 <span class="k">sub </span><span class="m">_GetAtomRingsWithOddSize</span> <span class="s">{</span>
+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>
+3741 
+3742   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetVertexCyclesWithOddSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3743 <span class="s">}</span>
+3744 
+3745 <span class="c"># Get even size rings an array of references to arrays containing ring atoms...</span>
+3746 <span class="c">#</span>
+<a name="_GetAtomRingsWithEvenSize-"></a>3747 <span class="k">sub </span><span class="m">_GetAtomRingsWithEvenSize</span> <span class="s">{</span>
+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>
+3749 
+3750   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetVertexCyclesWithEvenSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3751 <span class="s">}</span>
+3752 
+3753 <span class="c"># Get rings with specified size  an array of references to arrays containing ring atoms...</span>
+3754 <span class="c">#</span>
+<a name="_GetAtomRingsWithSize-"></a>3755 <span class="k">sub </span><span class="m">_GetAtomRingsWithSize</span> <span class="s">{</span>
+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>
+3757 
+3758   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetVertexCyclesWithSize</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;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>
+3759 <span class="s">}</span>
+3760 
+3761 <span class="c"># Get rings with size less than specfied size as an array of references to arrays containing ring atoms...</span>
+3762 <span class="c">#</span>
+<a name="_GetAtomRingsWithSizeLessThan-"></a>3763 <span class="k">sub </span><span class="m">_GetAtomRingsWithSizeLessThan</span> <span class="s">{</span>
+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>
+3765 
+3766   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetVertexCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;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>
+3767 <span class="s">}</span>
+3768 
+3769 <span class="c"># Get rings with size less than specfied size as an array of references to arrays containing ring atoms...</span>
+3770 <span class="c">#</span>
+<a name="_GetAtomRingsWithSizeGreaterThan-"></a>3771 <span class="k">sub </span><span class="m">_GetAtomRingsWithSizeGreaterThan</span> <span class="s">{</span>
+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>
+3773 
+3774   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetVertexCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;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>
+3775 <span class="s">}</span>
+3776 
+3777 <span class="c"># Is bond in a ring?</span>
+3778 <span class="c">#</span>
+<a name="_IsBondInRing-"></a>3779 <span class="k">sub </span><span class="m">_IsBondInRing</span> <span class="s">{</span>
+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>
+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>
+3782 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3784 
+3785   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsCyclicEdge</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3786 <span class="s">}</span>
+3787 
+3788 <span class="c"># Is bond not in a ring?</span>
+3789 <span class="c">#</span>
+<a name="_IsBondNotInRing-"></a>3790 <span class="k">sub </span><span class="m">_IsBondNotInRing</span> <span class="s">{</span>
+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>
+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>
+3793 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3795 
+3796   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsAcyclicEdge</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3797 <span class="s">}</span>
+3798 
+3799 <span class="c"># Is bond only in one ring?</span>
+3800 <span class="c">#</span>
+<a name="_IsBondInOnlyOneRing-"></a>3801 <span class="k">sub </span><span class="m">_IsBondInOnlyOneRing</span> <span class="s">{</span>
+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>
+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>
+3804 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3806 
+3807   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUnicyclicEdge</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3808 <span class="s">}</span>
+3809 
+3810 <span class="c"># Is bond in a ring of specified size?</span>
+3811 <span class="c">#</span>
+<a name="_IsBondInRingOfSize-"></a>3812 <span class="k">sub </span><span class="m">_IsBondInRingOfSize</span> <span class="s">{</span>
+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>
+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>
+3815 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3817 
+3818   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfEdgeCyclesWithSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;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>
+3819 <span class="s">}</span>
+3820 
+3821 <span class="c"># Get size of smallest ring containing specified bond...</span>
+3822 <span class="c">#</span>
+<a name="_GetSizeOfSmallestBondRing-"></a>3823 <span class="k">sub </span><span class="m">_GetSizeOfSmallestBondRing</span> <span class="s">{</span>
+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>
+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>
+3826 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3828 
+3829   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSizeOfSmallestEdgeCycle</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3830 <span class="s">}</span>
+3831 
+3832 <span class="c"># Get size of largest ring containing specified bond...</span>
+3833 <span class="c">#</span>
+<a name="_GetSizeOfLargestBondRing-"></a>3834 <span class="k">sub </span><span class="m">_GetSizeOfLargestBondRing</span> <span class="s">{</span>
+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>
+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>
+3837 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3839 
+3840   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSizeOfLargestEdgeCycle</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3841 <span class="s">}</span>
+3842 
+3843 <span class="c"># Get number of  rings containing specified bond...</span>
+3844 <span class="c">#</span>
+<a name="_GetNumOfBondRings-"></a>3845 <span class="k">sub </span><span class="m">_GetNumOfBondRings</span> <span class="s">{</span>
+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>
+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>
+3848 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3850 
+3851   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfEdgeCycles</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3852 <span class="s">}</span>
+3853 
+3854 <span class="c"># Get number of  rings with odd size containing specified bond...</span>
+3855 <span class="c">#</span>
+<a name="_GetNumOfBondRingsWithOddSize-"></a>3856 <span class="k">sub </span><span class="m">_GetNumOfBondRingsWithOddSize</span> <span class="s">{</span>
+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>
+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>
+3859 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3861 
+3862   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfEdgeCyclesWithOddSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3863 <span class="s">}</span>
+3864 
+3865 <span class="c"># Get number of  rings with even size containing specified bond...</span>
+3866 <span class="c">#</span>
+<a name="_GetNumOfBondRingsWithEvenSize-"></a>3867 <span class="k">sub </span><span class="m">_GetNumOfBondRingsWithEvenSize</span> <span class="s">{</span>
+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>
+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>
+3870 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3872 
+3873   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfEdgeCyclesWithEvenSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3874 <span class="s">}</span>
+3875 
+3876 <span class="c"># Get number of  rings with specified size containing specified bond...</span>
+3877 <span class="c">#</span>
+<a name="_GetNumOfBondRingsWithSize-"></a>3878 <span class="k">sub </span><span class="m">_GetNumOfBondRingsWithSize</span> <span class="s">{</span>
+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>
+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>
+3881 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3883 
+3884   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfEdgeCyclesWithSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;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>
+3885 <span class="s">}</span>
+3886 
+3887 <span class="c"># Get number of  rings with size less than specified containing specified bond...</span>
+3888 <span class="c">#</span>
+<a name="_GetNumOfBondRingsWithSizeLessThan-"></a>3889 <span class="k">sub </span><span class="m">_GetNumOfBondRingsWithSizeLessThan</span> <span class="s">{</span>
+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>
+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>
+3892 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3894 
+3895   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfEdgeCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;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>
+3896 <span class="s">}</span>
+3897 
+3898 <span class="c"># Get number of  rings with size greater than specified containing specified bond...</span>
+3899 <span class="c">#</span>
+<a name="_GetNumOfBondRingsWithSizeGreaterThan-"></a>3900 <span class="k">sub </span><span class="m">_GetNumOfBondRingsWithSizeGreaterThan</span> <span class="s">{</span>
+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>
+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>
+3903 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3905 
+3906   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfEdgeCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;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>
+3907 <span class="s">}</span>
+3908 
+3909 <span class="c"># Get smallest ring as an array containing ring atoms...</span>
+3910 <span class="c">#</span>
+<a name="_GetSmallestBondRing-"></a>3911 <span class="k">sub </span><span class="m">_GetSmallestBondRing</span> <span class="s">{</span>
+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>
+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>
+3914 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3916 
+3917   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSmallestEdgeCycle</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3918 <span class="s">}</span>
+3919 
+3920 <span class="c"># Get odd size rings an array of references to arrays containing ring atoms...</span>
+3921 <span class="c">#</span>
+<a name="_GetLargestBondRing-"></a>3922 <span class="k">sub </span><span class="m">_GetLargestBondRing</span> <span class="s">{</span>
+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>
+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>
+3925 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3927 
+3928   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRing</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetLargestEdgeCycle</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3929 <span class="s">}</span>
+3930 
+3931 <span class="c"># Get all rings an array of references to arrays containing ring atoms...</span>
+3932 <span class="c">#</span>
+<a name="_GetBondRings-"></a>3933 <span class="k">sub </span><span class="m">_GetBondRings</span> <span class="s">{</span>
+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>
+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>
+3936 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3938 
+3939   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetEdgeCycles</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3940 <span class="s">}</span>
+3941 
+3942 <span class="c"># Get odd size rings an array of references to arrays containing ring atoms...</span>
+3943 <span class="c">#</span>
+<a name="_GetBondRingsWithOddSize-"></a>3944 <span class="k">sub </span><span class="m">_GetBondRingsWithOddSize</span> <span class="s">{</span>
+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>
+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>
+3947 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3949 
+3950   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetEdgeCyclesWithOddSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3951 <span class="s">}</span>
+3952 
+3953 <span class="c"># Get even size rings an array of references to arrays containing ring atoms...</span>
+3954 <span class="c">#</span>
+<a name="_GetBondRingsWithEvenSize-"></a>3955 <span class="k">sub </span><span class="m">_GetBondRingsWithEvenSize</span> <span class="s">{</span>
+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>
+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>
+3958 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3960 
+3961   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetEdgeCyclesWithEvenSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+3962 <span class="s">}</span>
+3963 
+3964 <span class="c"># Get rings with specified size  an array of references to arrays containing ring atoms...</span>
+3965 <span class="c">#</span>
+<a name="_GetBondRingsWithSize-"></a>3966 <span class="k">sub </span><span class="m">_GetBondRingsWithSize</span> <span class="s">{</span>
+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>
+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>
+3969 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3971 
+3972   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetEdgeCyclesWithSize</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;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>
+3973 <span class="s">}</span>
+3974 
+3975 <span class="c"># Get rings with size less than specfied size as an array of references to arrays containing ring atoms...</span>
+3976 <span class="c">#</span>
+<a name="_GetBondRingsWithSizeLessThan-"></a>3977 <span class="k">sub </span><span class="m">_GetBondRingsWithSizeLessThan</span> <span class="s">{</span>
+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>
+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>
+3980 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3982 
+3983   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetEdgeCyclesWithSizeLessThan</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;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>
+3984 <span class="s">}</span>
+3985 
+3986 <span class="c"># Get rings with size less than specfied size as an array of references to arrays containing ring atoms...</span>
+3987 <span class="c">#</span>
+<a name="_GetBondRingsWithSizeGreaterThan-"></a>3988 <span class="k">sub </span><span class="m">_GetBondRingsWithSizeGreaterThan</span> <span class="s">{</span>
+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>
+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>
+3991 
+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">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3993 
+3994   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRings</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetEdgeCyclesWithSizeGreaterThan</span><span class="s">(</span><span class="i">$Atom1</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$Atom2</span><span class="i">-&gt;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>
+3995 <span class="s">}</span>
+3996 
+3997 
+3998 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span>
+3999 <span class="c"># to arrays with path atoms.</span>
+4000 <span class="c">#</span>
+4001 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with length</span>
+4002 <span class="c"># upto a specified length and sharing of bonds in paths traversed. By default, rings are</span>
+4003 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4004 <span class="c">#</span>
+4005 <span class="c"># Note:</span>
+4006 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span>
+4007 <span class="c">#      as GetAtomPathsStartingAtWithLengthUpto method.</span>
+4008 <span class="c">#</span>
+<a name="GetAllAtomPathsStartingAtWithLengthUpto-"></a>4009 <span class="k">sub </span><span class="m">GetAllAtomPathsStartingAtWithLengthUpto</span> <span class="s">{</span>
+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>
+4011 
+4012   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">&#39;AllAtomPathsWithLengthUpto&#39;</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>
+4013 <span class="s">}</span>
+4014 
+4015 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span>
+4016 <span class="c"># to arrays with path atoms.</span>
+4017 <span class="c">#</span>
+4018 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with</span>
+4019 <span class="c"># specified length and sharing of bonds in paths traversed. By default, rings are</span>
+4020 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4021 <span class="c">#</span>
+4022 <span class="c"># Note:</span>
+4023 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span>
+4024 <span class="c">#      as GetAtomPathsStartingAtWithLengthUpto method.</span>
+4025 <span class="c">#</span>
+<a name="GetAllAtomPathsStartingAtWithLength-"></a>4026 <span class="k">sub </span><span class="m">GetAllAtomPathsStartingAtWithLength</span> <span class="s">{</span>
+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>
+4028 
+4029   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">&#39;AllAtomPathsWithLength&#39;</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>
+4030 <span class="s">}</span>
+4031 
+4032 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span>
+4033 <span class="c"># to arrays with path atoms.</span>
+4034 <span class="c">#</span>
+4035 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with all</span>
+4036 <span class="c"># possible lengths and sharing of bonds in paths traversed. By default, rings are</span>
+4037 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4038 <span class="c">#</span>
+4039 <span class="c"># Note:</span>
+4040 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span>
+4041 <span class="c">#      as GetAtomPathsStartingAt method.</span>
+4042 <span class="c">#</span>
+<a name="GetAllAtomPathsStartingAt-"></a>4043 <span class="k">sub </span><span class="m">GetAllAtomPathsStartingAt</span> <span class="s">{</span>
+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>
+4045 
+4046   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">&#39;AllAtomPathsWithAllLengths&#39;</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>
+4047 <span class="s">}</span>
+4048 
+4049 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span>
+4050 <span class="c"># to arrays with path atoms.</span>
+4051 <span class="c">#</span>
+4052 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with length</span>
+4053 <span class="c"># upto a specified length and no sharing of bonds in paths traversed. By default, rings are</span>
+4054 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4055 <span class="c">#</span>
+<a name="GetAtomPathsStartingAtWithLengthUpto-"></a>4056 <span class="k">sub </span><span class="m">GetAtomPathsStartingAtWithLengthUpto</span> <span class="s">{</span>
+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>
+4058 
+4059   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">&#39;AtomPathsWithLengthUpto&#39;</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>
+4060 <span class="s">}</span>
+4061 
+4062 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span>
+4063 <span class="c"># to arrays with path atoms.</span>
+4064 <span class="c">#</span>
+4065 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with</span>
+4066 <span class="c"># specified length and no sharing of bonds in paths traversed. By default, rings are</span>
+4067 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4068 <span class="c">#</span>
+<a name="GetAtomPathsStartingAtWithLength-"></a>4069 <span class="k">sub </span><span class="m">GetAtomPathsStartingAtWithLength</span> <span class="s">{</span>
+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>
+4071 
+4072   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">&#39;AtomPathsWithLength&#39;</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 <span class="s">}</span>
+4074 
+4075 <span class="c"># Get atom paths starting from a specified atom as a reference to an array containing references</span>
+4076 <span class="c"># to arrays with path atoms.</span>
+4077 <span class="c">#</span>
+4078 <span class="c"># Path atoms atoms correspond to to all possible paths for specified atom in molecule with all</span>
+4079 <span class="c"># possible lengths and no sharing of bonds in paths traversed. By default, rings are</span>
+4080 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4081 <span class="c">#</span>
+4082 <span class="c">#</span>
+<a name="GetAtomPathsStartingAt-"></a>4083 <span class="k">sub </span><span class="m">GetAtomPathsStartingAt</span> <span class="s">{</span>
+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>
+4085 
+4086   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPathsStartingAt</span><span class="s">(</span><span class="q">&#39;AtomPathsWithAllLengths&#39;</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>
+4087 <span class="s">}</span>
+4088 
+4089 <span class="c"># Get atom paths as an array containing references to arrays with path atoms...</span>
+4090 <span class="c">#</span>
+<a name="_GetAtomPathsStartingAt-"></a>4091 <span class="k">sub </span><span class="m">_GetAtomPathsStartingAt</span> <span class="s">{</span>
+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>
+4093   <span class="k">my</span><span class="s">(</span><span class="i">@AtomPaths</span><span class="s">)</span><span class="sc">;</span>
+4094 
+4095   <span class="i">@AtomPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4097     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetAtomPathsStartingAt: No atom paths retrieved: Start atom is not defined...&quot;</span><span class="sc">;</span>
+4098     <span class="k">return</span> <span class="i">@AtomPaths</span><span class="sc">;</span>
+4099   <span class="s">}</span>
+4100   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasAtom</span><span class="s">(</span><span class="i">$StartAtom</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+4101     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetAtomPathsStartingAt: No atom paths retrieved: Start atom doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+4102     <span class="k">return</span> <span class="i">@AtomPaths</span><span class="sc">;</span>
+4103   <span class="s">}</span>
+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>
+4105 
+4106   <span class="i">$StartAtomID</span> = <span class="i">$StartAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4107   <span class="i">@Paths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4108 
+4109   <span class="c"># Collect appropriate atom paths...</span>
+4110   <span class="j">MODE:</span> <span class="s">{</span>
+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">-&gt;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>
+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">-&gt;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>
+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">-&gt;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>
+4114 
+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">-&gt;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>
+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">-&gt;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>
+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">-&gt;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>
+4118 
+4119     <span class="k">print</span> <span class="q">&quot;Warn: ${ClassName}-&gt;_GetAtomPathsStartingAt: No atom paths retrieved: Mode, $Mode, is not supported...&quot;</span><span class="sc">;</span>
+4120     <span class="k">return</span> <span class="i">@AtomPaths</span><span class="sc">;</span>
+4121   <span class="s">}</span>
+4122   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPathsFromPaths</span><span class="s">(</span>\<span class="i">@Paths</span><span class="s">)</span><span class="sc">;</span>
+4123 <span class="s">}</span>
+4124 
+4125 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span>
+4126 <span class="c"># path atoms.</span>
+4127 <span class="c">#</span>
+4128 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with length</span>
+4129 <span class="c"># upto a specified length and sharing of bonds in paths traversed. By default, rings are</span>
+4130 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4131 <span class="c">#</span>
+4132 <span class="c"># Notes:</span>
+4133 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span>
+4134 <span class="c">#      as GetAtomPathsWithLengthUpto method.</span>
+4135 <span class="c">#</span>
+<a name="GetAllAtomPathsWithLengthUpto-"></a>4136 <span class="k">sub </span><span class="m">GetAllAtomPathsWithLengthUpto</span> <span class="s">{</span>
+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>
+4138 
+4139   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPaths</span><span class="s">(</span><span class="q">&#39;AllAtomPathsWithLengthUpto&#39;</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>
+4140 <span class="s">}</span>
+4141 
+4142 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span>
+4143 <span class="c"># path atoms.</span>
+4144 <span class="c">#</span>
+4145 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with</span>
+4146 <span class="c"># a specified length and sharing of bonds in paths traversed. By default, rings are</span>
+4147 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4148 <span class="c">#</span>
+4149 <span class="c"># Notes:</span>
+4150 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span>
+4151 <span class="c">#      as GetAtomPathsWithLengthUpto method.</span>
+4152 <span class="c">#</span>
+<a name="GetAllAtomPathsWithLength-"></a>4153 <span class="k">sub </span><span class="m">GetAllAtomPathsWithLength</span> <span class="s">{</span>
+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>
+4155 
+4156   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPaths</span><span class="s">(</span><span class="q">&#39;AllAtomPathsWithLength&#39;</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>
+4157 <span class="s">}</span>
+4158 
+4159 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span>
+4160 <span class="c"># path atoms.</span>
+4161 <span class="c">#</span>
+4162 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with all</span>
+4163 <span class="c"># possible lengths and sharing of bonds in paths traversed. By default, rings are</span>
+4164 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4165 <span class="c">#</span>
+4166 <span class="c"># Notes:</span>
+4167 <span class="c">#    . For molecule without any rings, this method returns the same set of atom paths</span>
+4168 <span class="c">#      as GetAtomPaths method.</span>
+4169 <span class="c">#</span>
+<a name="GetAllAtomPaths-"></a>4170 <span class="k">sub </span><span class="m">GetAllAtomPaths</span> <span class="s">{</span>
+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>
+4172 
+4173   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPaths</span><span class="s">(</span><span class="q">&#39;AllAtomPathsWithAllLengths&#39;</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>
+4174 <span class="s">}</span>
+4175 
+4176 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span>
+4177 <span class="c"># path atoms.</span>
+4178 <span class="c">#</span>
+4179 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with length</span>
+4180 <span class="c"># upto a specified length and no sharing of bonds in paths traversed. By default, rings are</span>
+4181 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4182 <span class="c">#</span>
+<a name="GetAtomPathsWithLengthUpto-"></a>4183 <span class="k">sub </span><span class="m">GetAtomPathsWithLengthUpto</span> <span class="s">{</span>
+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>
+4185 
+4186   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPaths</span><span class="s">(</span><span class="q">&#39;AtomPathsWithLengthUpto&#39;</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>
+4187 <span class="s">}</span>
+4188 
+4189 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span>
+4190 <span class="c"># path atoms.</span>
+4191 <span class="c">#</span>
+4192 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with</span>
+4193 <span class="c"># a specified length and no sharing of bonds in paths traversed. By default, rings are</span>
+4194 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4195 <span class="c">#</span>
+<a name="GetAtomPathsWithLength-"></a>4196 <span class="k">sub </span><span class="m">GetAtomPathsWithLength</span> <span class="s">{</span>
+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>
+4198 
+4199   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPaths</span><span class="s">(</span><span class="q">&#39;AtomPathsWithLength&#39;</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 <span class="s">}</span>
+4201 
+4202 
+4203 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span>
+4204 <span class="c"># path atoms.</span>
+4205 <span class="c">#</span>
+4206 <span class="c"># Path atoms correspond to to all possible paths for each atom in molecule with all</span>
+4207 <span class="c"># possible lengths and no sharing of bonds in paths traversed. By default, rings are</span>
+4208 <span class="c"># included in paths. A path containing a ring is terminated at an atom completing the ring.</span>
+4209 <span class="c">#</span>
+<a name="GetAtomPaths-"></a>4210 <span class="k">sub </span><span class="m">GetAtomPaths</span> <span class="s">{</span>
+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>
+4212 
+4213   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPaths</span><span class="s">(</span><span class="q">&#39;AtomPathsWithAllLengths&#39;</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>
+4214 <span class="s">}</span>
+4215 
+4216 <span class="c"># Get atom paths for all atoms as a reference to an array containing references to arrays with</span>
+4217 <span class="c"># path atoms.</span>
+4218 <span class="c">#</span>
+<a name="_GetAtomPaths-"></a>4219 <span class="k">sub </span><span class="m">_GetAtomPaths</span> <span class="s">{</span>
+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>
+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>
+4222 
+4223   <span class="i">@AtomPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4224   <span class="c"># Collect appropriate atom paths...</span>
+4225   <span class="j">MODE:</span> <span class="s">{</span>
+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">-&gt;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>
+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">-&gt;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>
+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">-&gt;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>
+4229 
+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">-&gt;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>
+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">-&gt;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>
+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">-&gt;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>
+4233 
+4234     <span class="k">print</span> <span class="q">&quot;Warn: ${ClassName}-&gt;_GetAtomPaths: No atom paths retrieved: Mode, $Mode, is not supported...&quot;</span><span class="sc">;</span>
+4235     <span class="k">return</span> \<span class="i">@AtomPaths</span><span class="sc">;</span>
+4236   <span class="s">}</span>
+4237   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPathsFromPaths</span><span class="s">(</span><span class="i">$PathsRef</span><span class="s">)</span><span class="sc">;</span>
+4238 <span class="s">}</span>
+4239 
+4240 <span class="c"># Get atom paths as an array reference containing references to arrays with path atoms...</span>
+4241 <span class="c">#</span>
+<a name="_GetAtomPathsFromPaths-"></a>4242 <span class="k">sub </span><span class="m">_GetAtomPathsFromPaths</span> <span class="s">{</span>
+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>
+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>
+4245 
+4246   <span class="i">@AtomPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4248     <span class="k">return</span> \<span class="i">@AtomPaths</span><span class="sc">;</span>
+4249   <span class="s">}</span>
+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>
+4251     <span class="c"># Return an empty atom paths list...</span>
+4252     <span class="k">return</span> \<span class="i">@AtomPaths</span><span class="sc">;</span>
+4253   <span class="s">}</span>
+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>
+4255     <span class="k">my</span><span class="s">(</span><span class="i">@PathAtoms</span><span class="s">)</span><span class="sc">;</span>
+4256     <span class="i">@PathAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4257     <span class="i">@PathAtoms</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomPathFromPath</span><span class="s">(</span><span class="i">$Path</span><span class="s">)</span><span class="sc">;</span>
+4258 
+4259     <span class="k">push</span> <span class="i">@AtomPaths</span><span class="cm">,</span> \<span class="i">@PathAtoms</span><span class="sc">;</span>
+4260   <span class="s">}</span>
+4261   <span class="k">return</span> \<span class="i">@AtomPaths</span><span class="sc">;</span>
+4262 <span class="s">}</span>
+4263 
+4264 <span class="c"># Generate an array of bond objects for an array of path atoms and return an array</span>
+4265 <span class="c"># of bond objects...</span>
+4266 <span class="c">#</span>
+<a name="GetAtomPathBonds-"></a>4267 <span class="k">sub </span><span class="m">GetAtomPathBonds</span> <span class="s">{</span>
+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>
+4269   <span class="k">my</span><span class="s">(</span><span class="i">@Bonds</span><span class="s">)</span><span class="sc">;</span>
+4270 
+4271   <span class="k">if</span> <span class="s">(</span>!<span class="i">@PathAtoms</span><span class="s">)</span> <span class="s">{</span>
+4272     <span class="c"># Return an empty ring bonds list...</span>
+4273     <span class="k">return</span> <span class="i">@Bonds</span><span class="sc">;</span>
+4274   <span class="s">}</span>
+4275   <span class="k">my</span><span class="s">(</span><span class="i">@PathAtomIDs</span><span class="s">)</span><span class="sc">;</span>
+4276 
+4277   <span class="i">@PathAtomIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4278   <span class="i">@PathAtomIDs</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomsIDsFromAtoms</span><span class="s">(</span><span class="i">@PathAtoms</span><span class="s">)</span><span class="sc">;</span>
+4279 
+4280   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetPathBonds</span><span class="s">(</span><span class="i">@PathAtomIDs</span><span class="s">)</span><span class="sc">;</span>
+4281 <span class="s">}</span>
+4282 
+4283 <span class="c"># Map atom IDs in path to atoms and return a reference to an array containing ring atoms...</span>
+4284 <span class="c">#</span>
+<a name="_GetAtomPathFromPath-"></a>4285 <span class="k">sub </span><span class="m">_GetAtomPathFromPath</span> <span class="s">{</span>
+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>
+4287   <span class="k">my</span><span class="s">(</span><span class="i">@PathAtoms</span><span class="s">)</span><span class="sc">;</span>
+4288 
+4289   <span class="i">@PathAtoms</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4291     <span class="c"># Return an empty atoms list...</span>
+4292     <span class="k">return</span> <span class="i">@PathAtoms</span><span class="sc">;</span>
+4293   <span class="s">}</span>
+4294 
+4295   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetPathAtoms</span><span class="s">(</span><span class="i">$Path</span><span class="s">)</span><span class="sc">;</span>
+4296 <span class="s">}</span>
+4297 
+4298 <span class="c"># Get atom paths between two specified atoms as a reference to an array containing references</span>
+4299 <span class="c"># to arrays with path atoms. For molecules with rings, atom paths array contains may contain</span>
+4300 <span class="c"># two paths.</span>
+4301 <span class="c">#</span>
+<a name="GetAtomPathsBetween-"></a>4302 <span class="k">sub </span><span class="m">GetAtomPathsBetween</span> <span class="s">{</span>
+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>
+4304   <span class="k">my</span><span class="s">(</span><span class="i">@AtomPaths</span><span class="s">)</span><span class="sc">;</span>
+4305 
+4306   <span class="i">@AtomPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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> &amp;&amp; <span class="i">$This</span><span class="i">-&gt;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>
+4308     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetAtomPathsBetween: No atom paths retrieved: Start atom is not defined  or it doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+4309     <span class="k">return</span> <span class="i">@AtomPaths</span><span class="sc">;</span>
+4310   <span class="s">}</span>
+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> &amp;&amp; <span class="i">$This</span><span class="i">-&gt;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>
+4312     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetAtomPathsBetween: No atom paths retrieved: End atom is not defined  or it doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+4313     <span class="k">return</span> <span class="i">@AtomPaths</span><span class="sc">;</span>
+4314   <span class="s">}</span>
+4315   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_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>
+4316 <span class="s">}</span>
+4317 
+4318 <span class="c"># Get atom paths between two specified atoms as a reference to an array containing references</span>
+4319 <span class="c"># to arrays with path atoms.</span>
+4320 <span class="c">#</span>
+<a name="_GetAtomPathsBetween-"></a>4321 <span class="k">sub </span><span class="m">_GetAtomPathsBetween</span> <span class="s">{</span>
+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>
+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>
+4324 
+4325   <span class="i">$StartAtomID</span> = <span class="i">$StartAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4326   <span class="i">$EndAtomID</span> = <span class="i">$EndAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4327 
+4328   <span class="i">@Paths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4329   <span class="i">@Paths</span> = <span class="i">$This</span><span class="i">-&gt;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>
+4330 
+4331   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomPathsFromPaths</span><span class="s">(</span>\<span class="i">@Paths</span><span class="s">)</span><span class="sc">;</span>
+4332 <span class="s">}</span>
+4333 
+4334 <span class="c"># Get atom neighborhoods around a specified atom as an array containing references</span>
+4335 <span class="c"># to arrays with neighborhood atoms at different radii upto specified radius...</span>
+4336 <span class="c">#</span>
+<a name="GetAtomNeighborhoodsWithRadiusUpto-"></a>4337 <span class="k">sub </span><span class="m">GetAtomNeighborhoodsWithRadiusUpto</span> <span class="s">{</span>
+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>
+4339 
+4340   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomNeighborhoods</span><span class="s">(</span><span class="q">&#39;RadiusUpto&#39;</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>
+4341 <span class="s">}</span>
+4342 
+4343 <span class="c"># Get atom neighborhoods around a specified atom as an array containing references</span>
+4344 <span class="c"># to arrays with neighborhood atoms at possible radii...</span>
+4345 <span class="c">#</span>
+<a name="GetAtomNeighborhoods-"></a>4346 <span class="k">sub </span><span class="m">GetAtomNeighborhoods</span> <span class="s">{</span>
+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>
+4348 
+4349   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomNeighborhoods</span><span class="s">(</span><span class="q">&#39;AllRadii&#39;</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>
+4350 <span class="s">}</span>
+4351 
+4352 <span class="c"># Get atom neighborhood around a specified atom, along with their successor connected atoms, collected</span>
+4353 <span class="c"># with in a specified radius as a list containing references to lists with first value corresponding to neighborhood</span>
+4354 <span class="c"># atom at a specific radius and second value as reference to a list containing its successor connected atoms.</span>
+4355 <span class="c">#</span>
+4356 <span class="c"># For a neighborhood atom at each radius level, the successor connected atoms correspond to the</span>
+4357 <span class="c"># neighborhood atoms at the next radius level. Consequently, the neighborhood atoms at the last</span>
+4358 <span class="c"># radius level don&#39;t contain any successor atoms which fall outside the range of specified radius.</span>
+4359 <span class="c">#</span>
+<a name="GetAtomNeighborhoodsWithSuccessorAtomsAndRadiusUpto-"></a>4360 <span class="k">sub </span><span class="m">GetAtomNeighborhoodsWithSuccessorAtomsAndRadiusUpto</span> <span class="s">{</span>
+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>
+4362 
+4363   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomNeighborhoods</span><span class="s">(</span><span class="q">&#39;WithSuccessorsAndRadiusUpto&#39;</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>
+4364 <span class="s">}</span>
+4365 
+4366 <span class="c"># Get atom neighborhood around a specified atom, along with their successor connected atoms, collected</span>
+4367 <span class="c"># at all radii as a list containing references to lists with first value corresponding to neighborhood</span>
+4368 <span class="c"># atom at a specific radius and second value as reference to a list containing its successor connected atoms.</span>
+4369 <span class="c">#</span>
+4370 <span class="c"># For a neighborhood atom at each radius level, the successor connected atoms correspond to the</span>
+4371 <span class="c"># neighborhood atoms at the next radius level. Consequently, the neighborhood atoms at the last</span>
+4372 <span class="c"># radius level don&#39;t contain any successor atoms which fall outside the range of specified radius.</span>
+4373 <span class="c">#</span>
+4374 <span class="c">#</span>
+<a name="GetAtomNeighborhoodsWithSuccessorAtoms-"></a>4375 <span class="k">sub </span><span class="m">GetAtomNeighborhoodsWithSuccessorAtoms</span> <span class="s">{</span>
+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>
+4377 
+4378   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetAtomNeighborhoods</span><span class="s">(</span><span class="q">&#39;WithSuccessorsAndAllRadii&#39;</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>
+4379 <span class="s">}</span>
+4380 
+4381 <span class="c"># Get atom neighborhoods...</span>
+4382 <span class="c">#</span>
+<a name="_GetAtomNeighborhoods-"></a>4383 <span class="k">sub </span><span class="m">_GetAtomNeighborhoods</span> <span class="s">{</span>
+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>
+4385   <span class="k">my</span><span class="s">(</span><span class="i">@AtomNeighborhoods</span><span class="s">)</span><span class="sc">;</span>
+4386 
+4387   <span class="i">@AtomNeighborhoods</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4388 
+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> &amp;&amp; <span class="i">$This</span><span class="i">-&gt;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>
+4390     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetAtomNeighborhoods: No atom neighborhoods retrieved: Start atom is not defined  or it doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+4391     <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span>
+4392   <span class="s">}</span>
+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>
+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> &amp;&amp; <span class="i">$Radius</span> &gt; <span class="n">0</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+4395       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetAtomNeighborhoods: No atom neighborhoods retrieved: Radius is not defined or it&#39;s &lt;= 0 ...&quot;</span><span class="sc">;</span>
+4396       <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span>
+4397     <span class="s">}</span>
+4398   <span class="s">}</span>
+4399 
+4400   <span class="c"># Collect neighborhood atom IDs...</span>
+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>
+4402 
+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>
+4404   <span class="i">$StartAtomID</span> = <span class="i">$StartAtom</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4405 
+4406   <span class="j">MODE:</span> <span class="s">{</span>
+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">-&gt;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>
+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">-&gt;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>
+4409 
+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">-&gt;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>
+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">-&gt;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>
+4412 
+4413     <span class="k">print</span> <span class="q">&quot;Warn: ${ClassName}-&gt;_GetAtomNeighborhood: No atom neighborhoods retrieved: Mode, $Mode, is not supported...&quot;</span><span class="sc">;</span>
+4414     <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span>
+4415   <span class="s">}</span>
+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>
+4417     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNeighborhoodAtomsFromAtomIDs</span><span class="s">(</span>\<span class="i">@NeighborhoodAtomIDs</span><span class="s">)</span><span class="sc">;</span>
+4418   <span class="s">}</span>
+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>
+4420     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNeighborhoodAtomsWithSuccessorsFromAtomIDs</span><span class="s">(</span>\<span class="i">@NeighborhoodAtomIDsWithSuccessors</span><span class="s">)</span><span class="sc">;</span>
+4421   <span class="s">}</span>
+4422 
+4423   <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span>
+4424 <span class="s">}</span>
+4425 
+4426 <span class="c"># Map neighborhood atom IDs to atoms...</span>
+4427 <span class="c">#</span>
+<a name="_GetNeighborhoodAtomsFromAtomIDs-"></a>4428 <span class="k">sub </span><span class="m">_GetNeighborhoodAtomsFromAtomIDs</span> <span class="s">{</span>
+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>
+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>
+4431 
+4432   <span class="i">@AtomNeighborhoods</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4434     <span class="k">my</span><span class="s">(</span><span class="i">@AtomNeighborhood</span><span class="s">)</span><span class="sc">;</span>
+4435 
+4436     <span class="i">@AtomNeighborhood</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4437     <span class="i">@AtomNeighborhood</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@</span>{<span class="i">$NeighborhoodAtomIDsRef</span>}<span class="s">)</span><span class="sc">;</span>
+4438     <span class="k">push</span> <span class="i">@AtomNeighborhoods</span><span class="cm">,</span> \<span class="i">@AtomNeighborhood</span><span class="sc">;</span>
+4439   <span class="s">}</span>
+4440   <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span>
+4441 <span class="s">}</span>
+4442 
+4443 <span class="c"># Map neighborhood atom IDs with successors to atoms...</span>
+4444 <span class="c">#</span>
+<a name="_GetNeighborhoodAtomsWithSuccessorsFromAtomIDs-"></a>4445 <span class="k">sub </span><span class="m">_GetNeighborhoodAtomsWithSuccessorsFromAtomIDs</span> <span class="s">{</span>
+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>
+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>
+4448 
+4449   <span class="i">$Depth</span> = <span class="n">0</span><span class="sc">;</span>
+4450   <span class="i">@AtomNeighborhoods</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4451 
+4452   <span class="c"># Go over neighborhoods at each level...</span>
+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>
+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>
+4455 
+4456     <span class="c"># Go over the neighborhood atoms and their successors at a specific level..</span>
+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>
+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>
+4459 
+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>
+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>
+4462 
+4463       <span class="c"># Map atom IDs to atoms...</span>
+4464       <span class="i">$NeighborhoodAtom</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomFromAtomID</span><span class="s">(</span><span class="i">$NeighborhoodAtomID</span><span class="s">)</span><span class="sc">;</span>
+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>
+4466         <span class="i">@NeighborhoodAtomSuccessorAtoms</span> = <span class="i">$This</span><span class="i">-&gt;_GetAtomsFromAtomIDs</span><span class="s">(</span><span class="i">@</span>{<span class="i">$NeighborhoodAtomSuccessorsIDsRef</span>}<span class="s">)</span><span class="sc">;</span>
+4467       <span class="s">}</span>
+4468 
+4469       <span class="c"># Store an atom and its successors at each level in an array...</span>
+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>
+4471 
+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>
+4473     <span class="s">}</span>
+4474       <span class="i">$Depth</span>++<span class="sc">;</span>
+4475   <span class="s">}</span>
+4476   <span class="k">return</span> <span class="i">@AtomNeighborhoods</span><span class="sc">;</span>
+4477 <span class="s">}</span>
+4478 
+4479 <span class="c"># Get next object ID...</span>
+<a name="_GetNewObjectID-"></a>4480 <span class="k">sub </span><span class="m">_GetNewObjectID</span> <span class="s">{</span>
+4481   <span class="i">$ObjectID</span>++<span class="sc">;</span>
+4482   <span class="k">return</span> <span class="i">$ObjectID</span><span class="sc">;</span>
+4483 <span class="s">}</span>
+4484 
+4485 <span class="c"># Is aromatic property set for the molecule?</span>
+<a name="IsAromatic-"></a>4486 <span class="k">sub </span><span class="m">IsAromatic</span> <span class="s">{</span>
+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>
+4488   <span class="k">my</span><span class="s">(</span><span class="i">$Aromatic</span><span class="s">)</span><span class="sc">;</span>
+4489 
+4490   <span class="i">$Aromatic</span> = <span class="i">$This</span><span class="i">-&gt;GetAromatic</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4491 
+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> &amp;&amp; <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>
+4493 <span class="s">}</span>
+4494 
+4495 <span class="c"># Does molecule contains any atoms with non-zero Z coordiantes?</span>
+<a name="IsThreeDimensional-"></a>4496 <span class="k">sub </span><span class="m">IsThreeDimensional</span> <span class="s">{</span>
+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>
+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>
+4499 
+4500   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4502       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetZ</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
+4503         <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+4504       <span class="s">}</span>
+4505   <span class="s">}</span>
+4506   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+4507 <span class="s">}</span>
+4508 
+4509 <span class="c"># Does molecule contains any atoms with non-zero X or Y coordinates</span>
+4510 <span class="c"># and only zero Z-coordinates?</span>
+<a name="IsTwoDimensional-"></a>4511 <span class="k">sub </span><span class="m">IsTwoDimensional</span> <span class="s">{</span>
+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>
+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>
+4514 
+4515   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4517       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetZ</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
+4518         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+4519       <span class="s">}</span>
+4520       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetX</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span> || <span class="i">$Atom</span><span class="i">-&gt;GetY</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
+4521         <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+4522       <span class="s">}</span>
+4523   <span class="s">}</span>
+4524   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+4525 <span class="s">}</span>
+4526 
+4527 <span class="c"># Get dimensionality of the molecule using one of the following two methods:</span>
+4528 <span class="c">#   . Using explicitly set Dimensionality</span>
+4529 <span class="c">#   . Going over atomic coordinates</span>
+4530 <span class="c">#</span>
+4531 <span class="c"># The valid dimensionality values are:</span>
+4532 <span class="c">#   . 3D - Three dimensional: One of X, Y or Z coordinate is non-zero</span>
+4533 <span class="c">#   . 2D - Two dimensional: One of X or Y coordinate is non-zero; All Z coordinates are zero</span>
+4534 <span class="c">#   . 0D - Zero dimensional: All atomic coordinates are zero</span>
+4535 <span class="c">#</span>
+<a name="GetDimensionality-"></a>4536 <span class="k">sub </span><span class="m">GetDimensionality</span> <span class="s">{</span>
+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>
+4538 
+4539   <span class="c"># Is Dimensionality property explicitly set?</span>
+4540   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasProperty</span><span class="s">(</span><span class="q">&#39;Dimensionality&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+4541     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetProperty</span><span class="s">(</span><span class="q">&#39;Dimensionality&#39;</span><span class="s">)</span><span class="sc">;</span>
+4542   <span class="s">}</span>
+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>
+4544 
+4545   <span class="i">@Atoms</span> = <span class="i">$This</span><span class="i">-&gt;GetAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4547       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetZ</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
+4548         <span class="k">return</span> <span class="q">&#39;3D&#39;</span><span class="sc">;</span>
+4549       <span class="s">}</span>
+4550       <span class="k">if</span> <span class="s">(</span><span class="i">$Atom</span><span class="i">-&gt;GetX</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span> || <span class="i">$Atom</span><span class="i">-&gt;GetY</span><span class="s">(</span><span class="s">)</span> != <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
+4551         <span class="k">return</span> <span class="q">&#39;2D&#39;</span><span class="sc">;</span>
+4552       <span class="s">}</span>
+4553   <span class="s">}</span>
+4554   <span class="k">return</span> <span class="q">&#39;0D&#39;</span><span class="sc">;</span>
+4555 <span class="s">}</span>
+4556 
+4557 <span class="c"># Is it a molecule object?</span>
+<a name="IsMolecule-"></a>4558 <span class="k">sub </span><span class="m">IsMolecule ($)</span> <span class="s">{</span>
+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>
+4560 
+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>
+4562 <span class="s">}</span>
+4563 
+4564 <span class="c"># Return a string containing vertices, edges and other properties...</span>
+<a name="StringifyMolecule-"></a>4565 <span class="k">sub </span><span class="m">StringifyMolecule</span> <span class="s">{</span>
+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>
+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>
+4568 
+4569   <span class="i">$ID</span> = <span class="i">$This</span><span class="i">-&gt;GetID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4570   <span class="i">$Name</span> = <span class="i">$This</span><span class="i">-&gt;GetName</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4571   <span class="i">$NumOfAtoms</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfAtoms</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4572   <span class="i">$NumOfBonds</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfBonds</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4573 
+4574   <span class="i">$NumOfRings</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfRings</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4576     <span class="i">$NumOfRings</span> = <span class="q">&#39;undefined&#39;</span><span class="sc">;</span>
+4577   <span class="s">}</span>
+4578 
+4579   <span class="i">$MolecularFormula</span> = <span class="i">$This</span><span class="i">-&gt;GetMolecularFormula</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4580 
+4581   <span class="i">$MolecularWeight</span> = <span class="i">$This</span><span class="i">-&gt;GetMolecularWeight</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4583 
+4584   <span class="i">$ExactMass</span> = <span class="i">$This</span><span class="i">-&gt;GetExactMass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4586 
+4587   <span class="i">$FormalCharge</span> = <span class="i">$This</span><span class="i">-&gt;GetFormalCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4588   <span class="i">$Charge</span> = <span class="i">$This</span><span class="i">-&gt;GetCharge</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4589 
+4590   <span class="i">$SpinMultiplicity</span> = <span class="i">$This</span><span class="i">-&gt;GetSpinMultiplicity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4591   <span class="i">$FreeRadicalElectrons</span> = <span class="i">$This</span><span class="i">-&gt;GetFreeRadicalElectrons</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4592 
+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">-&gt;GetElementalComposition</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4594   <span class="i">$ElementalComposition</span> = <span class="q">&#39;None&#39;</span><span class="sc">;</span>
+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> &amp;&amp; <span class="i">@</span>{<span class="i">$ElementsRef</span>}<span class="s">)</span> <span class="s">{</span>
+4596     <span class="i">$ElementalComposition</span> = <span class="q">&quot;[ &quot;</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">&quot; ]&quot;</span><span class="sc">;</span>
+4597   <span class="s">}</span>
+4598 
+4599   <span class="i">$MoleculeString</span> = <span class="q">&quot;Molecule: ID: $ID; Name: \&quot;$Name\&quot;; NumOfAtoms: $NumOfAtoms; NumOfBonds: $NumOfBonds; NumOfRings: $NumOfRings; MolecularFormula: $MolecularFormula; MolecularWeight: $MolecularWeight; ExactMass: $ExactMass; FormalCharge: $FormalCharge; Charge: $Charge; SpinMultiplicity: $SpinMultiplicity; FreeRadicalElectrons: $FreeRadicalElectrons; ElementalComposition: $ElementalComposition&quot;</span><span class="sc">;</span>
+4600 
+4601   <span class="k">return</span> <span class="i">$MoleculeString</span><span class="sc">;</span>
+4602 <span class="s">}</span>
+4603 
+4604 <span class="c"># Load appropriate atom data files from &lt;MayaChemTools&gt;/lib directory used by various</span>
+4605 <span class="c"># object methods in the current class...</span>
+4606 <span class="c">#</span>
+<a name="_LoadMoleculeClassData-"></a>4607 <span class="k">sub </span><span class="m">_LoadMoleculeClassData</span> <span class="s">{</span>
+4608   <span class="k">my</span><span class="s">(</span><span class="i">$MayaChemToolsLibDir</span><span class="s">)</span><span class="sc">;</span>
+4609 
+4610   <span class="i">$MayaChemToolsLibDir</span> = <span class="i">GetMayaChemToolsLibDirName</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4611 
+4612   <span class="c"># Load and process data for aromaticity models...</span>
+4613   <span class="i">_LoadAromaticityModelsData</span><span class="s">(</span><span class="i">$MayaChemToolsLibDir</span><span class="s">)</span><span class="sc">;</span>
+4614   <span class="i">_ProcessAromaticityModelsData</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4615 <span class="s">}</span>
+4616 
+4617 <span class="c">#</span>
+4618 <span class="c"># Load data for supported aromaticity models...</span>
+4619 <span class="c">#</span>
+<a name="_LoadAromaticityModelsData-"></a>4620 <span class="k">sub </span><span class="m">_LoadAromaticityModelsData</span> <span class="s">{</span>
+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>
+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>
+4623 
+4624   <span class="i">%AromaticityModelsDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4625   <span class="i">%CanonicalAromaticityModelNamesMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4626 
+4627   <span class="c"># File format:</span>
+4628   <span class="c">#</span>
+4629   <span class="c"># &quot;ParameterName&quot;,&quot;MDLAromaticityModel&quot;,&quot;TriposAromaticityModel&quot;,&quot;MMFFAromaticityModel&quot;,&quot;ChemAxonBasicAromaticityModel&quot;,&quot;ChemAxonGeneralAromaticityModel&quot;,&quot;DaylightAromaticityModel&quot;,&quot;MayaChemToolsAromaticityModel&quot;</span>
+4630   <span class="c"># &quot;AllowHeteroRingAtoms&quot;,&quot;No&quot;,&quot;No&quot;,&quot;Yes&quot;,&quot;Yes&quot;,&quot;Yes&quot;,&quot;Yes&quot;,&quot;Yes&quot;</span>
+4631   <span class="c">#</span>
+4632   <span class="i">$DataFile</span> = <span class="i">$MayaChemToolsLibDir</span> . <span class="q">&quot;/data/AromaticityModelsData.csv&quot;</span><span class="sc">;</span>
+4633   <span class="k">if</span> <span class="s">(</span>! <span class="k">-e</span> <span class="q">&quot;$DataFile&quot;</span><span class="s">)</span> <span class="s">{</span>
+4634     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}::_LoadAromaticityModelsData: MayaChemTools package file, $DataFile, is missing: Possible installation problems...&quot;</span><span class="sc">;</span>
+4635   <span class="s">}</span>
+4636 
+4637   <span class="c"># Setup a list of currently supported aromaticity parameters...</span>
+4638   <span class="c">#</span>
+4639   <span class="k">my</span><span class="s">(</span><span class="i">@KnownNames</span><span class="s">)</span><span class="sc">;</span>
+4640   <span class="i">@KnownNames</span> = <span class="q">qw(AllowHeteroRingAtoms HeteroRingAtomsList AllowExocyclicDoubleBonds AllowHomoNuclearExocyclicDoubleBonds AllowElectronegativeRingAtomExocyclicDoubleBonds AllowRingAtomFormalCharge AllowHeteroRingAtomFormalCharge MinimumRingSize)</span><span class="sc">;</span>
+4641 
+4642   <span class="i">%SupportedParameterNames</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4644     <span class="i">$SupportedParameterNames</span>{<span class="i">$ParameterName</span>} = <span class="i">$ParameterName</span><span class="sc">;</span>
+4645   <span class="s">}</span>
+4646 
+4647   <span class="i">$InDelim</span> = <span class="q">&quot;\,&quot;</span><span class="sc">;</span>
+4648   <span class="k">open</span> <span class="w">DATAFILE</span><span class="cm">,</span> <span class="q">&quot;$DataFile&quot;</span> <span class="k">or</span> <span class="w">croak</span> <span class="q">&quot;Couldn&#39;t open $DataFile: $! ...&quot;</span><span class="sc">;</span>
+4649 
+4650   <span class="c"># Skip lines up to column labels...</span>
+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>
+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>
+4653       <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span>
+4654     <span class="s">}</span>
+4655   <span class="s">}</span>
+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>
+4657   <span class="i">$NumOfCols</span> = <span class="i">@ColLabels</span><span class="sc">;</span>
+4658 
+4659   <span class="i">%ColIndexToModelName</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+4660 
+4661   <span class="c"># Process names of aromaticity models...</span>
+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>
+4663     <span class="i">$ModelName</span> = <span class="i">$ColLabels</span>[<span class="i">$Index</span>]<span class="sc">;</span>
+4664     <span class="i">$ModelName</span> =~ <span class="q">s/ //g</span><span class="sc">;</span>
+4665 
+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>
+4667       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}::_LoadAromaticityModelsData: The aromaticity model name, $ModelName, in $DataFile has already exists.\nLine: $Line...&quot;</span><span class="sc">;</span>
+4668     <span class="s">}</span>
+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>
+4670 
+4671     <span class="c"># Cannonicalize aromatic model name by converting into all lowercase...</span>
+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>
+4673 
+4674     <span class="i">$ColIndexToModelName</span>{<span class="i">$Index</span>} = <span class="i">$ModelName</span><span class="sc">;</span>
+4675   <span class="s">}</span>
+4676 
+4677   <span class="c"># Process paramater name and their values for specified aromaticity models...</span>
+4678   <span class="c">#</span>
+4679   <span class="i">%ParameterNames</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+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>
+4682       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span>
+4683     <span class="s">}</span>
+4684     <span class="i">@LineWords</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+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>
+4687       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}::_LoadAromaticityModelsData: The number of data fields, @LineWords, in $DataFile must be $NumOfCols.\nLine: $Line...&quot;</span><span class="sc">;</span>
+4688     <span class="s">}</span>
+4689 
+4690     <span class="c"># Process parameter name and values for aromaticity models...</span>
+4691     <span class="c">#</span>
+4692     <span class="i">$ParameterName</span> = <span class="i">$LineWords</span>[<span class="n">0</span>]<span class="sc">;</span>
+4693 
+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>
+4695       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}::_LoadAromaticityModelsData: The current release of MayaChemTools doesn&#39;t support aromaticity model parameter name, $ParameterName, specified in $DataFile. It would be ignore during aromaticity detection.\nLine: $Line...&quot;</span><span class="sc">;</span>
+4696     <span class="s">}</span>
+4697 
+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>
+4699       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}::_LoadAromaticityModelsData: Ignoring aromaticity model data for parameter name, $ParameterName, in $DataFile. It has already been loaded.\nLine: $Line...&quot;</span><span class="sc">;</span>
+4700       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span>
+4701     <span class="s">}</span>
+4702     <span class="i">$ParameterNames</span>{<span class="i">$ParameterName</span>} = <span class="i">$ParameterName</span><span class="sc">;</span>
+4703 
+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>
+4705       <span class="i">$ModelName</span> = <span class="i">$ColIndexToModelName</span>{<span class="i">$Index</span>}<span class="sc">;</span>
+4706       <span class="i">$ParameterValue</span> = <span class="i">$LineWords</span>[<span class="i">$Index</span>]<span class="sc">;</span>
+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>
+4708     <span class="s">}</span>
+4709   <span class="s">}</span>
+4710   <span class="k">close</span> <span class="w">DATAFILE</span><span class="sc">;</span>
+4711 <span class="s">}</span>
+4712 
+4713 <span class="c"># Process already loaded aromaticity model data...</span>
+4714 <span class="c">#</span>
+<a name="_ProcessAromaticityModelsData-"></a>4715 <span class="k">sub </span><span class="m">_ProcessAromaticityModelsData</span> <span class="s">{</span>
+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>
+4717 
+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>
+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>
+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>
+4721       <span class="i">$ParameterValue</span> =~ <span class="q">s/ //g</span><span class="sc">;</span>
+4722 
+4723       <span class="j">VALUE:</span> <span class="s">{</span>
+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>
+4725           <span class="i">$NewParameterValue</span> = <span class="n">1</span><span class="sc">;</span>
+4726           <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span>
+4727         <span class="s">}</span>
+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>
+4729           <span class="i">$NewParameterValue</span> = <span class="n">0</span><span class="sc">;</span>
+4730           <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span>
+4731         <span class="s">}</span>
+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>
+4733           <span class="i">$NewParameterValue</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+4734           <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span>
+4735         <span class="s">}</span>
+4736         <span class="i">$NewParameterValue</span> = <span class="i">$ParameterValue</span><span class="sc">;</span>
+4737       <span class="s">}</span>
+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>
+4739 
+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>
+4741         <span class="c"># Setup a new parameter conatining a reference to a hash for the specified values...</span>
+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>
+4743 
+4744         <span class="i">$DataMapRefName</span> = <span class="q">&quot;${ParameterName}MapRef&quot;</span><span class="sc">;</span>
+4745 
+4746         <span class="i">%DataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+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>
+4748           <span class="i">$DataMap</span>{<span class="i">$DataValue</span>} = <span class="i">$DataValue</span><span class="sc">;</span>
+4749         <span class="s">}</span>
+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>
+4751       <span class="s">}</span>
+4752     <span class="s">}</span>
+4753   <span class="s">}</span>
+4754 <span class="s">}</span>
+4755 
+4756 <span class="c"># Is it a molecule object?</span>
+<a name="_IsMolecule-"></a>4757 <span class="k">sub </span><span class="m">_IsMolecule</span> <span class="s">{</span>
+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>
+4759 
+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> &amp;&amp; <span class="i">$Object</span><span class="i">-&gt;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>
+4761 <span class="s">}</span>
+4762 
+<a name="EOF-"></a></pre>
+<p>&nbsp;</p>
+<br />
+<center>
+<img src="../../../images/h2o2.png">
+</center>
+</body>
+</html>