comparison mayachemtools/docs/modules/html/code/PDBFileUtil.html @ 0:73ae111cf86f draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 11:55:01 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:73ae111cf86f
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 &lt;msud@san.rr.com&gt;</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 &lt;http://www.gnu.org/licenses/&gt; 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">=&gt;</span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span><span class="s">)</span><span class="sc">;</span>
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">&quot;$PDBFile&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Can&#39;t open $PDBFile: $!\n&quot;</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">&#39;ATOM&#39;</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">&#39;CONECT&#39;</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">&#39;HEADER&#39;</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">&#39;HETATM&#39;</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">&#39;SEQRES&#39;</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">&#39;MODEL&#39;</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">&#39;ENDMDL&#39;</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">&#39;TER&#39;</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">&#39;MASTER&#39;</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">&#39;&#39;</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> &amp;&amp; <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>-&gt;{<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 &#39;None&#39; 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">&#39;AtomAndHetatm&#39;</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">&#39;&#39;</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> &lt; <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> &lt; <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> &lt; <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> &gt; <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> &gt; <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> &gt; <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">&quot;$PDBFile&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Can&#39;t open $PDBFile: $!\n&quot;</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">&#39;EXPDTA&#39;</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">&#39;&#39;</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> &lt;= <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">&quot;x10A40A9&quot;</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">&quot;x10A40A9x3A4&quot;</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">&quot;Created using MayaChemTools&quot;</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">&quot;HEADER %-40.40s%9.9s %4.4s&quot;</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">&#39;ATOM&#39;</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">&#39;HETATM&#39;</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 &quot;EXPDTA&quot;</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">&quot;x8A2A60&quot;</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 &quot;REMARK&quot;</span>
595 582 <span class="c"># 10 LString(1) &quot;2&quot;</span>
596 583 <span class="c"># 12 - 22 LString(11) &quot;RESOLUTION.&quot;</span>
597 584 <span class="c"># 23 - 27 Real(5.2) resolution Resolution.</span>
598 585 <span class="c"># 29 - 38 LString(10) &quot;ANGSTROMS.&quot;</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 &quot;REMARK&quot;</span>
603 590 <span class="c"># 10 LString(1) &quot;2&quot;</span>
604 591 <span class="c"># 12 - 38 LString(28) &quot;RESOLUTION. NOT APPLICABLE.&quot;</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">&quot;NOT APPLICABLE&quot;</span><span class="cm">,</span> <span class="q">&quot;&quot;</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">&quot;x22A5x1A10&quot;</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 &quot;SEQRES&quot;</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">&quot;x8A2x1A1x1A4x2A51&quot;</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 &quot;CONECT&quot;</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">&quot;x6A5A5A5A5A5A5A5A5A5A5A5&quot;</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">&quot;CONECT%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s%5.5s&quot;</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 &quot;TER &quot;</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">&#39;&#39;</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> &lt;= <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">&quot;x6A5&quot;</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> &lt;= <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">&quot;x6A5x6A3&quot;</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">&quot;x6A5x6A3xA1A4A1&quot;</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">&#39;&#39;</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">&quot;TER %5.5s %-3.3s %1.1s%4.4s%1.1s&quot;</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 &quot;MASTER&quot;</span>
759 746 <span class="c"># 11 - 15 Number of REMARK records</span>
760 747 <span class="c"># 16 - 20 &quot;0&quot;</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">&quot;x6x4A5x5A5A5A5A5A5A5A5A5A5A5&quot;</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">&#39;END &#39;</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">&#39;&#39;</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> &lt;= <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">&quot;x6A5xA4A1A3xA1A4A1x3A8A8A8A6A6&quot;</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">&quot;x6A5xA4A1A3xA1A4A1x3A8A8A8A6A6x6A4A2A2&quot;</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> &gt;= <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">&quot;%-4.4s&quot;</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">&quot; %-3.3s&quot;</span> <span class="co">:</span> <span class="q">&quot;%-4.4s&quot;</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 &lt;=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> &lt;= <span class="n">3</span><span class="s">)</span> ? <span class="q">&quot; %-3.3s&quot;</span> <span class="co">:</span> <span class="q">&quot;%-4.4s&quot;</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">&quot; %-3.3s&quot;</span> <span class="co">:</span> <span class="q">&quot;%-4.4s&quot;</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">&quot;%-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&quot;</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">&quot;A6&quot;</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">&quot;A6&quot;</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">&#39;None&#39;</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">&#39;&#39;</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>-&gt;[<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&#39;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">&#39;None&#39;</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>&nbsp;</p>
1091 <br />
1092 <center>
1093 <img src="../../../images/h2o2.png">
1094 </center>
1095 </body>
1096 </html>