| 0 | 1 <html> | 
|  | 2 <head> | 
|  | 3 <title>MayaChemTools:Code:PDBFileUtil.pm</title> | 
|  | 4 <meta http-equiv="content-type" content="text/html;charset=utf-8"> | 
|  | 5 <link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css"> | 
|  | 6 </head> | 
|  | 7 <body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10"> | 
|  | 8 <br/> | 
|  | 9 <center> | 
|  | 10 <a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a> | 
|  | 11 </center> | 
|  | 12 <br/> | 
|  | 13 <pre> | 
|  | 14 <a name="package-PDBFileUtil-"></a>   1 <span class="k">package </span><span class="i">PDBFileUtil</span><span class="sc">;</span> | 
|  | 15    2 <span class="c">#</span> | 
|  | 16    3 <span class="c"># $RCSfile: PDBFileUtil.pm,v $</span> | 
|  | 17    4 <span class="c"># $Date: 2015/02/28 20:47:18 $</span> | 
|  | 18    5 <span class="c"># $Revision: 1.36 $</span> | 
|  | 19    6 <span class="c">#</span> | 
|  | 20    7 <span class="c"># Author: Manish Sud <msud@san.rr.com></span> | 
|  | 21    8 <span class="c">#</span> | 
|  | 22    9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span> | 
|  | 23   10 <span class="c">#</span> | 
|  | 24   11 <span class="c"># This file is part of MayaChemTools.</span> | 
|  | 25   12 <span class="c">#</span> | 
|  | 26   13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span> | 
|  | 27   14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span> | 
|  | 28   15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span> | 
|  | 29   16 <span class="c"># later version.</span> | 
|  | 30   17 <span class="c">#</span> | 
|  | 31   18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span> | 
|  | 32   19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span> | 
|  | 33   20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span> | 
|  | 34   21 <span class="c"># details.</span> | 
|  | 35   22 <span class="c">#</span> | 
|  | 36   23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span> | 
|  | 37   24 <span class="c"># along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or</span> | 
|  | 38   25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span> | 
|  | 39   26 <span class="c"># Boston, MA, 02111-1307, USA.</span> | 
|  | 40   27 <span class="c">#</span> | 
|  | 41   28 | 
|  | 42   29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span> | 
|  | 43   30 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span> | 
|  | 44   31 <span class="k">use</span> <span class="w">Text::ParseWords</span><span class="sc">;</span> | 
|  | 45   32 <span class="k">use</span> <span class="w">TextUtil</span><span class="sc">;</span> | 
|  | 46   33 <span class="k">use</span> <span class="w">FileUtil</span><span class="sc">;</span> | 
|  | 47   34 <span class="k">use</span> <span class="w">TimeUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 48   35 | 
|  | 49   36 <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> | 
|  | 50   37 | 
|  | 51   38 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span> | 
|  | 52   39 <span class="i">@EXPORT</span> = <span class="q">qw(GetPDBRecordType GetRecordTypesCount GetAllResidues GetConectRecordLines GetChainsAndResidues GetExperimentalTechnique GetExperimentalTechniqueResolution GetMinMaxCoords IsPDBFile IsAtomRecordType IsConectRecordType IsHeaderRecordType IsHetatmRecordType IsSeqresRecordType IsModelRecordType IsEndmdlRecordType IsTerRecordType IsMasterRecordType ReadPDBFile ParseHeaderRecordLine GenerateHeaderRecordLine GenerateHeaderRecordTimeStamp ParseAtomRecordLine GenerateAtomRecordLine ParseAtomOrHetatmRecordLine GenerateAtomOrHetatmRecordLine GenerateHetatmRecordLine ParseHetatmRecordLine ParseConectRecordLine GenerateConectRecordLine ParseExpdtaRecordLine ParseRemark2ResolutionRecordLine ParseSeqresRecordLine ParseTerRecordLine GenerateTerRecordLine ParseMasterRecordLine GenerateEndRecordLine)</span><span class="sc">;</span> | 
|  | 53   40 <span class="i">@EXPORT_OK</span> = <span class="q">qw()</span><span class="sc">;</span> | 
|  | 54   41 | 
|  | 55   42 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span><span class="w">all</span>  <span class="cm">=></span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span><span class="s">)</span><span class="sc">;</span> | 
|  | 56   43 | 
|  | 57   44 <span class="c"># Get PDB record type...</span> | 
|  | 58 <a name="GetPDBRecordType-"></a>  45 <span class="k">sub </span><span class="m">GetPDBRecordType</span> <span class="s">{</span> | 
|  | 59   46   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 60   47 | 
|  | 61   48   <span class="k">return</span> <span class="i">_GetRecordType</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 62   49 <span class="s">}</span> | 
|  | 63   50 | 
|  | 64   51 <span class="c"># Is it a PDB file?</span> | 
|  | 65 <a name="IsPDBFile-"></a>  52 <span class="k">sub </span><span class="m">IsPDBFile</span> <span class="s">{</span> | 
|  | 66   53   <span class="k">my</span><span class="s">(</span><span class="i">$PDBFile</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 67   54   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="i">$Status</span><span class="s">)</span><span class="sc">;</span> | 
|  | 68   55 | 
|  | 69   56   <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 70   57   <span class="k">open</span> <span class="w">PDBFILE</span><span class="cm">,</span> <span class="q">"$PDBFile"</span> <span class="k">or</span> <span class="k">die</span> <span class="q">"Can't open $PDBFile: $!\n"</span><span class="sc">;</span> | 
|  | 71   58   <span class="i">$Line</span> = <span class="i">GetTextLine</span><span class="s">(</span>\<span class="i">*PDBFILE</span><span class="s">)</span><span class="sc">;</span> | 
|  | 72   59   <span class="i">$Status</span> = <span class="s">(</span><span class="i">$Line</span> =~ <span class="q">/^HEADER/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 73   60   <span class="k">close</span> <span class="w">PDBFILE</span><span class="sc">;</span> | 
|  | 74   61 | 
|  | 75   62   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 76   63 <span class="s">}</span> | 
|  | 77   64 | 
|  | 78   65 <span class="c"># Is it a atom record type?</span> | 
|  | 79 <a name="IsAtomRecordType-"></a>  66 <span class="k">sub </span><span class="m">IsAtomRecordType</span> <span class="s">{</span> | 
|  | 80   67   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 81   68 | 
|  | 82   69   <span class="k">return</span> <span class="i">_IsRecordType</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="q">'ATOM'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 83   70 <span class="s">}</span> | 
|  | 84   71 | 
|  | 85   72 <span class="c"># Is it a connect record type?</span> | 
|  | 86 <a name="IsConectRecordType-"></a>  73 <span class="k">sub </span><span class="m">IsConectRecordType</span> <span class="s">{</span> | 
|  | 87   74   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 88   75 | 
|  | 89   76   <span class="k">return</span> <span class="i">_IsRecordType</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="q">'CONECT'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 90   77 <span class="s">}</span> | 
|  | 91   78 | 
|  | 92   79 <span class="c"># Is it a header atom record type?</span> | 
|  | 93 <a name="IsHeaderRecordType-"></a>  80 <span class="k">sub </span><span class="m">IsHeaderRecordType</span> <span class="s">{</span> | 
|  | 94   81   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 95   82 | 
|  | 96   83   <span class="k">return</span> <span class="i">_IsRecordType</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="q">'HEADER'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 97   84 <span class="s">}</span> | 
|  | 98   85 | 
|  | 99   86 <span class="c"># Is it a hetro atom record type?</span> | 
|  | 100 <a name="IsHetatmRecordType-"></a>  87 <span class="k">sub </span><span class="m">IsHetatmRecordType</span> <span class="s">{</span> | 
|  | 101   88   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 102   89 | 
|  | 103   90   <span class="k">return</span> <span class="i">_IsRecordType</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="q">'HETATM'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 104   91 <span class="s">}</span> | 
|  | 105   92 | 
|  | 106   93 <span class="c"># Is it a seqres record type?</span> | 
|  | 107 <a name="IsSeqresRecordType-"></a>  94 <span class="k">sub </span><span class="m">IsSeqresRecordType</span> <span class="s">{</span> | 
|  | 108   95   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 109   96 | 
|  | 110   97   <span class="k">return</span> <span class="i">_IsRecordType</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="q">'SEQRES'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 111   98 <span class="s">}</span> | 
|  | 112   99 | 
|  | 113  100 <span class="c"># Is it a MODEL record type?</span> | 
|  | 114 <a name="IsModelRecordType-"></a> 101 <span class="k">sub </span><span class="m">IsModelRecordType</span> <span class="s">{</span> | 
|  | 115  102   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 116  103 | 
|  | 117  104   <span class="k">return</span> <span class="i">_IsRecordType</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="q">'MODEL'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 118  105 <span class="s">}</span> | 
|  | 119  106 | 
|  | 120  107 <span class="c"># Is it a ENDMDL record type?</span> | 
|  | 121 <a name="IsEndmdlRecordType-"></a> 108 <span class="k">sub </span><span class="m">IsEndmdlRecordType</span> <span class="s">{</span> | 
|  | 122  109   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 123  110 | 
|  | 124  111   <span class="k">return</span> <span class="i">_IsRecordType</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="q">'ENDMDL'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 125  112 <span class="s">}</span> | 
|  | 126  113 | 
|  | 127  114 <span class="c"># Is it a TER record type?</span> | 
|  | 128 <a name="IsTerRecordType-"></a> 115 <span class="k">sub </span><span class="m">IsTerRecordType</span> <span class="s">{</span> | 
|  | 129  116   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 130  117 | 
|  | 131  118   <span class="k">return</span> <span class="i">_IsRecordType</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="q">'TER'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 132  119 <span class="s">}</span> | 
|  | 133  120 | 
|  | 134  121 <span class="c"># Is it a MASTER record type?</span> | 
|  | 135 <a name="IsMasterRecordType-"></a> 122 <span class="k">sub </span><span class="m">IsMasterRecordType</span> <span class="s">{</span> | 
|  | 136  123   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 137  124 | 
|  | 138  125   <span class="k">return</span> <span class="i">_IsRecordType</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="q">'MASTER'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 139  126 <span class="s">}</span> | 
|  | 140  127 | 
|  | 141  128 <span class="c"># Count the number of each record type and a reference to data type with these key/value pairs:</span> | 
|  | 142  129 <span class="c"># {RecordTypes} - An array of unique record types in order of their presence in the file</span> | 
|  | 143  130 <span class="c"># {Count}{$RecordType} - Count of each record type</span> | 
|  | 144  131 <span class="c"># {Lines}{$RecordType} - Optional lines data for a specific record type.</span> | 
|  | 145  132 <span class="c">#</span> | 
|  | 146 <a name="GetRecordTypesCount-"></a> 133 <span class="k">sub </span><span class="m">GetRecordTypesCount</span> <span class="s">{</span> | 
|  | 147  134   <span class="k">my</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$SpecifiedRecordType</span><span class="cm">,</span> <span class="i">$GetRecordLinesFlag</span><span class="cm">,</span> <span class="i">$RecordType</span><span class="cm">,</span> <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">%RecordTypeDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 148  135 | 
|  | 149  136   <span class="i">%RecordTypeDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 150  137   <span class="i">@</span>{<span class="i">$RecordTypeDataMap</span>{<span class="w">RecordTypes</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 151  138   <span class="i">%</span>{<span class="i">$RecordTypeDataMap</span>{<span class="w">Count</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 152  139   <span class="i">%</span>{<span class="i">$RecordTypeDataMap</span>{<span class="w">Lines</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 153  140 | 
|  | 154  141   <span class="i">$SpecifiedRecordType</span> = <span class="q">''</span><span class="sc">;</span> | 
|  | 155  142   <span class="i">$GetRecordLinesFlag</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 156  143   <span class="k">if</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 157  144     <span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$SpecifiedRecordType</span><span class="cm">,</span> <span class="i">$GetRecordLinesFlag</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 158  145     <span class="i">$SpecifiedRecordType</span> = <span class="k">uc</span> <span class="i">$SpecifiedRecordType</span><span class="sc">;</span> | 
|  | 159  146   <span class="s">}</span> | 
|  | 160  147   <span class="k">elsif</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 161  148     <span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$SpecifiedRecordType</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 162  149     <span class="i">$SpecifiedRecordType</span> = <span class="k">uc</span> <span class="i">$SpecifiedRecordType</span><span class="sc">;</span> | 
|  | 163  150   <span class="s">}</span> | 
|  | 164  151   <span class="k">else</span> <span class="s">{</span> | 
|  | 165  152     <span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 166  153   <span class="s">}</span> | 
|  | 167  154   <span class="j">LINE:</span> <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 168  155     <span class="i">$RecordType</span> = <span class="i">_GetRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span> | 
|  | 169  156     <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedRecordType</span> && <span class="s">(</span><span class="i">$SpecifiedRecordType</span> <span class="k">ne</span> <span class="i">$RecordType</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 170  157       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 171  158     <span class="s">}</span> | 
|  | 172  159     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$RecordTypeDataMap</span>{<span class="w">Count</span>}{<span class="i">$RecordType</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 173  160       <span class="c"># Update count...</span> | 
|  | 174  161       <span class="i">$RecordTypeDataMap</span>{<span class="w">Count</span>}{<span class="i">$RecordType</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 175  162 | 
|  | 176  163       <span class="k">if</span> <span class="s">(</span><span class="i">$GetRecordLinesFlag</span><span class="s">)</span> <span class="s">{</span> | 
|  | 177  164         <span class="k">push</span> <span class="i">@</span>{<span class="i">$RecordTypeDataMap</span>{<span class="w">Lines</span>}{<span class="i">$RecordType</span>}}<span class="cm">,</span> <span class="i">$RecordLine</span><span class="sc">;</span> | 
|  | 178  165       <span class="s">}</span> | 
|  | 179  166     <span class="s">}</span> | 
|  | 180  167     <span class="k">else</span> <span class="s">{</span> | 
|  | 181  168       <span class="c"># New record type...</span> | 
|  | 182  169       <span class="k">push</span> <span class="i">@</span>{<span class="i">$RecordTypeDataMap</span>{<span class="w">RecordTypes</span>}}<span class="cm">,</span> <span class="i">$RecordType</span><span class="sc">;</span> | 
|  | 183  170       <span class="i">$RecordTypeDataMap</span>{<span class="w">Count</span>}{<span class="i">$RecordType</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 184  171 | 
|  | 185  172       <span class="k">if</span> <span class="s">(</span><span class="i">$GetRecordLinesFlag</span><span class="s">)</span> <span class="s">{</span> | 
|  | 186  173         <span class="i">@</span>{<span class="i">$RecordTypeDataMap</span>{<span class="w">Lines</span>}{<span class="i">$RecordType</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 187  174         <span class="k">push</span> <span class="i">@</span>{<span class="i">$RecordTypeDataMap</span>{<span class="w">Lines</span>}{<span class="i">$RecordType</span>}}<span class="cm">,</span> <span class="i">$RecordLine</span><span class="sc">;</span> | 
|  | 188  175       <span class="s">}</span> | 
|  | 189  176     <span class="s">}</span> | 
|  | 190  177   <span class="s">}</span> | 
|  | 191  178   <span class="k">return</span> <span class="s">(</span>\<span class="i">%RecordTypeDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 192  179 <span class="s">}</span> | 
|  | 193  180 | 
|  | 194  181 <span class="c"># Collect CONECT record lines for specific atom number, modified specified data to exclude any atom</span> | 
|  | 195  182 <span class="c"># number not present in the list of specified atom numbers and return a reference to list of</span> | 
|  | 196  183 <span class="c"># CONECT record lines.</span> | 
|  | 197  184 <span class="c">#</span> | 
|  | 198 <a name="GetConectRecordLines-"></a> 185 <span class="k">sub </span><span class="m">GetConectRecordLines</span> <span class="s">{</span> | 
|  | 199  186   <span class="k">my</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$AtomNumbersMapRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 200  187   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$ConectAtomNumber</span><span class="cm">,</span> <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">@ConectRecordAtomNums</span><span class="cm">,</span> <span class="i">@ConectRecordLines</span><span class="s">)</span><span class="sc">;</span> | 
|  | 201  188 | 
|  | 202  189   <span class="i">@ConectRecordLines</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 203  190   <span class="j">LINE:</span> <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 204  191     <span class="k">if</span> <span class="s">(</span>!<span class="i">IsConectRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 205  192       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 206  193     <span class="s">}</span> | 
|  | 207  194     <span class="i">@ConectRecordAtomNums</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 208  195     <span class="k">push</span> <span class="i">@ConectRecordAtomNums</span><span class="cm">,</span> <span class="i">ParseConectRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span> | 
|  | 209  196     <span class="j">ATOMNUMBER:</span> <span class="k">for</span> <span class="i">$ConectAtomNumber</span> <span class="s">(</span><span class="i">@ConectRecordAtomNums</span><span class="s">)</span> <span class="s">{</span> | 
|  | 210  197       <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$ConectAtomNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 211  198         <span class="i">$AtomNumber</span> = <span class="i">$ConectAtomNumber</span><span class="sc">;</span> | 
|  | 212  199         <span class="k">if</span> <span class="s">(</span><span class="i">$AtomNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 213  200           <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span> <span class="i">$AtomNumbersMapRef</span>->{<span class="i">$AtomNumber</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 214  201             <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 215  202           <span class="s">}</span> | 
|  | 216  203         <span class="s">}</span> | 
|  | 217  204       <span class="s">}</span> | 
|  | 218  205     <span class="s">}</span> | 
|  | 219  206     <span class="k">push</span> <span class="i">@ConectRecordLines</span><span class="cm">,</span> <span class="i">$RecordLine</span><span class="sc">;</span> | 
|  | 220  207   <span class="s">}</span> | 
|  | 221  208   <span class="k">return</span> \<span class="i">@ConectRecordLines</span><span class="sc">;</span> | 
|  | 222  209 <span class="s">}</span> | 
|  | 223  210 | 
|  | 224  211 <span class="c"># Get chains and residue information using ATOM/HETATM or SEQRES records. And return a reference to a</span> | 
|  | 225  212 <span class="c">#  hash with these keys:</span> | 
|  | 226  213 <span class="c">#</span> | 
|  | 227  214 <span class="c"># @{$ChainsDataMap{ChainIDs}} - List of chain IDs with 'None' for no chain identification</span> | 
|  | 228  215 <span class="c"># @{$ChainsDataMap{Residues}{$ChainID}} - List of residues in order of their appearance in a chain</span> | 
|  | 229  216 <span class="c"># @{$ChainsDataMap{ResidueNumbers}{$ChainID}} - List of residue numbers in order of their appearance in a chain</span> | 
|  | 230  217 <span class="c"># %{$ChainsDataMap{ResidueCount}{$ChainID}{$ResidueName}} - Count of specific residues in a chain</span> | 
|  | 231  218 <span class="c">#</span> | 
|  | 232  219 <span class="c"># Notes:</span> | 
|  | 233  220 <span class="c">#  . Chains and residue data can be extacted using either ATOM/HETATM records or SEQRES records.</span> | 
|  | 234  221 <span class="c">#  . In addition to a different chain ID in ATOM/HETATM a TER record also indicates end of an existing chain</span> | 
|  | 235  222 <span class="c">#    and start of a new one: ChainID in ATOM/HETATM records might still be emtpy.</span> | 
|  | 236  223 <span class="c">#   . ATOM/HETATM records after the first ENDMDL records are simply ingnored.</span> | 
|  | 237  224 <span class="c">#</span> | 
|  | 238 <a name="GetChainsAndResidues-"></a> 225 <span class="k">sub </span><span class="m">GetChainsAndResidues</span> <span class="s">{</span> | 
|  | 239  226   <span class="k">my</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$RecordsSource</span><span class="cm">,</span> <span class="i">$GetChainResiduesBeyondTERFlag</span><span class="cm">,</span> <span class="i">$GetRecordLinesFlag</span><span class="s">)</span><span class="sc">;</span> | 
|  | 240  227 | 
|  | 241  228   <span class="i">$RecordsSource</span> = <span class="q">'AtomAndHetatm'</span><span class="sc">;</span> | 
|  | 242  229   <span class="i">$GetChainResiduesBeyondTERFlag</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 243  230   <span class="i">$GetRecordLinesFlag</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 244  231 | 
|  | 245  232   <span class="k">if</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">4</span><span class="s">)</span> <span class="s">{</span> | 
|  | 246  233     <span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$RecordsSource</span><span class="cm">,</span> <span class="i">$GetChainResiduesBeyondTERFlag</span><span class="cm">,</span> <span class="i">$GetRecordLinesFlag</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 247  234   <span class="s">}</span> | 
|  | 248  235   <span class="k">elsif</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 249  236     <span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$RecordsSource</span><span class="cm">,</span> <span class="i">$GetChainResiduesBeyondTERFlag</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 250  237   <span class="s">}</span> | 
|  | 251  238   <span class="k">elsif</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 252  239     <span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$RecordsSource</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 253  240   <span class="s">}</span> | 
|  | 254  241   <span class="k">else</span> <span class="s">{</span> | 
|  | 255  242     <span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 256  243   <span class="s">}</span> | 
|  | 257  244 | 
|  | 258  245   <span class="k">if</span> <span class="s">(</span><span class="i">$RecordsSource</span> =~ <span class="q">/^AtomAndHetatm$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 259  246     <span class="k">return</span> <span class="i">_GetChainsAndResiduesFromAtomHetatmRecords</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$GetChainResiduesBeyondTERFlag</span><span class="cm">,</span> <span class="i">$GetRecordLinesFlag</span><span class="s">)</span><span class="sc">;</span> | 
|  | 260  247   <span class="s">}</span> | 
|  | 261  248   <span class="k">elsif</span> <span class="s">(</span><span class="i">$RecordsSource</span> =~ <span class="q">/^Seqres$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 262  249     <span class="k">return</span> <span class="i">_GetChainsAndResiduesFromSeqresRecords</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 263  250   <span class="s">}</span> | 
|  | 264  251   <span class="k">else</span> <span class="s">{</span> | 
|  | 265  252     <span class="k">my</span><span class="s">(</span><span class="i">%ChainsDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 266  253     <span class="i">%ChainsDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 267  254     <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ChainIDs</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 268  255     <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 269  256     <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueNumbers</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 270  257     <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 271  258 | 
|  | 272  259     <span class="k">return</span> \<span class="i">%ChainsDataMap</span><span class="sc">;</span> | 
|  | 273  260   <span class="s">}</span> | 
|  | 274  261 <span class="s">}</span> | 
|  | 275  262 | 
|  | 276  263 | 
|  | 277  264 <span class="c"># Get residue information using ATOM/HETATM records and return a reference to a hash with</span> | 
|  | 278  265 <span class="c"># these keys:</span> | 
|  | 279  266 <span class="c">#</span> | 
|  | 280  267 <span class="c"># @{$ResiduesDataMap{ResidueNames}} - List of all the residues</span> | 
|  | 281  268 <span class="c"># %{$ResiduesDataMap{ResidueCount}{$ResidueName}} - Count of residues</span> | 
|  | 282  269 <span class="c"># @{$ResiduesDataMap{AtomResidueNames}} - List of all the residues</span> | 
|  | 283  270 <span class="c"># %{$ResiduesDataMap{AtomResidueCount}{$ResidueName}} - Count of residues in ATOM records</span> | 
|  | 284  271 <span class="c"># @{$ResiduesDataMap{HetatomResidueNames}} - List of all the residues</span> | 
|  | 285  272 <span class="c"># %{$ResiduesDataMap{HetatmResidueCount}{$ResidueName}} - Count of residues HETATM records</span> | 
|  | 286  273 <span class="c">#</span> | 
|  | 287  274 <span class="c"># Notes:</span> | 
|  | 288  275 <span class="c">#  . ATOM/HETATM records after the first ENDMDL records are simply ingnored.</span> | 
|  | 289  276 <span class="c">#</span> | 
|  | 290 <a name="GetAllResidues-"></a> 277 <span class="k">sub </span><span class="m">GetAllResidues</span> <span class="s">{</span> | 
|  | 291  278   <span class="k">my</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 292  279 | 
|  | 293  280   <span class="k">my</span><span class="s">(</span><span class="i">$PreviousChainID</span><span class="cm">,</span> <span class="i">$PreviousResidueNumber</span><span class="cm">,</span> <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="cm">,</span> <span class="i">%ResiduesDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 294  281 | 
|  | 295  282   <span class="i">%ResiduesDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 296  283   <span class="i">@</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">ResidueNames</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 297  284   <span class="i">%</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">ResidueCount</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 298  285   <span class="i">@</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">AtomResidueNames</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 299  286   <span class="i">%</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">AtomResidueCount</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 300  287   <span class="i">@</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">HetatmResidueNames</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 301  288   <span class="i">%</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">HetatmResidueCount</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 302  289 | 
|  | 303  290   <span class="i">$PreviousChainID</span> = <span class="q">''</span><span class="sc">;</span> | 
|  | 304  291   <span class="i">$PreviousResidueNumber</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 305  292 | 
|  | 306  293   <span class="j">LINE:</span> <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 307  294     <span class="k">if</span> <span class="s">(</span><span class="i">IsEndmdlRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 308  295       <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 309  296     <span class="s">}</span> | 
|  | 310  297     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">IsAtomRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span> || <span class="i">IsHetatmRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 311  298       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 312  299     <span class="s">}</span> | 
|  | 313  300     <span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span> = <span class="i">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span> | 
|  | 314  301 | 
|  | 315  302     <span class="k">if</span> <span class="s">(</span><span class="i">$PreviousChainID</span> <span class="k">eq</span> <span class="i">$ChainID</span><span class="s">)</span> <span class="s">{</span> | 
|  | 316  303       <span class="k">if</span> <span class="s">(</span><span class="i">$ResidueNumber</span> == <span class="i">$PreviousResidueNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 317  304         <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 318  305       <span class="s">}</span> | 
|  | 319  306       <span class="i">$PreviousResidueNumber</span> = <span class="i">$ResidueNumber</span><span class="sc">;</span> | 
|  | 320  307     <span class="s">}</span> | 
|  | 321  308     <span class="k">else</span> <span class="s">{</span> | 
|  | 322  309       <span class="c"># New chain...</span> | 
|  | 323  310       <span class="i">$PreviousChainID</span> = <span class="i">$ChainID</span><span class="sc">;</span> | 
|  | 324  311       <span class="i">$PreviousResidueNumber</span> = <span class="i">$ResidueNumber</span><span class="sc">;</span> | 
|  | 325  312     <span class="s">}</span> | 
|  | 326  313 | 
|  | 327  314     <span class="c"># Store the residue and update its count...</span> | 
|  | 328  315     <span class="k">push</span> <span class="i">@</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">ResidueNames</span>}}<span class="cm">,</span> <span class="i">$ResidueName</span><span class="sc">;</span> | 
|  | 329  316     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ResiduesDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ResidueName</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 330  317       <span class="i">$ResiduesDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ResidueName</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 331  318     <span class="s">}</span> | 
|  | 332  319     <span class="k">else</span> <span class="s">{</span> | 
|  | 333  320       <span class="i">$ResiduesDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ResidueName</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 334  321     <span class="s">}</span> | 
|  | 335  322     <span class="c"># Update ATOM residue data...</span> | 
|  | 336  323     <span class="k">if</span> <span class="s">(</span><span class="i">IsAtomRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 337  324       <span class="k">push</span> <span class="i">@</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">AtomResidueNames</span>}}<span class="cm">,</span> <span class="i">$ResidueName</span><span class="sc">;</span> | 
|  | 338  325       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ResiduesDataMap</span>{<span class="w">AtomResidueCount</span>}{<span class="i">$ResidueName</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 339  326         <span class="i">$ResiduesDataMap</span>{<span class="w">AtomResidueCount</span>}{<span class="i">$ResidueName</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 340  327       <span class="s">}</span> | 
|  | 341  328       <span class="k">else</span> <span class="s">{</span> | 
|  | 342  329         <span class="i">$ResiduesDataMap</span>{<span class="w">AtomResidueCount</span>}{<span class="i">$ResidueName</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 343  330       <span class="s">}</span> | 
|  | 344  331     <span class="s">}</span> | 
|  | 345  332     <span class="c"># Update HETATM residue data...</span> | 
|  | 346  333     <span class="k">if</span> <span class="s">(</span><span class="i">IsHetatmRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 347  334       <span class="k">push</span> <span class="i">@</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">HetatmResidueNames</span>}}<span class="cm">,</span> <span class="i">$ResidueName</span><span class="sc">;</span> | 
|  | 348  335       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ResiduesDataMap</span>{<span class="w">HetatmResidueCount</span>}{<span class="i">$ResidueName</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 349  336         <span class="i">$ResiduesDataMap</span>{<span class="w">HetatmResidueCount</span>}{<span class="i">$ResidueName</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 350  337       <span class="s">}</span> | 
|  | 351  338       <span class="k">else</span> <span class="s">{</span> | 
|  | 352  339         <span class="i">$ResiduesDataMap</span>{<span class="w">HetatmResidueCount</span>}{<span class="i">$ResidueName</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 353  340       <span class="s">}</span> | 
|  | 354  341     <span class="s">}</span> | 
|  | 355  342   <span class="s">}</span> | 
|  | 356  343 | 
|  | 357  344   <span class="k">return</span> \<span class="i">%ResiduesDataMap</span><span class="sc">;</span> | 
|  | 358  345 <span class="s">}</span> | 
|  | 359  346 | 
|  | 360  347 <span class="c"># Return min/max XYZ coordinates for ATOM/HETATM records...</span> | 
|  | 361 <a name="GetMinMaxCoords-"></a> 348 <span class="k">sub </span><span class="m">GetMinMaxCoords</span> <span class="s">{</span> | 
|  | 362  349   <span class="k">my</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 363  350 | 
|  | 364  351   <span class="k">my</span><span class="s">(</span><span class="i">$XMin</span><span class="cm">,</span> <span class="i">$YMin</span><span class="cm">,</span> <span class="i">$ZMin</span><span class="cm">,</span> <span class="i">$XMax</span><span class="cm">,</span> <span class="i">$YMax</span><span class="cm">,</span> <span class="i">$ZMax</span><span class="cm">,</span> <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 365  352 | 
|  | 366  353   <span class="s">(</span><span class="i">$XMin</span><span class="cm">,</span> <span class="i">$YMin</span><span class="cm">,</span> <span class="i">$ZMin</span><span class="s">)</span> = <span class="s">(</span><span class="n">99999</span><span class="s">)</span> x <span class="n">3</span><span class="sc">;</span> | 
|  | 367  354   <span class="s">(</span><span class="i">$XMax</span><span class="cm">,</span> <span class="i">$YMax</span><span class="cm">,</span> <span class="i">$ZMax</span><span class="s">)</span> = <span class="s">(</span><span class="n">-99999</span><span class="s">)</span> x <span class="n">3</span><span class="sc">;</span> | 
|  | 368  355 | 
|  | 369  356   <span class="j">LINE:</span> <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 370  357     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">IsAtomRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span> || <span class="i">IsHetatmRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 371  358       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 372  359     <span class="s">}</span> | 
|  | 373  360     <span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span> = <span class="i">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span> | 
|  | 374  361 | 
|  | 375  362     <span class="i">$XMin</span> = <span class="s">(</span><span class="i">$X</span> < <span class="i">$XMin</span><span class="s">)</span> ? <span class="i">$X</span> <span class="co">:</span> <span class="i">$XMin</span><span class="sc">;</span> | 
|  | 376  363     <span class="i">$YMin</span> = <span class="s">(</span><span class="i">$Y</span> < <span class="i">$YMin</span><span class="s">)</span> ? <span class="i">$Y</span> <span class="co">:</span> <span class="i">$YMin</span><span class="sc">;</span> | 
|  | 377  364     <span class="i">$ZMin</span> = <span class="s">(</span><span class="i">$Z</span> < <span class="i">$ZMin</span><span class="s">)</span> ? <span class="i">$Z</span> <span class="co">:</span> <span class="i">$ZMin</span><span class="sc">;</span> | 
|  | 378  365 | 
|  | 379  366     <span class="i">$XMax</span> = <span class="s">(</span><span class="i">$X</span> > <span class="i">$XMax</span><span class="s">)</span> ? <span class="i">$X</span> <span class="co">:</span> <span class="i">$XMax</span><span class="sc">;</span> | 
|  | 380  367     <span class="i">$YMax</span> = <span class="s">(</span><span class="i">$Y</span> > <span class="i">$YMax</span><span class="s">)</span> ? <span class="i">$Y</span> <span class="co">:</span> <span class="i">$YMax</span><span class="sc">;</span> | 
|  | 381  368     <span class="i">$ZMax</span> = <span class="s">(</span><span class="i">$Z</span> > <span class="i">$ZMax</span><span class="s">)</span> ? <span class="i">$Z</span> <span class="co">:</span> <span class="i">$ZMax</span><span class="sc">;</span> | 
|  | 382  369   <span class="s">}</span> | 
|  | 383  370 | 
|  | 384  371   <span class="k">if</span> <span class="s">(</span><span class="i">$XMin</span> == <span class="n">99999</span><span class="s">)</span> <span class="s">{</span> <span class="i">$XMin</span> = <span class="k">undef</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 385  372   <span class="k">if</span> <span class="s">(</span><span class="i">$YMin</span> == <span class="n">99999</span><span class="s">)</span> <span class="s">{</span> <span class="i">$YMin</span> = <span class="k">undef</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 386  373   <span class="k">if</span> <span class="s">(</span><span class="i">$ZMin</span> == <span class="n">99999</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ZMin</span> = <span class="k">undef</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 387  374   <span class="k">if</span> <span class="s">(</span><span class="i">$XMax</span> == <span class="n">-99999</span><span class="s">)</span> <span class="s">{</span> <span class="i">$XMax</span> = <span class="k">undef</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 388  375   <span class="k">if</span> <span class="s">(</span><span class="i">$YMax</span> == <span class="n">-99999</span><span class="s">)</span> <span class="s">{</span> <span class="i">$YMax</span> = <span class="k">undef</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 389  376   <span class="k">if</span> <span class="s">(</span><span class="i">$ZMax</span> == <span class="n">-99999</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ZMax</span> = <span class="k">undef</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 390  377 | 
|  | 391  378   <span class="k">return</span> <span class="s">(</span><span class="i">$XMin</span><span class="cm">,</span> <span class="i">$YMin</span><span class="cm">,</span> <span class="i">$ZMin</span><span class="cm">,</span> <span class="i">$XMax</span><span class="cm">,</span> <span class="i">$YMax</span><span class="cm">,</span> <span class="i">$ZMax</span><span class="s">)</span><span class="sc">;</span> | 
|  | 392  379 <span class="s">}</span> | 
|  | 393  380 | 
|  | 394  381 <span class="c"># Read PDB file and return reference to record lines..</span> | 
|  | 395 <a name="ReadPDBFile-"></a> 382 <span class="k">sub </span><span class="m">ReadPDBFile</span> <span class="s">{</span> | 
|  | 396  383   <span class="k">my</span><span class="s">(</span><span class="i">$PDBFile</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 397  384 | 
|  | 398  385   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="i">@PDBRecordLines</span><span class="s">)</span><span class="sc">;</span> | 
|  | 399  386 | 
|  | 400  387   <span class="i">@PDBRecordLines</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 401  388   <span class="k">open</span> <span class="w">PDBFILE</span><span class="cm">,</span> <span class="q">"$PDBFile"</span> <span class="k">or</span> <span class="k">die</span> <span class="q">"Can't open $PDBFile: $!\n"</span><span class="sc">;</span> | 
|  | 402  389   <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">*PDBFILE</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 403  390     <span class="k">push</span> <span class="i">@PDBRecordLines</span><span class="cm">,</span> <span class="i">$Line</span><span class="sc">;</span> | 
|  | 404  391   <span class="s">}</span> | 
|  | 405  392 | 
|  | 406  393   <span class="k">close</span> <span class="w">PDBFILE</span><span class="sc">;</span> | 
|  | 407  394 | 
|  | 408  395   <span class="k">return</span> <span class="s">(</span>\<span class="i">@PDBRecordLines</span><span class="s">)</span><span class="sc">;</span> | 
|  | 409  396 <span class="s">}</span> | 
|  | 410  397 | 
|  | 411  398 <span class="c">#</span> | 
|  | 412  399 <span class="c"># Get experimental technique information...</span> | 
|  | 413  400 <span class="c">#</span> | 
|  | 414 <a name="GetExperimentalTechnique-"></a> 401 <span class="k">sub </span><span class="m">GetExperimentalTechnique</span> <span class="s">{</span> | 
|  | 415  402   <span class="k">my</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 416  403   <span class="k">my</span><span class="s">(</span><span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$ContinuationNum</span><span class="cm">,</span> <span class="i">$ExperimentalTechnique</span><span class="s">)</span><span class="sc">;</span> | 
|  | 417  404 | 
|  | 418  405   <span class="i">$ExperimentalTechnique</span> = <span class="k">undef</span><span class="sc">;</span> | 
|  | 419  406 | 
|  | 420  407   <span class="j">LINE:</span> <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 421  408       <span class="k">if</span> <span class="s">(</span><span class="i">_IsRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="cm">,</span> <span class="q">'EXPDTA'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 422  409         <span class="s">(</span><span class="i">$ContinuationNum</span><span class="cm">,</span> <span class="i">$ExperimentalTechnique</span><span class="s">)</span> = <span class="i">ParseExpdtaRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span> | 
|  | 423  410         <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 424  411       <span class="s">}</span> | 
|  | 425  412   <span class="s">}</span> | 
|  | 426  413 | 
|  | 427  414   <span class="k">return</span> <span class="i">$ExperimentalTechnique</span><span class="sc">;</span> | 
|  | 428  415 <span class="s">}</span> | 
|  | 429  416 | 
|  | 430  417 <span class="c">#</span> | 
|  | 431  418 <span class="c"># Get experimental technique resolution information...</span> | 
|  | 432  419 <span class="c">#</span> | 
|  | 433 <a name="GetExperimentalTechniqueResolution-"></a> 420 <span class="k">sub </span><span class="m">GetExperimentalTechniqueResolution</span> <span class="s">{</span> | 
|  | 434  421   <span class="k">my</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 435  422   <span class="k">my</span><span class="s">(</span><span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$Resolution</span><span class="cm">,</span> <span class="i">$ResolutionUnits</span><span class="s">)</span><span class="sc">;</span> | 
|  | 436  423 | 
|  | 437  424   <span class="s">(</span><span class="i">$Resolution</span><span class="cm">,</span> <span class="i">$ResolutionUnits</span><span class="s">)</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="s">)</span><span class="sc">;</span> | 
|  | 438  425 | 
|  | 439  426   <span class="j">LINE:</span> <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 440  427     <span class="k">if</span> <span class="s">(</span><span class="i">$RecordLine</span> =~ <span class="q">/^REMARK   2 RESOLUTION./i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 441  428       <span class="s">(</span><span class="i">$Resolution</span><span class="cm">,</span> <span class="i">$ResolutionUnits</span><span class="s">)</span> = <span class="i">ParseRemark2ResolutionRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span> | 
|  | 442  429       <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 443  430     <span class="s">}</span> | 
|  | 444  431   <span class="s">}</span> | 
|  | 445  432 | 
|  | 446  433   <span class="k">return</span> <span class="s">(</span><span class="i">$Resolution</span><span class="cm">,</span> <span class="i">$ResolutionUnits</span><span class="s">)</span><span class="sc">;</span> | 
|  | 447  434 <span class="s">}</span> | 
|  | 448  435 | 
|  | 449  436 <span class="c">#</span> | 
|  | 450  437 <span class="c"># Parse HEADER record line...</span> | 
|  | 451 <a name="ParseHeaderRecordLine-"></a> 438 <span class="k">sub </span><span class="m">ParseHeaderRecordLine</span> <span class="s">{</span> | 
|  | 452  439   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 453  440   <span class="k">my</span><span class="s">(</span><span class="i">$Classification</span><span class="cm">,</span> <span class="i">$DepositionDate</span><span class="cm">,</span> <span class="i">$IDCode</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 454  441 | 
|  | 455  442   <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> !~ <span class="q">/^HEADER/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 456  443     <span class="k">return</span> <span class="s">(</span><span class="i">$Classification</span><span class="cm">,</span> <span class="i">$DepositionDate</span><span class="cm">,</span> <span class="i">$IDCode</span><span class="s">)</span><span class="sc">;</span> | 
|  | 457  444   <span class="s">}</span> | 
|  | 458  445   <span class="k">my</span><span class="s">(</span><span class="i">$Length</span><span class="s">)</span><span class="sc">;</span> | 
|  | 459  446 | 
|  | 460  447   <span class="s">(</span><span class="i">$Classification</span><span class="cm">,</span> <span class="i">$DepositionDate</span><span class="cm">,</span> <span class="i">$IDCode</span><span class="s">)</span> = <span class="s">(</span><span class="q">''</span><span class="s">)</span> x <span class="n">3</span><span class="sc">;</span> | 
|  | 461  448 | 
|  | 462  449   <span class="i">$Length</span> = <span class="k">length</span> <span class="i">$Line</span><span class="sc">;</span> | 
|  | 463  450 | 
|  | 464  451   <span class="k">if</span> <span class="s">(</span><span class="i">$Length</span> <= <span class="n">62</span><span class="s">)</span> <span class="s">{</span> | 
|  | 465  452     <span class="s">(</span><span class="i">$Classification</span><span class="cm">,</span> <span class="i">$DepositionDate</span><span class="s">)</span> = <span class="k">unpack</span><span class="s">(</span><span class="q">"x10A40A9"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 466  453   <span class="s">}</span> | 
|  | 467  454   <span class="k">else</span> <span class="s">{</span> | 
|  | 468  455     <span class="s">(</span><span class="i">$Classification</span><span class="cm">,</span> <span class="i">$DepositionDate</span><span class="cm">,</span> <span class="i">$IDCode</span><span class="s">)</span> = <span class="k">unpack</span><span class="s">(</span><span class="q">"x10A40A9x3A4"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 469  456   <span class="s">}</span> | 
|  | 470  457 | 
|  | 471  458   <span class="i">$Classification</span> = <span class="i">RemoveLeadingAndTrailingWhiteSpaces</span><span class="s">(</span><span class="i">$Classification</span><span class="s">)</span><span class="sc">;</span> | 
|  | 472  459   <span class="i">$DepositionDate</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 473  460   <span class="i">$IDCode</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 474  461 | 
|  | 475  462   <span class="k">return</span> <span class="s">(</span><span class="i">$Classification</span><span class="cm">,</span> <span class="i">$DepositionDate</span><span class="cm">,</span> <span class="i">$IDCode</span><span class="s">)</span><span class="sc">;</span> | 
|  | 476  463 <span class="s">}</span> | 
|  | 477  464 | 
|  | 478  465 <span class="c">#</span> | 
|  | 479  466 <span class="c"># Generate HEADER record line...</span> | 
|  | 480 <a name="GenerateHeaderRecordLine-"></a> 467 <span class="k">sub </span><span class="m">GenerateHeaderRecordLine</span> <span class="s">{</span> | 
|  | 481  468   <span class="k">my</span><span class="s">(</span><span class="i">$Classification</span><span class="cm">,</span> <span class="i">$Date</span><span class="cm">,</span> <span class="i">$IDCode</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 482  469 | 
|  | 483  470   <span class="i">$Classification</span> = <span class="q">"Created using MayaChemTools"</span><span class="sc">;</span> | 
|  | 484  471   <span class="i">$Date</span> = <span class="i">GenerateHeaderRecordTimeStamp</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 485  472   <span class="k">if</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 486  473     <span class="s">(</span><span class="i">$IDCode</span><span class="cm">,</span> <span class="i">$Classification</span><span class="cm">,</span> <span class="i">$Date</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 487  474   <span class="s">}</span> | 
|  | 488  475   <span class="k">elsif</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 489  476     <span class="s">(</span><span class="i">$IDCode</span><span class="cm">,</span> <span class="i">$Classification</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 490  477   <span class="s">}</span> | 
|  | 491  478   <span class="k">elsif</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 492  479     <span class="s">(</span><span class="i">$IDCode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 493  480   <span class="s">}</span> | 
|  | 494  481 | 
|  | 495  482   <span class="i">$Line</span> = <span class="k">sprintf</span> <span class="q">"HEADER    %-40.40s%9.9s   %4.4s"</span><span class="cm">,</span> <span class="i">$Classification</span><span class="cm">,</span> <span class="i">$Date</span><span class="cm">,</span> <span class="i">$IDCode</span><span class="sc">;</span> | 
|  | 496  483   <span class="k">return</span> <span class="i">$Line</span><span class="sc">;</span> | 
|  | 497  484 <span class="s">}</span> | 
|  | 498  485 | 
|  | 499  486 <span class="c"># Generate PDB header time stamp...</span> | 
|  | 500 <a name="GenerateHeaderRecordTimeStamp-"></a> 487 <span class="k">sub </span><span class="m">GenerateHeaderRecordTimeStamp</span> <span class="s">{</span> | 
|  | 501  488   <span class="k">return</span> <span class="i">TimeUtil::PDBFileTimeStamp</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 502  489 <span class="s">}</span> | 
|  | 503  490 | 
|  | 504  491 <span class="c">#</span> | 
|  | 505  492 <span class="c"># Parse ATOM record line.</span> | 
|  | 506  493 <span class="c">#</span> | 
|  | 507 <a name="ParseAtomRecordLine-"></a> 494 <span class="k">sub </span><span class="m">ParseAtomRecordLine</span> <span class="s">{</span> | 
|  | 508  495   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 509  496 | 
|  | 510  497   <span class="k">return</span> <span class="i">_ParseAtomOrHetatmRecordLine</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 511  498 <span class="s">}</span> | 
|  | 512  499 | 
|  | 513  500 <span class="c"># Generate ATOM record line...</span> | 
|  | 514 <a name="GenerateAtomRecordLine-"></a> 501 <span class="k">sub </span><span class="m">GenerateAtomRecordLine</span> <span class="s">{</span> | 
|  | 515  502   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 516  503 | 
|  | 517  504   <span class="k">return</span> <span class="i">_GenerateAtomOrHetatmRecordLine</span><span class="s">(</span><span class="q">'ATOM'</span><span class="cm">,</span> <span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 518  505 <span class="s">}</span> | 
|  | 519  506 | 
|  | 520  507 <span class="c">#</span> | 
|  | 521  508 <span class="c"># Parse ATOM/HETATm record line.</span> | 
|  | 522  509 <span class="c">#</span> | 
|  | 523 <a name="ParseAtomOrHetatmRecordLine-"></a> 510 <span class="k">sub </span><span class="m">ParseAtomOrHetatmRecordLine</span> <span class="s">{</span> | 
|  | 524  511   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 525  512 | 
|  | 526  513   <span class="k">return</span> <span class="i">_ParseAtomOrHetatmRecordLine</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 527  514 <span class="s">}</span> | 
|  | 528  515 | 
|  | 529  516 <span class="c"># Generate ATOM/HETATM record line...</span> | 
|  | 530 <a name="GenerateAtomOrHetatmRecordLine-"></a> 517 <span class="k">sub </span><span class="m">GenerateAtomOrHetatmRecordLine</span> <span class="s">{</span> | 
|  | 531  518   <span class="k">my</span><span class="s">(</span><span class="i">$RecordType</span><span class="cm">,</span> <span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 532  519 | 
|  | 533  520   <span class="k">return</span> <span class="i">_GenerateAtomOrHetatmRecordLine</span><span class="s">(</span><span class="i">$RecordType</span><span class="cm">,</span> <span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 534  521 <span class="s">}</span> | 
|  | 535  522 <span class="c">#</span> | 
|  | 536  523 <span class="c"># Parse HETATM record line...</span> | 
|  | 537  524 <span class="c">#</span> | 
|  | 538 <a name="ParseHetatmRecordLine-"></a> 525 <span class="k">sub </span><span class="m">ParseHetatmRecordLine</span> <span class="s">{</span> | 
|  | 539  526   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 540  527 | 
|  | 541  528   <span class="k">return</span> <span class="i">_ParseAtomOrHetatmRecordLine</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 542  529 <span class="s">}</span> | 
|  | 543  530 | 
|  | 544  531 <span class="c"># Generate HETATM record line...</span> | 
|  | 545 <a name="GenerateHetatmRecordLine-"></a> 532 <span class="k">sub </span><span class="m">GenerateHetatmRecordLine</span> <span class="s">{</span> | 
|  | 546  533   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 547  534 | 
|  | 548  535   <span class="k">return</span> <span class="i">_GenerateAtomOrHetatmRecordLine</span><span class="s">(</span><span class="q">'HETATM'</span><span class="cm">,</span> <span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 549  536 <span class="s">}</span> | 
|  | 550  537 | 
|  | 551  538 <span class="c"># Parse EXPDTA record line...</span> | 
|  | 552  539 <span class="c">#</span> | 
|  | 553  540 <span class="c"># EXPDTA format:</span> | 
|  | 554  541 <span class="c">#</span> | 
|  | 555  542 <span class="c">#1 - 6 Record name "EXPDTA"</span> | 
|  | 556  543 <span class="c"># 9 - 10 Continuation continuation Allows concatenation of multiple records.</span> | 
|  | 557  544 <span class="c"># 11 - 70 SList technique The experimental technique(s) with optional comment describing the sample or experiment.</span> | 
|  | 558  545 <span class="c">#</span> | 
|  | 559  546 <span class="c"># The EXPDTA record identifies the experimental technique used. This may refer to the type of radiation and</span> | 
|  | 560  547 <span class="c"># sample, or include the spectroscopic or modeling technique. Permitted values include:</span> | 
|  | 561  548 <span class="c">#</span> | 
|  | 562  549 <span class="c"># ELECTRON DIFFRACTION</span> | 
|  | 563  550 <span class="c"># FIBER DIFFRACTION</span> | 
|  | 564  551 <span class="c"># FLUORESCENCE TRANSFER</span> | 
|  | 565  552 <span class="c"># NEUTRON DIFFRACTION</span> | 
|  | 566  553 <span class="c"># NMR</span> | 
|  | 567  554 <span class="c"># THEORETICAL MODEL</span> | 
|  | 568  555 <span class="c"># X-RAY DIFFRACTION</span> | 
|  | 569  556 <span class="c">#</span> | 
|  | 570 <a name="ParseExpdtaRecordLine-"></a> 557 <span class="k">sub </span><span class="m">ParseExpdtaRecordLine</span> <span class="s">{</span> | 
|  | 571  558   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 572  559 | 
|  | 573  560   <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> !~ <span class="q">/^EXPDTA/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 574  561     <span class="k">return</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="s">)</span><span class="sc">;</span> | 
|  | 575  562   <span class="s">}</span> | 
|  | 576  563 | 
|  | 577  564   <span class="k">my</span><span class="s">(</span><span class="i">$ContinuationNum</span><span class="cm">,</span> <span class="i">$ExperimentalTechnique</span><span class="s">)</span> = <span class="k">unpack</span><span class="s">(</span><span class="q">"x8A2A60"</span> <span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 578  565 | 
|  | 579  566   <span class="i">$ContinuationNum</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 580  567   <span class="i">$ExperimentalTechnique</span> = <span class="i">RemoveLeadingAndTrailingWhiteSpaces</span><span class="s">(</span><span class="i">$ExperimentalTechnique</span><span class="s">)</span><span class="sc">;</span> | 
|  | 581  568 | 
|  | 582  569   <span class="k">return</span> <span class="s">(</span><span class="i">$ContinuationNum</span><span class="cm">,</span> <span class="i">$ExperimentalTechnique</span><span class="s">)</span><span class="sc">;</span> | 
|  | 583  570 <span class="s">}</span> | 
|  | 584  571 | 
|  | 585  572 <span class="c"># Parse REMARK 2 record line...</span> | 
|  | 586  573 <span class="c">#</span> | 
|  | 587  574 <span class="c"># REMARK 2 format:</span> | 
|  | 588  575 <span class="c">#</span> | 
|  | 589  576 <span class="c"># The second REMARK 2 record has one of two formats. The first is used for diffraction studies, the second</span> | 
|  | 590  577 <span class="c"># for other types of experiments in which resolution is not relevant, e.g., NMR and theoretical modeling.</span> | 
|  | 591  578 <span class="c">#</span> | 
|  | 592  579 <span class="c">#For diffraction experiments:</span> | 
|  | 593  580 <span class="c">#</span> | 
|  | 594  581 <span class="c"># 1 - 6 Record name "REMARK"</span> | 
|  | 595  582 <span class="c"># 10 LString(1) "2"</span> | 
|  | 596  583 <span class="c"># 12 - 22 LString(11) "RESOLUTION."</span> | 
|  | 597  584 <span class="c"># 23 - 27 Real(5.2) resolution Resolution.</span> | 
|  | 598  585 <span class="c"># 29 - 38 LString(10) "ANGSTROMS."</span> | 
|  | 599  586 <span class="c">#</span> | 
|  | 600  587 <span class="c"># REMARK 2 when not a diffraction experiment:</span> | 
|  | 601  588 <span class="c">#</span> | 
|  | 602  589 <span class="c"># 1 - 6 Record name "REMARK"</span> | 
|  | 603  590 <span class="c"># 10 LString(1) "2"</span> | 
|  | 604  591 <span class="c"># 12 - 38 LString(28) "RESOLUTION. NOT APPLICABLE."</span> | 
|  | 605  592 <span class="c"># 41 - 70 String comment Comment.</span> | 
|  | 606  593 <span class="c">#</span> | 
|  | 607 <a name="ParseRemark2ResolutionRecordLine-"></a> 594 <span class="k">sub </span><span class="m">ParseRemark2ResolutionRecordLine</span> <span class="s">{</span> | 
|  | 608  595   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 609  596 | 
|  | 610  597   <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> !~ <span class="q">/^REMARK   2 RESOLUTION./i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 611  598     <span class="k">return</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="s">)</span><span class="sc">;</span> | 
|  | 612  599   <span class="s">}</span> | 
|  | 613  600 | 
|  | 614  601   <span class="k">my</span><span class="s">(</span><span class="i">$Resolution</span><span class="cm">,</span> <span class="i">$ResolutionUnits</span><span class="s">)</span><span class="sc">;</span> | 
|  | 615  602 | 
|  | 616  603   <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> =~ <span class="q">/NOT APPLICABLE/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 617  604     <span class="s">(</span><span class="i">$Resolution</span><span class="cm">,</span> <span class="i">$ResolutionUnits</span><span class="s">)</span> = <span class="s">(</span><span class="q">"NOT APPLICABLE"</span><span class="cm">,</span> <span class="q">""</span><span class="s">)</span><span class="sc">;</span> | 
|  | 618  605   <span class="s">}</span> | 
|  | 619  606   <span class="k">else</span> <span class="s">{</span> | 
|  | 620  607     <span class="s">(</span><span class="i">$Resolution</span><span class="cm">,</span> <span class="i">$ResolutionUnits</span><span class="s">)</span> = <span class="k">unpack</span><span class="s">(</span><span class="q">"x22A5x1A10"</span> <span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 621  608   <span class="s">}</span> | 
|  | 622  609 | 
|  | 623  610   <span class="i">$Resolution</span> = <span class="i">RemoveLeadingAndTrailingWhiteSpaces</span><span class="s">(</span><span class="i">$Resolution</span><span class="s">)</span><span class="sc">;</span> | 
|  | 624  611 | 
|  | 625  612   <span class="i">$ResolutionUnits</span> = <span class="i">RemoveLeadingAndTrailingWhiteSpaces</span><span class="s">(</span><span class="i">$ResolutionUnits</span><span class="s">)</span><span class="sc">;</span> | 
|  | 626  613   <span class="i">$ResolutionUnits</span> =~ <span class="q">s/\.$//</span><span class="sc">;</span> | 
|  | 627  614 | 
|  | 628  615   <span class="k">return</span> <span class="s">(</span><span class="i">$Resolution</span><span class="cm">,</span> <span class="i">$ResolutionUnits</span><span class="s">)</span><span class="sc">;</span> | 
|  | 629  616 <span class="s">}</span> | 
|  | 630  617 | 
|  | 631  618 <span class="c">#</span> | 
|  | 632  619 <span class="c"># Parse SEQRES record line...</span> | 
|  | 633  620 <span class="c">#</span> | 
|  | 634  621 <span class="c"># SEQRES format:</span> | 
|  | 635  622 <span class="c">#</span> | 
|  | 636  623 <span class="c"># 1 - 6 Record name "SEQRES"</span> | 
|  | 637  624 <span class="c"># 9 - 10 Serial number of the SEQRES record for the current chain. Starts at 1 and increments by one each line. Reset to 1 for each chain.</span> | 
|  | 638  625 <span class="c"># 12 - Chain identifier</span> | 
|  | 639  626 <span class="c"># 14 - 17 Integer numRes Number of residues in the chain</span> | 
|  | 640  627 <span class="c"># 20 - 22 24 -26 ... ... 68 - 70 Residue name resName Residue name.</span> | 
|  | 641  628 <span class="c">#</span> | 
|  | 642 <a name="ParseSeqresRecordLine-"></a> 629 <span class="k">sub </span><span class="m">ParseSeqresRecordLine</span> <span class="s">{</span> | 
|  | 643  630   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 644  631 | 
|  | 645  632   <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> !~ <span class="q">/^SEQRES/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 646  633     <span class="k">return</span> <span class="s">(</span><span class="s">(</span><span class="k">undef</span><span class="s">)</span> x <span class="n">5</span><span class="s">)</span><span class="sc">;</span> | 
|  | 647  634   <span class="s">}</span> | 
|  | 648  635   <span class="k">my</span><span class="s">(</span><span class="i">$RecordSerialNumber</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$NumOfResidues</span><span class="cm">,</span> <span class="i">$ResidueNames</span><span class="s">)</span> = <span class="k">unpack</span><span class="s">(</span><span class="q">"x8A2x1A1x1A4x2A51"</span> <span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 649  636   <span class="i">$RecordSerialNumber</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 650  637   <span class="i">$ChainID</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 651  638   <span class="i">$NumOfResidues</span> =~ <span class="q">s/ //g</span><span class="sc">;</span> | 
|  | 652  639   <span class="i">$ResidueNames</span> = <span class="i">RemoveLeadingAndTrailingWhiteSpaces</span><span class="s">(</span><span class="i">$ResidueNames</span><span class="s">)</span><span class="sc">;</span> | 
|  | 653  640 | 
|  | 654  641   <span class="k">return</span> <span class="s">(</span><span class="i">$RecordSerialNumber</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$NumOfResidues</span><span class="cm">,</span> <span class="i">$ResidueNames</span><span class="s">)</span><span class="sc">;</span> | 
|  | 655  642 <span class="s">}</span> | 
|  | 656  643 | 
|  | 657  644 <span class="c">#</span> | 
|  | 658  645 <span class="c"># Parse CONECT record line...</span> | 
|  | 659  646 <span class="c">#</span> | 
|  | 660  647 <span class="c"># CONECT format:</span> | 
|  | 661  648 <span class="c">#</span> | 
|  | 662  649 <span class="c"># 1 - 6 Record name "CONECT"</span> | 
|  | 663  650 <span class="c"># 7 - 11 Atom number</span> | 
|  | 664  651 <span class="c"># 12 - 16, 17 - 21, 22 - 26, 27 - 31 Atom number of bonded atom</span> | 
|  | 665  652 <span class="c">#</span> | 
|  | 666  653 <span class="c"># 32 - 36, 37 - 41 Atom number of hydrogen bonded atom</span> | 
|  | 667  654 <span class="c"># 42 - 46 Atom number of salt bridged atom</span> | 
|  | 668  655 <span class="c"># 47 - 51, 52 -56 Atom number of hydrogen bonded atom</span> | 
|  | 669  656 <span class="c"># 57 - 61 Atom number of salt bridged atom</span> | 
|  | 670  657 <span class="c">#</span> | 
|  | 671 <a name="ParseConectRecordLine-"></a> 658 <span class="k">sub </span><span class="m">ParseConectRecordLine</span> <span class="s">{</span> | 
|  | 672  659   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 673  660 | 
|  | 674  661   <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> !~ <span class="q">/^CONECT/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 675  662     <span class="k">return</span> <span class="s">(</span><span class="s">(</span><span class="k">undef</span><span class="s">)</span> x <span class="n">11</span><span class="s">)</span><span class="sc">;</span> | 
|  | 676  663   <span class="s">}</span> | 
|  | 677  664   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNum</span><span class="cm">,</span> <span class="i">$BondedAtomNum1</span><span class="cm">,</span> <span class="i">$BondedAtomNum2</span><span class="cm">,</span> <span class="i">$BondedAtomNum3</span><span class="cm">,</span> <span class="i">$BondedAtomNum4</span><span class="cm">,</span> <span class="i">$HBondedAtomNum1</span><span class="cm">,</span> <span class="i">$HBondedAtomNum2</span><span class="cm">,</span> <span class="i">$SaltBridgedAtomNum1</span><span class="cm">,</span> <span class="i">$HBondedAtomNum3</span><span class="cm">,</span> <span class="i">$HBondedAtomNum4</span><span class="cm">,</span> <span class="i">$SaltBridgedAtomNum2</span><span class="s">)</span> = <span class="k">map</span> <span class="s">{</span><span class="q">s/ //g</span><span class="sc">;</span> <span class="i">$_</span><span class="s">}</span> <span class="k">unpack</span><span class="s">(</span><span class="q">"x6A5A5A5A5A5A5A5A5A5A5A5"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 678  665 | 
|  | 679  666   <span class="k">return</span> <span class="s">(</span><span class="i">$AtomNum</span><span class="cm">,</span> <span class="i">$BondedAtomNum1</span><span class="cm">,</span> <span class="i">$BondedAtomNum2</span><span class="cm">,</span> <span class="i">$BondedAtomNum3</span><span class="cm">,</span> <span class="i">$BondedAtomNum4</span><span class="cm">,</span> <span class="i">$HBondedAtomNum1</span><span class="cm">,</span> <span class="i">$HBondedAtomNum2</span><span class="cm">,</span> <span class="i">$SaltBridgedAtomNum1</span><span class="cm">,</span> <span class="i">$HBondedAtomNum3</span><span class="cm">,</span> <span class="i">$HBondedAtomNum4</span><span class="cm">,</span> <span class="i">$SaltBridgedAtomNum2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 680  667 <span class="s">}</span> | 
|  | 681  668 | 
|  | 682  669 <span class="c"># Generate CONECT record line...</span> | 
|  | 683 <a name="GenerateConectRecordLine-"></a> 670 <span class="k">sub </span><span class="m">GenerateConectRecordLine</span> <span class="s">{</span> | 
|  | 684  671   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNum</span><span class="cm">,</span> <span class="i">$BondedAtomNum1</span><span class="cm">,</span> <span class="i">$BondedAtomNum2</span><span class="cm">,</span> <span class="i">$BondedAtomNum3</span><span class="cm">,</span> <span class="i">$BondedAtomNum4</span><span class="cm">,</span> <span class="i">$HBondedAtomNum1</span><span class="cm">,</span> <span class="i">$HBondedAtomNum2</span><span class="cm">,</span> <span class="i">$SaltBridgedAtomNum1</span><span class="cm">,</span> <span class="i">$HBondedAtomNum3</span><span class="cm">,</span> <span class="i">$HBondedAtomNum4</span><span class="cm">,</span> <span class="i">$SaltBridgedAtomNum2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 685  672   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 686  673 | 
|  | 687  674   <span class="i">$Line</span> = <span class="k">sprintf</span> <span class="q">"CONECT%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s"</span><span class="cm">,</span> <span class="i">$AtomNum</span><span class="cm">,</span> <span class="i">$BondedAtomNum1</span><span class="cm">,</span> <span class="i">$BondedAtomNum2</span><span class="cm">,</span> <span class="i">$BondedAtomNum3</span><span class="cm">,</span> <span class="i">$BondedAtomNum4</span><span class="cm">,</span> <span class="i">$HBondedAtomNum1</span><span class="cm">,</span> <span class="i">$HBondedAtomNum2</span><span class="cm">,</span> <span class="i">$SaltBridgedAtomNum1</span><span class="cm">,</span> <span class="i">$HBondedAtomNum3</span><span class="cm">,</span> <span class="i">$HBondedAtomNum4</span><span class="cm">,</span> <span class="i">$SaltBridgedAtomNum2</span><span class="sc">;</span> | 
|  | 688  675 | 
|  | 689  676   <span class="k">return</span> <span class="i">$Line</span><span class="sc">;</span> | 
|  | 690  677 <span class="s">}</span> | 
|  | 691  678 | 
|  | 692  679 <span class="c">#</span> | 
|  | 693  680 <span class="c"># Parse TER record line...</span> | 
|  | 694  681 <span class="c">#</span> | 
|  | 695  682 <span class="c"># TER format:</span> | 
|  | 696  683 <span class="c">#</span> | 
|  | 697  684 <span class="c">#1 - 6 Record name "TER "</span> | 
|  | 698  685 <span class="c"># 7 - 11 Serial number</span> | 
|  | 699  686 <span class="c"># 18 - 20 Residue name</span> | 
|  | 700  687 <span class="c"># 22 Chain identifier</span> | 
|  | 701  688 <span class="c"># 23 - 26 Residue sequence number</span> | 
|  | 702  689 <span class="c"># 27 Insertion code</span> | 
|  | 703  690 <span class="c">#</span> | 
|  | 704 <a name="ParseTerRecordLine-"></a> 691 <span class="k">sub </span><span class="m">ParseTerRecordLine</span> <span class="s">{</span> | 
|  | 705  692   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 706  693 | 
|  | 707  694   <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> !~ <span class="q">/^TER/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 708  695     <span class="k">return</span> <span class="s">(</span><span class="s">(</span><span class="k">undef</span><span class="s">)</span> x <span class="n">5</span><span class="s">)</span><span class="sc">;</span> | 
|  | 709  696   <span class="s">}</span> | 
|  | 710  697   <span class="k">my</span><span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$Length</span><span class="s">)</span><span class="sc">;</span> | 
|  | 711  698 | 
|  | 712  699   <span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="s">)</span> = <span class="s">(</span><span class="q">''</span><span class="s">)</span> x <span class="n">5</span><span class="sc">;</span> | 
|  | 713  700 | 
|  | 714  701   <span class="i">$Length</span> = <span class="k">length</span> <span class="i">$Line</span><span class="sc">;</span> | 
|  | 715  702 | 
|  | 716  703   <span class="k">if</span> <span class="s">(</span><span class="i">$Length</span> <= <span class="n">17</span><span class="s">)</span> <span class="s">{</span> | 
|  | 717  704     <span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="s">)</span> = <span class="k">map</span> <span class="s">{</span><span class="q">s/ //g</span><span class="sc">;</span> <span class="i">$_</span><span class="s">}</span> <span class="k">unpack</span><span class="s">(</span><span class="q">"x6A5"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 718  705   <span class="s">}</span> | 
|  | 719  706   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Length</span> <= <span class="n">21</span><span class="s">)</span> <span class="s">{</span> | 
|  | 720  707     <span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="s">)</span> = <span class="k">map</span> <span class="s">{</span><span class="q">s/ //g</span><span class="sc">;</span> <span class="i">$_</span><span class="s">}</span> <span class="k">unpack</span><span class="s">(</span><span class="q">"x6A5x6A3"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 721  708   <span class="s">}</span> | 
|  | 722  709   <span class="k">else</span> <span class="s">{</span> | 
|  | 723  710     <span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="s">)</span> = <span class="k">map</span> <span class="s">{</span><span class="q">s/ //g</span><span class="sc">;</span> <span class="i">$_</span><span class="s">}</span> <span class="k">unpack</span><span class="s">(</span><span class="q">"x6A5x6A3xA1A4A1"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 724  711   <span class="s">}</span> | 
|  | 725  712 | 
|  | 726  713   <span class="k">return</span> <span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="s">)</span><span class="sc">;</span> | 
|  | 727  714 <span class="s">}</span> | 
|  | 728  715 | 
|  | 729  716 <span class="c"># Generate TER record line...</span> | 
|  | 730 <a name="GenerateTerRecordLine-"></a> 717 <span class="k">sub </span><span class="m">GenerateTerRecordLine</span> <span class="s">{</span> | 
|  | 731  718   <span class="k">my</span><span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span> = <span class="s">(</span><span class="q">''</span><span class="s">)</span> x <span class="n">6</span><span class="sc">;</span> | 
|  | 732  719 | 
|  | 733  720   <span class="k">if</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">5</span><span class="s">)</span> <span class="s">{</span> | 
|  | 734  721     <span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 735  722   <span class="s">}</span> | 
|  | 736  723   <span class="k">elsif</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">4</span><span class="s">)</span> <span class="s">{</span> | 
|  | 737  724     <span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 738  725   <span class="s">}</span> | 
|  | 739  726   <span class="k">elsif</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 740  727     <span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 741  728   <span class="s">}</span> | 
|  | 742  729   <span class="k">elsif</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 743  730     <span class="s">(</span><span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 744  731   <span class="s">}</span> | 
|  | 745  732   <span class="k">elsif</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 746  733     <span class="s">(</span><span class="i">$SerialNumber</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 747  734   <span class="s">}</span> | 
|  | 748  735   <span class="i">$Line</span> = <span class="k">sprintf</span> <span class="q">"TER   %5.5s      %-3.3s %1.1s%4.4s%1.1s"</span><span class="cm">,</span> <span class="i">$SerialNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="sc">;</span> | 
|  | 749  736 | 
|  | 750  737   <span class="k">return</span> <span class="i">$Line</span><span class="sc">;</span> | 
|  | 751  738 <span class="s">}</span> | 
|  | 752  739 | 
|  | 753  740 <span class="c">#</span> | 
|  | 754  741 <span class="c"># Parse MASTER record line...</span> | 
|  | 755  742 <span class="c">#</span> | 
|  | 756  743 <span class="c"># MASTER record format:</span> | 
|  | 757  744 <span class="c">#</span> | 
|  | 758  745 <span class="c">#1 - 6 Record name "MASTER"</span> | 
|  | 759  746 <span class="c"># 11 - 15 Number of REMARK records</span> | 
|  | 760  747 <span class="c"># 16 - 20 "0"</span> | 
|  | 761  748 <span class="c"># 21 - 25 Number of HET records</span> | 
|  | 762  749 <span class="c"># 26 - 30 Number of HELIX records</span> | 
|  | 763  750 <span class="c"># 31 - 35 Number of SHEET records</span> | 
|  | 764  751 <span class="c"># 36 - 40 Number of TURN records</span> | 
|  | 765  752 <span class="c"># 41 - 45 Number of SITE records</span> | 
|  | 766  753 <span class="c"># 46 - 50 Number of coordinate transformation records (ORIGXn+SCALEn+MTRIXn)</span> | 
|  | 767  754 <span class="c"># 51 - 55 Number of atomic coordinate records (ATOM+HETATM)</span> | 
|  | 768  755 <span class="c"># 56 - 60 Number of TER records</span> | 
|  | 769  756 <span class="c"># 61 - 65 Number of CONECT records</span> | 
|  | 770  757 <span class="c"># 66 - 70 Number of SEQRES records</span> | 
|  | 771  758 <span class="c">#</span> | 
|  | 772 <a name="ParseMasterRecordLine-"></a> 759 <span class="k">sub </span><span class="m">ParseMasterRecordLine</span> <span class="s">{</span> | 
|  | 773  760   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 774  761 | 
|  | 775  762   <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> !~ <span class="q">/^MASTER/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 776  763     <span class="k">return</span> <span class="s">(</span><span class="s">(</span><span class="k">undef</span><span class="s">)</span> x <span class="n">11</span><span class="s">)</span><span class="sc">;</span> | 
|  | 777  764   <span class="s">}</span> | 
|  | 778  765   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRemarkRecords</span><span class="cm">,</span> <span class="i">$NumOfHetRecords</span><span class="cm">,</span> <span class="i">$NumOfHelixRecords</span><span class="cm">,</span> <span class="i">$NumOfSheetRecords</span><span class="cm">,</span> <span class="i">$NumOfTurnRecords</span><span class="cm">,</span> <span class="i">$NumOfSiteRecords</span><span class="cm">,</span> <span class="i">$NumOfTransformationsRecords</span><span class="cm">,</span> <span class="i">$NumOfAtomAndHetatmRecords</span><span class="cm">,</span> <span class="i">$NumOfTerRecords</span><span class="cm">,</span> <span class="i">$NumOfConectRecords</span><span class="cm">,</span> <span class="i">$NumOfSeqresRecords</span><span class="s">)</span> = <span class="k">map</span> <span class="s">{</span><span class="q">s/ //g</span><span class="sc">;</span> <span class="i">$_</span><span class="s">}</span> <span class="k">unpack</span><span class="s">(</span><span class="q">"x6x4A5x5A5A5A5A5A5A5A5A5A5A5"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 779  766 | 
|  | 780  767   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfRemarkRecords</span><span class="cm">,</span> <span class="i">$NumOfHetRecords</span><span class="cm">,</span> <span class="i">$NumOfHelixRecords</span><span class="cm">,</span> <span class="i">$NumOfSheetRecords</span><span class="cm">,</span> <span class="i">$NumOfTurnRecords</span><span class="cm">,</span> <span class="i">$NumOfSiteRecords</span><span class="cm">,</span> <span class="i">$NumOfTransformationsRecords</span><span class="cm">,</span> <span class="i">$NumOfAtomAndHetatmRecords</span><span class="cm">,</span> <span class="i">$NumOfTerRecords</span><span class="cm">,</span> <span class="i">$NumOfConectRecords</span><span class="cm">,</span> <span class="i">$NumOfSeqresRecords</span><span class="s">)</span><span class="sc">;</span> | 
|  | 781  768 <span class="s">}</span> | 
|  | 782  769 | 
|  | 783  770 <span class="c"># End record...</span> | 
|  | 784 <a name="GenerateEndRecordLine-"></a> 771 <span class="k">sub </span><span class="m">GenerateEndRecordLine</span> <span class="s">{</span> | 
|  | 785  772   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 786  773   <span class="i">$Line</span> = <span class="q">'END   '</span><span class="sc">;</span> | 
|  | 787  774   <span class="k">return</span> <span class="i">$Line</span><span class="sc">;</span> | 
|  | 788  775 <span class="s">}</span> | 
|  | 789  776 | 
|  | 790  777 <span class="c"># ATOM/HETATM record format:</span> | 
|  | 791  778 <span class="c">#</span> | 
|  | 792  779 <span class="c"># 1 - 6 Record name</span> | 
|  | 793  780 <span class="c"># 7 - 11  Atom serial number - right justified</span> | 
|  | 794  781 <span class="c"># 13 - 16 Atom name</span> | 
|  | 795  782 <span class="c"># 17 Alternate location indicator.</span> | 
|  | 796  783 <span class="c"># 18 - 20 Residue name - right justified</span> | 
|  | 797  784 <span class="c"># 22 Chain identifier.</span> | 
|  | 798  785 <span class="c"># 23 - 26 Residue sequence number - right justified</span> | 
|  | 799  786 <span class="c"># 27 Code for insertion of residues.</span> | 
|  | 800  787 <span class="c"># 31 - 38 Real(8.3), Orthogonal coordinates for X in Angstroms.</span> | 
|  | 801  788 <span class="c"># 39 - 46 Real(8.3), Orthogonal coordinates for Y in Angstroms.</span> | 
|  | 802  789 <span class="c"># 47 - 54 Real(8.3), Orthogonal coordinates for Z in Angstroms.</span> | 
|  | 803  790 <span class="c"># 55 - 60 Real(6.2), Occupancy</span> | 
|  | 804  791 <span class="c"># 61 - 66 Real(6.2), Temperature factor</span> | 
|  | 805  792 <span class="c"># 73 - 76 LString(4), Segment identifier, left-justified.</span> | 
|  | 806  793 <span class="c"># 77 - 78 LString(2), Element symbol, right-justified.</span> | 
|  | 807  794 <span class="c">#79 - 80 LString(2), Charge on the atom.</span> | 
|  | 808  795 <span class="c">#</span> | 
|  | 809  796 <span class="c"># Notes:</span> | 
|  | 810  797 <span class="c">#  . Atom names starting with C, N, O and S are left justified starting with column 14</span> | 
|  | 811  798 <span class="c">#    and others are left justified starting with column 13.</span> | 
|  | 812  799 <span class="c">#</span> | 
|  | 813  800 <span class="c">#  . Six characters (columns) are reserved for atom names, assigned as follows:</span> | 
|  | 814  801 <span class="c">#</span> | 
|  | 815  802 <span class="c">#   13 - 14 Chemical symbol - right justified, except for hydrogen atoms</span> | 
|  | 816  803 <span class="c">#</span> | 
|  | 817  804 <span class="c">#   And for amino acids:</span> | 
|  | 818  805 <span class="c">#</span> | 
|  | 819  806 <span class="c">#   15 Remoteness indicator (alphabetic) (A, B, G, D, E, Z and so on)</span> | 
|  | 820  807 <span class="c">#   16 Branch designator (numeric)</span> | 
|  | 821  808 <span class="c">#</span> | 
|  | 822 <a name="_ParseAtomOrHetatmRecordLine-"></a> 809 <span class="k">sub </span><span class="m">_ParseAtomOrHetatmRecordLine</span> <span class="s">{</span> | 
|  | 823  810   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 824  811 | 
|  | 825  812   <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> !~ <span class="q">/^(ATOM|HETATM)/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 826  813     <span class="k">return</span> <span class="s">(</span><span class="s">(</span><span class="k">undef</span><span class="s">)</span> x <span class="n">15</span><span class="s">)</span><span class="sc">;</span> | 
|  | 827  814   <span class="s">}</span> | 
|  | 828  815   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="cm">,</span> <span class="i">$Length</span><span class="s">)</span><span class="sc">;</span> | 
|  | 829  816 | 
|  | 830  817   <span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span> = <span class="s">(</span><span class="q">''</span><span class="s">)</span> x <span class="n">15</span><span class="sc">;</span> | 
|  | 831  818 | 
|  | 832  819   <span class="i">$Length</span> = <span class="k">length</span> <span class="i">$Line</span><span class="sc">;</span> | 
|  | 833  820 | 
|  | 834  821   <span class="k">if</span> <span class="s">(</span><span class="i">$Length</span> <= <span class="n">72</span><span class="s">)</span> <span class="s">{</span> | 
|  | 835  822     <span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="s">)</span> = <span class="k">map</span> <span class="s">{</span><span class="q">s/ //g</span><span class="sc">;</span> <span class="i">$_</span><span class="s">}</span> <span class="k">unpack</span><span class="s">(</span><span class="q">"x6A5xA4A1A3xA1A4A1x3A8A8A8A6A6"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 836  823   <span class="s">}</span> | 
|  | 837  824   <span class="k">else</span> <span class="s">{</span> | 
|  | 838  825     <span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span> = <span class="k">map</span> <span class="s">{</span><span class="q">s/ //g</span><span class="sc">;</span> <span class="i">$_</span><span class="s">}</span> <span class="k">unpack</span><span class="s">(</span><span class="q">"x6A5xA4A1A3xA1A4A1x3A8A8A8A6A6x6A4A2A2"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 839  826   <span class="s">}</span> | 
|  | 840  827   <span class="k">return</span><span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span><span class="sc">;</span> | 
|  | 841  828 <span class="s">}</span> | 
|  | 842  829 | 
|  | 843  830 <span class="c"># Generate ATOM/HETATM record line...</span> | 
|  | 844 <a name="_GenerateAtomOrHetatmRecordLine-"></a> 831 <span class="k">sub </span><span class="m">_GenerateAtomOrHetatmRecordLine</span> <span class="s">{</span> | 
|  | 845  832   <span class="k">my</span><span class="s">(</span><span class="i">$RecordType</span><span class="cm">,</span> <span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 846  833   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="i">$AtomNameFormat</span><span class="s">)</span><span class="sc">;</span> | 
|  | 847  834 | 
|  | 848  835   <span class="k">if</span> <span class="s">(</span><span class="k">length</span><span class="s">(</span><span class="i">$AtomName</span><span class="s">)</span> >= <span class="n">4</span><span class="s">)</span> <span class="s">{</span> | 
|  | 849  836     <span class="c"># Left justified starting at column 13 for all atom names of length 4...</span> | 
|  | 850  837     <span class="i">$AtomNameFormat</span> = <span class="q">"%-4.4s"</span><span class="sc">;</span> | 
|  | 851  838   <span class="s">}</span> | 
|  | 852  839   <span class="k">elsif</span> <span class="s">(</span><span class="i">IsEmpty</span><span class="s">(</span><span class="i">$ElementSymbol</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 853  840     <span class="c"># No element symbol specified; just guess from atom name to cover most likely cases...</span> | 
|  | 854  841     <span class="i">$AtomNameFormat</span> = <span class="s">(</span><span class="i">$AtomName</span> =~ <span class="q">/^(C|N|O|S)/i</span><span class="s">)</span> ? <span class="q">" %-3.3s"</span> <span class="co">:</span> <span class="q">"%-4.4s"</span><span class="sc">;</span> | 
|  | 855  842   <span class="s">}</span> | 
|  | 856  843   <span class="k">else</span> <span class="s">{</span> | 
|  | 857  844     <span class="c"># Element symbol specified...</span> | 
|  | 858  845     <span class="k">if</span> <span class="s">(</span><span class="i">$ElementSymbol</span> =~ <span class="q">/^H$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 859  846       <span class="c"># Hydrogen atom name with <=3 characters is left justified starting at column 14;</span> | 
|  | 860  847       <span class="c"># Otherwise, left justified starting at column 13.</span> | 
|  | 861  848       <span class="i">$AtomNameFormat</span> = <span class="s">(</span><span class="k">length</span><span class="s">(</span><span class="i">$AtomName</span><span class="s">)</span> <= <span class="n">3</span><span class="s">)</span> ? <span class="q">" %-3.3s"</span> <span class="co">:</span> <span class="q">"%-4.4s"</span><span class="sc">;</span> | 
|  | 862  849     <span class="s">}</span> | 
|  | 863  850     <span class="k">else</span> <span class="s">{</span> | 
|  | 864  851       <span class="c"># Non-hydrogen atom name...</span> | 
|  | 865  852       <span class="i">$AtomNameFormat</span> = <span class="s">(</span><span class="k">length</span><span class="s">(</span><span class="i">$ElementSymbol</span><span class="s">)</span> == <span class="n">1</span><span class="s">)</span> ? <span class="q">" %-3.3s"</span> <span class="co">:</span> <span class="q">"%-4.4s"</span><span class="sc">;</span> | 
|  | 866  853     <span class="s">}</span> | 
|  | 867  854   <span class="s">}</span> | 
|  | 868  855 | 
|  | 869  856   <span class="i">$Line</span> = <span class="k">sprintf</span> <span class="q">"%-6.6s%5.5s ${AtomNameFormat}%1.1s%3.3s %1.1s%4.4s%1.1s   %8.8s%8.8s%8.8s%6.6s%6.6s      %-4.4s%2.2s%2.2s"</span><span class="cm">,</span> <span class="i">$RecordType</span><span class="cm">,</span> <span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="sc">;</span> | 
|  | 870  857 | 
|  | 871  858   <span class="k">return</span> <span class="i">$Line</span><span class="sc">;</span> | 
|  | 872  859 <span class="s">}</span> | 
|  | 873  860 | 
|  | 874  861 <span class="c"># Check record type...</span> | 
|  | 875 <a name="_IsRecordType-"></a> 862 <span class="k">sub </span><span class="m">_IsRecordType</span> <span class="s">{</span> | 
|  | 876  863   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="i">$SpecifiedType</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 877  864   <span class="k">my</span><span class="s">(</span><span class="i">$Type</span><span class="cm">,</span> <span class="i">$Status</span><span class="s">)</span><span class="sc">;</span> | 
|  | 878  865 | 
|  | 879  866   <span class="s">(</span><span class="i">$Type</span><span class="s">)</span> = <span class="k">map</span> <span class="s">{</span><span class="q">s/ //g</span><span class="sc">;</span> <span class="i">$_</span><span class="s">}</span> <span class="k">unpack</span><span class="s">(</span><span class="q">"A6"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 880  867 | 
|  | 881  868   <span class="i">$Status</span> = <span class="s">(</span><span class="i">$SpecifiedType</span> <span class="k">eq</span> <span class="i">$Type</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 882  869 | 
|  | 883  870   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 884  871 <span class="s">}</span> | 
|  | 885  872 | 
|  | 886  873 <span class="c"># Get record type...</span> | 
|  | 887 <a name="_GetRecordType-"></a> 874 <span class="k">sub </span><span class="m">_GetRecordType</span> <span class="s">{</span> | 
|  | 888  875   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 889  876   <span class="k">my</span><span class="s">(</span><span class="i">$Type</span><span class="s">)</span><span class="sc">;</span> | 
|  | 890  877 | 
|  | 891  878   <span class="s">(</span><span class="i">$Type</span><span class="s">)</span> = <span class="k">map</span> <span class="s">{</span><span class="q">s/ //g</span><span class="sc">;</span> <span class="i">$_</span><span class="s">}</span> <span class="k">unpack</span><span class="s">(</span><span class="q">"A6"</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span> | 
|  | 892  879 | 
|  | 893  880   <span class="k">return</span> <span class="i">$Type</span><span class="sc">;</span> | 
|  | 894  881 <span class="s">}</span> | 
|  | 895  882 | 
|  | 896  883 <span class="c"># Get chains and residues data using ATOM/HETATM records...</span> | 
|  | 897  884 <span class="c">#</span> | 
|  | 898 <a name="_GetChainsAndResiduesFromAtomHetatmRecords-"></a> 885 <span class="k">sub </span><span class="m">_GetChainsAndResiduesFromAtomHetatmRecords</span> <span class="s">{</span> | 
|  | 899  886   <span class="k">my</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$GetChainResiduesBeyondTERFlag</span><span class="cm">,</span> <span class="i">$GetRecordLinesFlag</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 900  887 | 
|  | 901  888   <span class="k">my</span><span class="s">(</span><span class="i">$LineCount</span><span class="cm">,</span> <span class="i">$TotalChainCount</span><span class="cm">,</span> <span class="i">$PreviousResidueNumber</span><span class="cm">,</span> <span class="i">$ChainCount</span><span class="cm">,</span> <span class="i">$DefaultChainID</span><span class="cm">,</span> <span class="i">$DefaultChainLabel</span><span class="cm">,</span> <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="cm">,</span> <span class="i">%ChainsDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 902  889 | 
|  | 903  890   <span class="c"># Do a quick chain count using TER record...</span> | 
|  | 904  891   <span class="i">$TotalChainCount</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 905  892   <span class="j">LINE:</span> <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 906  893     <span class="k">if</span> <span class="s">(</span><span class="i">IsEndmdlRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 907  894       <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 908  895     <span class="s">}</span> | 
|  | 909  896     <span class="k">if</span> <span class="s">(</span><span class="i">IsTerRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 910  897       <span class="i">$TotalChainCount</span>++<span class="sc">;</span> | 
|  | 911  898     <span class="s">}</span> | 
|  | 912  899   <span class="s">}</span> | 
|  | 913  900 | 
|  | 914  901   <span class="i">%ChainsDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 915  902   <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ChainIDs</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 916  903   <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 917  904   <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueNumbers</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 918  905   <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Lines</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 919  906   <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 920  907 | 
|  | 921  908   <span class="i">$LineCount</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 922  909   <span class="i">$ChainCount</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 923  910   <span class="i">$DefaultChainLabel</span> = <span class="q">'None'</span><span class="sc">;</span> | 
|  | 924  911   <span class="i">$DefaultChainID</span> = <span class="i">$DefaultChainLabel</span> . <span class="s">(</span><span class="i">$ChainCount</span> + <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 925  912   <span class="i">$PreviousResidueNumber</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 926  913 | 
|  | 927  914   <span class="j">LINE:</span> <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 928  915       <span class="i">$LineCount</span>++<span class="sc">;</span> | 
|  | 929  916       <span class="k">if</span> <span class="s">(</span><span class="i">IsTerRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 930  917         <span class="i">$DefaultChainID</span> = <span class="i">$DefaultChainLabel</span> . <span class="s">(</span><span class="i">$ChainCount</span> + <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 931  918         <span class="i">$ChainCount</span>++<span class="sc">;</span> | 
|  | 932  919         <span class="k">if</span> <span class="s">(</span><span class="i">$ChainCount</span> == <span class="i">$TotalChainCount</span><span class="s">)</span> <span class="s">{</span> | 
|  | 933  920           <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 934  921         <span class="s">}</span> | 
|  | 935  922         <span class="k">else</span> <span class="s">{</span> | 
|  | 936  923           <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 937  924         <span class="s">}</span> | 
|  | 938  925       <span class="s">}</span> | 
|  | 939  926       <span class="k">elsif</span> <span class="s">(</span>!<span class="s">(</span><span class="i">IsAtomRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span> || <span class="i">IsHetatmRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 940  927         <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 941  928       <span class="s">}</span> | 
|  | 942  929       <span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span> = <span class="i">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span> | 
|  | 943  930 | 
|  | 944  931       <span class="k">if</span> <span class="s">(</span><span class="i">IsEmpty</span><span class="s">(</span><span class="i">$ChainID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 945  932         <span class="i">$ChainID</span> = <span class="i">$DefaultChainID</span><span class="sc">;</span> | 
|  | 946  933       <span class="s">}</span> | 
|  | 947  934       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 948  935         <span class="c"># Data for existing chain...</span> | 
|  | 949  936         <span class="k">if</span> <span class="s">(</span><span class="i">$GetRecordLinesFlag</span><span class="s">)</span> <span class="s">{</span> | 
|  | 950  937           <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Lines</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">$RecordLine</span><span class="sc">;</span> | 
|  | 951  938         <span class="s">}</span> | 
|  | 952  939 | 
|  | 953  940         <span class="k">if</span> <span class="s">(</span><span class="i">$ResidueNumber</span> != <span class="i">$PreviousResidueNumber</span><span class="s">)</span> <span class="s">{</span> | 
|  | 954  941           <span class="c"># Next residue with in the chain...</span> | 
|  | 955  942           <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">$ResidueName</span><span class="sc">;</span> | 
|  | 956  943           <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueNumbers</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="sc">;</span> | 
|  | 957  944 | 
|  | 958  945           <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}{<span class="i">$ResidueName</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 959  946             <span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}{<span class="i">$ResidueName</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 960  947           <span class="s">}</span> | 
|  | 961  948           <span class="k">else</span> <span class="s">{</span> | 
|  | 962  949             <span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}{<span class="i">$ResidueName</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 963  950           <span class="s">}</span> | 
|  | 964  951           <span class="i">$PreviousResidueNumber</span> = <span class="i">$ResidueNumber</span><span class="sc">;</span> | 
|  | 965  952         <span class="s">}</span> | 
|  | 966  953       <span class="s">}</span> | 
|  | 967  954       <span class="k">else</span> <span class="s">{</span> | 
|  | 968  955         <span class="c"># Data for new chain...</span> | 
|  | 969  956         <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ChainIDs</span>}}<span class="cm">,</span> <span class="i">$ChainID</span><span class="sc">;</span> | 
|  | 970  957 | 
|  | 971  958         <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 972  959         <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">$ResidueName</span><span class="sc">;</span> | 
|  | 973  960 | 
|  | 974  961         <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueNumbers</span>}{<span class="i">$ChainID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 975  962         <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueNumbers</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="sc">;</span> | 
|  | 976  963 | 
|  | 977  964         <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Lines</span>}{<span class="i">$ChainID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 978  965         <span class="k">if</span> <span class="s">(</span><span class="i">$GetRecordLinesFlag</span><span class="s">)</span> <span class="s">{</span> | 
|  | 979  966           <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Lines</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">$RecordLine</span><span class="sc">;</span> | 
|  | 980  967         <span class="s">}</span> | 
|  | 981  968 | 
|  | 982  969         <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 983  970         <span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}{<span class="i">$ResidueName</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 984  971         <span class="i">$PreviousResidueNumber</span> = <span class="i">$ResidueNumber</span><span class="sc">;</span> | 
|  | 985  972       <span class="s">}</span> | 
|  | 986  973   <span class="s">}</span> | 
|  | 987  974   <span class="k">if</span> <span class="s">(</span>!<span class="i">$GetChainResiduesBeyondTERFlag</span><span class="s">)</span> <span class="s">{</span> | 
|  | 988  975     <span class="k">return</span> \<span class="i">%ChainsDataMap</span><span class="sc">;</span> | 
|  | 989  976   <span class="s">}</span> | 
|  | 990  977   <span class="c"># Look for any HETATM residues specified outside TER records which could belong to an existing chain...</span> | 
|  | 991  978   <span class="k">my</span><span class="s">(</span><span class="i">$LineIndex</span><span class="cm">,</span> <span class="i">$PreviousChainID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 992  979   <span class="i">$PreviousChainID</span> = <span class="q">''</span><span class="sc">;</span> | 
|  | 993  980   <span class="i">$PreviousResidueNumber</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 994  981   <span class="j">LINE:</span> <span class="k">for</span> <span class="i">$LineIndex</span> <span class="s">(</span><span class="s">(</span><span class="i">$LineCount</span> - <span class="n">1</span><span class="s">)</span> .. <span class="i">$#</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 995  982     <span class="i">$RecordLine</span> = <span class="i">$PDBRecordLinesRef</span>->[<span class="i">$LineIndex</span>]<span class="sc">;</span> | 
|  | 996  983     <span class="k">if</span> <span class="s">(</span><span class="i">IsEndmdlRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 997  984       <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 998  985     <span class="s">}</span> | 
|  | 999  986     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">IsAtomRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span> || <span class="i">IsHetatmRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1000  987       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 1001  988     <span class="s">}</span> | 
|  | 1002  989     <span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="cm">,</span> <span class="i">$Occupancy</span><span class="cm">,</span> <span class="i">$TemperatureFactor</span><span class="cm">,</span> <span class="i">$SegmentID</span><span class="cm">,</span> <span class="i">$ElementSymbol</span><span class="cm">,</span> <span class="i">$AtomCharge</span><span class="s">)</span> = <span class="i">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1003  990     <span class="k">if</span> <span class="s">(</span><span class="i">IsEmpty</span><span class="s">(</span><span class="i">$ChainID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1004  991       <span class="c"># Ignore the chains with no ids...</span> | 
|  | 1005  992       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 1006  993     <span class="s">}</span> | 
|  | 1007  994     <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span><span class="s">(</span><span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1008  995       <span class="c"># Don't collect any new chains after TER record...</span> | 
|  | 1009  996       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 1010  997     <span class="s">}</span> | 
|  | 1011  998     <span class="k">if</span> <span class="s">(</span><span class="i">$GetRecordLinesFlag</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1012  999       <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Lines</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">$RecordLine</span><span class="sc">;</span> | 
|  | 1013 1000     <span class="s">}</span> | 
|  | 1014 1001     <span class="k">if</span> <span class="s">(</span><span class="i">$ResidueNumber</span> != <span class="i">$PreviousResidueNumber</span> || <span class="i">$ChainID</span> <span class="k">ne</span> <span class="i">$PreviousChainID</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1015 1002 | 
|  | 1016 1003       <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">$ResidueName</span><span class="sc">;</span> | 
|  | 1017 1004       <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueNumbers</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="sc">;</span> | 
|  | 1018 1005 | 
|  | 1019 1006       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}{<span class="i">$ResidueName</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1020 1007         <span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}{<span class="i">$ResidueName</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 1021 1008       <span class="s">}</span> | 
|  | 1022 1009       <span class="k">else</span> <span class="s">{</span> | 
|  | 1023 1010         <span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}{<span class="i">$ResidueName</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 1024 1011       <span class="s">}</span> | 
|  | 1025 1012       <span class="i">$PreviousChainID</span> = <span class="i">$ChainID</span><span class="sc">;</span> | 
|  | 1026 1013       <span class="i">$PreviousResidueNumber</span> = <span class="i">$ResidueNumber</span><span class="sc">;</span> | 
|  | 1027 1014     <span class="s">}</span> | 
|  | 1028 1015   <span class="s">}</span> | 
|  | 1029 1016   <span class="k">return</span> \<span class="i">%ChainsDataMap</span><span class="sc">;</span> | 
|  | 1030 1017 <span class="s">}</span> | 
|  | 1031 1018 | 
|  | 1032 1019 <span class="c"># Get chains and residues data using SEQRES records...</span> | 
|  | 1033 1020 <span class="c">#</span> | 
|  | 1034 <a name="_GetChainsAndResiduesFromSeqresRecords-"></a>1021 <span class="k">sub </span><span class="m">_GetChainsAndResiduesFromSeqresRecords</span> <span class="s">{</span> | 
|  | 1035 1022   <span class="k">my</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1036 1023 | 
|  | 1037 1024   <span class="k">my</span><span class="s">(</span><span class="i">$ChainCount</span><span class="cm">,</span> <span class="i">$DefaultChainLabel</span><span class="cm">,</span> <span class="i">$DefaultChainID</span><span class="cm">,</span> <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$RecordSerialNumber</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$NumOfResidues</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$ResidueNamesString</span><span class="cm">,</span> <span class="i">@ResidueNamesList</span><span class="cm">,</span> <span class="i">%ChainsDataMap</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1038 1025 | 
|  | 1039 1026   <span class="i">%ChainsDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1040 1027   <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ChainIDs</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1041 1028   <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1042 1029   <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueNumbers</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1043 1030   <span class="i">%</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1044 1031 | 
|  | 1045 1032   <span class="i">$ChainCount</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1046 1033   <span class="i">$DefaultChainLabel</span> = <span class="q">'None'</span><span class="sc">;</span> | 
|  | 1047 1034   <span class="i">$DefaultChainID</span> = <span class="i">$DefaultChainLabel</span> . <span class="s">(</span><span class="i">$ChainCount</span> + <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1048 1035 | 
|  | 1049 1036   <span class="j">LINE:</span> <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1050 1037       <span class="k">if</span> <span class="s">(</span>!<span class="i">IsSeqresRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1051 1038         <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span> | 
|  | 1052 1039       <span class="s">}</span> | 
|  | 1053 1040       <span class="s">(</span><span class="i">$RecordSerialNumber</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$NumOfResidues</span><span class="cm">,</span> <span class="i">$ResidueNamesString</span><span class="s">)</span> = <span class="i">ParseSeqresRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1054 1041       <span class="k">if</span> <span class="s">(</span><span class="i">$RecordSerialNumber</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1055 1042         <span class="c"># Indicates start of a new chain...</span> | 
|  | 1056 1043         <span class="i">$DefaultChainID</span> = <span class="i">$DefaultChainLabel</span> . <span class="s">(</span><span class="i">$ChainCount</span> + <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1057 1044         <span class="i">$ChainCount</span>++<span class="sc">;</span> | 
|  | 1058 1045       <span class="s">}</span> | 
|  | 1059 1046       <span class="k">if</span> <span class="s">(</span><span class="i">IsEmpty</span><span class="s">(</span><span class="i">$ChainID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1060 1047         <span class="i">$ChainID</span> = <span class="i">$DefaultChainID</span><span class="sc">;</span> | 
|  | 1061 1048       <span class="s">}</span> | 
|  | 1062 1049       <span class="c"># Process the residues...</span> | 
|  | 1063 1050       <span class="i">@ResidueNamesList</span> = <span class="k">split</span> <span class="q">/[ ]+/</span><span class="cm">,</span> <span class="i">$ResidueNamesString</span><span class="sc">;</span> | 
|  | 1064 1051 | 
|  | 1065 1052       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1066 1053         <span class="c"># Data for existing chain...</span> | 
|  | 1067 1054         <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">@ResidueNamesList</span><span class="sc">;</span> | 
|  | 1068 1055       <span class="s">}</span> | 
|  | 1069 1056       <span class="k">else</span> <span class="s">{</span> | 
|  | 1070 1057         <span class="c"># Data for new chain...</span> | 
|  | 1071 1058         <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">ChainIDs</span>}}<span class="cm">,</span> <span class="i">$ChainID</span><span class="sc">;</span> | 
|  | 1072 1059         <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1073 1060         <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainsDataMap</span>{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}}<span class="cm">,</span> <span class="i">@ResidueNamesList</span><span class="sc">;</span> | 
|  | 1074 1061       <span class="s">}</span> | 
|  | 1075 1062 | 
|  | 1076 1063       <span class="c"># Setup residue count...</span> | 
|  | 1077 1064       <span class="k">for</span> <span class="i">$ResidueName</span> <span class="s">(</span><span class="i">@ResidueNamesList</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1078 1065         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}{<span class="i">$ResidueName</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1079 1066           <span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}{<span class="i">$ResidueName</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 1080 1067         <span class="s">}</span> | 
|  | 1081 1068         <span class="k">else</span> <span class="s">{</span> | 
|  | 1082 1069           <span class="i">$ChainsDataMap</span>{<span class="w">ResidueCount</span>}{<span class="i">$ChainID</span>}{<span class="i">$ResidueName</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 1083 1070         <span class="s">}</span> | 
|  | 1084 1071       <span class="s">}</span> | 
|  | 1085 1072   <span class="s">}</span> | 
|  | 1086 1073   <span class="k">return</span> \<span class="i">%ChainsDataMap</span><span class="sc">;</span> | 
|  | 1087 1074 <span class="s">}</span> | 
|  | 1088 1075 | 
|  | 1089 <a name="EOF-"></a></pre> | 
|  | 1090 <p> </p> | 
|  | 1091 <br /> | 
|  | 1092 <center> | 
|  | 1093 <img src="../../../images/h2o2.png"> | 
|  | 1094 </center> | 
|  | 1095 </body> | 
|  | 1096 </html> |