view docs/scripts/html/code/ExtractFromPDBFiles.html @ 0:4816e4a8ae95 draft default tip

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 09:23:18 -0500
parents
children
line wrap: on
line source

<html>
<head>
<title>MayaChemTools:Code:ExtractFromPDBFiles.pl</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
</head>
<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
<br/>
<center>
<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
</center>
<br/>
<pre>
   1 #!/usr/bin/perl -w
   2 <span class="c">#</span>
   3 <span class="c"># $RCSfile: ExtractFromPDBFiles.pl,v $</span>
   4 <span class="c"># $Date: 2015/02/28 20:46:19 $</span>
   5 <span class="c"># $Revision: 1.39 $</span>
   6 <span class="c">#</span>
   7 <span class="c"># Author: Manish Sud &lt;msud@san.rr.com&gt;</span>
   8 <span class="c">#</span>
   9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
  10 <span class="c">#</span>
  11 <span class="c"># This file is part of MayaChemTools.</span>
  12 <span class="c">#</span>
  13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
  14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
  15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
  16 <span class="c"># later version.</span>
  17 <span class="c">#</span>
  18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
  19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
  20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
  21 <span class="c"># details.</span>
  22 <span class="c">#</span>
  23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
  24 <span class="c"># along with MayaChemTools; if not, see &lt;http://www.gnu.org/licenses/&gt; or</span>
  25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
  26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
  27 <span class="c">#</span>
  28 
  29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
  30 <span class="k">use</span> <span class="w">FindBin</span><span class="sc">;</span> <span class="k">use</span> <span class="w">lib</span> <span class="q">&quot;$FindBin::Bin/../lib&quot;</span><span class="sc">;</span>
  31 <span class="k">use</span> <span class="w">Getopt::Long</span><span class="sc">;</span>
  32 <span class="k">use</span> <span class="w">File::Basename</span><span class="sc">;</span>
  33 <span class="k">use</span> <span class="w">Text::ParseWords</span><span class="sc">;</span>
  34 <span class="k">use</span> <span class="w">Benchmark</span><span class="sc">;</span>
  35 <span class="k">use</span> <span class="w">FileUtil</span><span class="sc">;</span>
  36 <span class="k">use</span> <span class="w">TextUtil</span><span class="sc">;</span>
  37 <span class="k">use</span> <span class="w">PDBFileUtil</span><span class="sc">;</span>
  38 <span class="k">use</span> <span class="w">AminoAcids</span><span class="sc">;</span>
  39 <span class="k">use</span> <span class="w">SequenceFileUtil</span><span class="sc">;</span>
  40 
  41 <span class="k">my</span><span class="s">(</span><span class="i">$ScriptName</span><span class="cm">,</span> <span class="i">%Options</span><span class="cm">,</span> <span class="i">$StartTime</span><span class="cm">,</span> <span class="i">$EndTime</span><span class="cm">,</span> <span class="i">$TotalTime</span><span class="s">)</span><span class="sc">;</span>
  42 
  43 <span class="c"># Autoflush STDOUT</span>
  44 <span class="i">$|</span> = <span class="n">1</span><span class="sc">;</span>
  45 
  46 <span class="c"># Starting message...</span>
  47 <span class="i">$ScriptName</span> = <span class="i">basename</span><span class="s">(</span><span class="i">$0</span><span class="s">)</span><span class="sc">;</span>
  48 <span class="k">print</span> <span class="q">&quot;\n$ScriptName: Starting...\n\n&quot;</span><span class="sc">;</span>
  49 <span class="i">$StartTime</span> = <span class="w">new</span> <span class="w">Benchmark</span><span class="sc">;</span>
  50 
  51 <span class="c"># Get the options and setup script...</span>
  52 <span class="i">SetupScriptUsage</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  53 <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">help</span>} || <span class="i">@ARGV</span> &lt; <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
  54   <span class="k">die</span> <span class="i">GetUsageFromPod</span><span class="s">(</span><span class="q">&quot;$FindBin::Bin/$ScriptName&quot;</span><span class="s">)</span><span class="sc">;</span>
  55 <span class="s">}</span>
  56 
  57 <span class="k">my</span><span class="s">(</span><span class="i">@PDBFilesList</span><span class="s">)</span><span class="sc">;</span>
  58 <span class="i">@PDBFilesList</span> = <span class="i">ExpandFileNames</span><span class="s">(</span>\<span class="i">@ARGV</span><span class="cm">,</span> <span class="q">&quot;pdb&quot;</span><span class="s">)</span><span class="sc">;</span>
  59 
  60 <span class="c"># Process options...</span>
  61 <span class="k">print</span> <span class="q">&quot;Processing options...\n&quot;</span><span class="sc">;</span>
  62 <span class="k">my</span><span class="s">(</span><span class="i">%OptionsInfo</span><span class="s">)</span><span class="sc">;</span>
  63 <span class="i">ProcessOptions</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  64 
  65 <span class="c"># Setup information about input files...</span>
  66 <span class="k">print</span> <span class="q">&quot;Checking input PDB file(s)...\n&quot;</span><span class="sc">;</span>
  67 <span class="k">my</span><span class="s">(</span><span class="i">%PDBFilesInfo</span><span class="s">)</span><span class="sc">;</span>
  68 <span class="i">RetrievePDBFilesInfo</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  69 
  70 <span class="c"># Process input files..</span>
  71 <span class="k">my</span><span class="s">(</span><span class="i">$FileIndex</span><span class="s">)</span><span class="sc">;</span>
  72 <span class="k">if</span> <span class="s">(</span><span class="i">@PDBFilesList</span> &gt; <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
  73   <span class="k">print</span> <span class="q">&quot;\nProcessing PDB files...\n&quot;</span><span class="sc">;</span>
  74 <span class="s">}</span>
  75 <span class="k">for</span> <span class="i">$FileIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#PDBFilesList</span><span class="s">)</span> <span class="s">{</span>
  76   <span class="k">if</span> <span class="s">(</span><span class="i">$PDBFilesInfo</span>{<span class="w">FileOkay</span>}[<span class="i">$FileIndex</span>]<span class="s">)</span> <span class="s">{</span>
  77     <span class="k">print</span> <span class="q">&quot;\nProcessing file $PDBFilesList[$FileIndex]...\n&quot;</span><span class="sc">;</span>
  78     <span class="i">ExtractFromPDBFiles</span><span class="s">(</span><span class="i">$FileIndex</span><span class="s">)</span><span class="sc">;</span>
  79   <span class="s">}</span>
  80 <span class="s">}</span>
  81 <span class="k">print</span> <span class="q">&quot;\n$ScriptName:Done...\n\n&quot;</span><span class="sc">;</span>
  82 
  83 <span class="i">$EndTime</span> = <span class="w">new</span> <span class="w">Benchmark</span><span class="sc">;</span>
  84 <span class="i">$TotalTime</span> = <span class="w">timediff</span> <span class="s">(</span><span class="i">$EndTime</span><span class="cm">,</span> <span class="i">$StartTime</span><span class="s">)</span><span class="sc">;</span>
  85 <span class="k">print</span> <span class="q">&quot;Total time: &quot;</span><span class="cm">,</span> <span class="i">timestr</span><span class="s">(</span><span class="i">$TotalTime</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
  86 
  87 <span class="c">###############################################################################</span>
  88 
  89 <span class="c"># Extract appropriate information...</span>
<a name="ExtractFromPDBFiles-"></a>  90 <span class="k">sub </span><span class="m">ExtractFromPDBFiles</span> <span class="s">{</span>
  91   <span class="k">my</span><span class="s">(</span><span class="i">$FileIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
  92   <span class="k">my</span><span class="s">(</span><span class="i">$PDBFile</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
  93 
  94   <span class="c"># Get PDB data...</span>
  95   <span class="i">$PDBFile</span> = <span class="i">$PDBFilesList</span>[<span class="i">$FileIndex</span>]<span class="sc">;</span>
  96   <span class="i">$PDBRecordLinesRef</span> = <span class="i">ReadPDBFile</span><span class="s">(</span><span class="i">$PDBFile</span><span class="s">)</span><span class="sc">;</span>
  97 
  98   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/Chains/i</span><span class="s">)</span> <span class="s">{</span>
  99     <span class="i">ExtractChains</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 100   <span class="s">}</span>
 101   <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/Sequences/i</span><span class="s">)</span> <span class="s">{</span>
 102     <span class="i">ExtractSequences</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 103   <span class="s">}</span>
 104   <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^(Atoms|CAlphas|AtomNums|AtomsRange|AtomNames)$/i</span><span class="s">)</span> <span class="s">{</span>
 105     <span class="i">ExtractByAtoms</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 106   <span class="s">}</span>
 107   <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^(ResidueNums|ResiduesRange|ResidueNames)$/i</span><span class="s">)</span> <span class="s">{</span>
 108     <span class="i">ExtractByResidues</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 109   <span class="s">}</span>
 110   <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/Distance/i</span><span class="s">)</span> <span class="s">{</span>
 111     <span class="i">ExtractByDistance</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 112   <span class="s">}</span>
 113   <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/NonWater/i</span><span class="s">)</span> <span class="s">{</span>
 114     <span class="i">ExtractNonWaterRecords</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 115   <span class="s">}</span>
 116   <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/NonHydrogens/i</span><span class="s">)</span> <span class="s">{</span>
 117     <span class="i">ExtractNonHydrogenRecords</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 118   <span class="s">}</span>
 119 <span class="s">}</span>
 120 
 121 <span class="c"># Extract chains and generate new PDB files...</span>
 122 <span class="c">#</span>
<a name="ExtractChains-"></a> 123 <span class="k">sub </span><span class="m">ExtractChains</span> <span class="s">{</span>
 124   <span class="k">my</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 125   <span class="k">my</span><span class="s">(</span><span class="i">$ChainIndex</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ChainLabel</span><span class="cm">,</span> <span class="i">$PDBFileName</span><span class="cm">,</span> <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$ChainsAndResiduesInfoRef</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">$ResidueName</span><span class="cm">,</span> <span class="i">$AtomChainID</span><span class="cm">,</span> <span class="i">$ResidueNumber</span><span class="cm">,</span> <span class="i">$AlternateLocation</span><span class="cm">,</span> <span class="i">$InsertionCode</span><span class="cm">,</span> <span class="i">$ConectRecordLinesRef</span><span class="cm">,</span> <span class="i">%ChainAtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 126 
 127   <span class="c"># Get chains and residues data...</span>
 128   <span class="i">$ChainsAndResiduesInfoRef</span> = <span class="i">GetChainsAndResidues</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="q">&#39;AtomAndHetatm&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 129 
 130   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">CombineChains</span>}<span class="s">)</span> <span class="s">{</span>
 131     <span class="i">$PDBFileName</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$FileIndex</span>][<span class="n">0</span>]<span class="sc">;</span>
 132     <span class="k">print</span> <span class="q">&quot;Generating PDBFileName file $PDBFileName...\n&quot;</span><span class="sc">;</span>
 133 
 134     <span class="k">open</span> <span class="w">OUTFILE</span><span class="cm">,</span> <span class="q">&quot;&gt;$PDBFileName&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Can&#39;t open $PDBFileName: $! \n&quot;</span><span class="sc">;</span>
 135 
 136     <span class="c"># Write out header and other older recors...</span>
 137     <span class="i">WriteHeaderAndOlderRecords</span><span class="s">(</span>\<span class="i">*OUTFILE</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 138   <span class="s">}</span>
 139 
 140   <span class="k">for</span> <span class="i">$ChainIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}[<span class="i">$FileIndex</span>]}<span class="s">)</span> <span class="s">{</span>
 141     <span class="i">$ChainID</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}[<span class="i">$FileIndex</span>][<span class="i">$ChainIndex</span>]<span class="sc">;</span>
 142     <span class="i">$ChainLabel</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">ChainLabels</span>}[<span class="i">$FileIndex</span>][<span class="i">$ChainIndex</span>]<span class="sc">;</span>
 143 
 144     <span class="k">if</span> <span class="s">(</span>!<span class="i">$OptionsInfo</span>{<span class="w">CombineChains</span>}<span class="s">)</span> <span class="s">{</span>
 145       <span class="i">$PDBFileName</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$FileIndex</span>][<span class="i">$ChainIndex</span>]<span class="sc">;</span>
 146       <span class="k">print</span> <span class="q">&quot;Generating PDBFileName file $PDBFileName...\n&quot;</span><span class="sc">;</span>
 147 
 148       <span class="k">open</span> <span class="w">OUTFILE</span><span class="cm">,</span> <span class="q">&quot;&gt;$PDBFileName&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Can&#39;t open $PDBFileName: $! \n&quot;</span><span class="sc">;</span>
 149 
 150       <span class="c"># Write out header and other older recors...</span>
 151       <span class="i">WriteHeaderAndOlderRecords</span><span class="s">(</span>\<span class="i">*OUTFILE</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 152     <span class="s">}</span>
 153 
 154     <span class="c"># Write out ATOM/HETATM line for chain and collect all ATOM/HETATM serial numbers</span>
 155     <span class="c"># for writing out appropriate CONECT records...</span>
 156     <span class="i">%ChainAtomNumbersMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 157     <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ChainsAndResiduesInfoRef</span>-&gt;{<span class="w">Lines</span>}{<span class="i">$ChainID</span>}}<span class="s">)</span> <span class="s">{</span>
 158       <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 159       <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">$AtomChainID</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">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span>
 160       <span class="i">$AtomNumber</span> = <span class="k">int</span> <span class="i">$AtomNumber</span><span class="sc">;</span>
 161       <span class="i">$ChainAtomNumbersMap</span>{<span class="i">$AtomNumber</span>} = <span class="i">$AtomName</span><span class="sc">;</span>
 162     <span class="s">}</span>
 163     <span class="c"># Write out TER record using information from last chain record...</span>
 164     <span class="i">$AtomNumber</span> += <span class="n">1</span><span class="sc">;</span>
 165     <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateTerRecordLine</span><span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">$AtomChainID</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="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 166 
 167     <span class="c"># Write out CONECT records...</span>
 168     <span class="i">$ConectRecordLinesRef</span> = <span class="i">GetConectRecordLines</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> \<span class="i">%ChainAtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 169 
 170     <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConectRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span>
 171       <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 172     <span class="s">}</span>
 173 
 174     <span class="k">if</span> <span class="s">(</span>!<span class="i">$OptionsInfo</span>{<span class="w">CombineChains</span>}<span class="s">)</span> <span class="s">{</span>
 175       <span class="c"># Write out END record...</span>
 176       <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateEndRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 177 
 178       <span class="k">close</span> <span class="w">OUTFILE</span><span class="sc">;</span>
 179     <span class="s">}</span>
 180   <span class="s">}</span>
 181 
 182   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">CombineChains</span>}<span class="s">)</span> <span class="s">{</span>
 183     <span class="c"># Write out END record...</span>
 184     <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateEndRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 185 
 186     <span class="k">close</span> <span class="w">OUTFILE</span><span class="sc">;</span>
 187   <span class="s">}</span>
 188 
 189 <span class="s">}</span>
 190 
 191 <span class="c"># Extract sequences for individual chains or combine all the chains...</span>
<a name="ExtractSequences-"></a> 192 <span class="k">sub </span><span class="m">ExtractSequences</span> <span class="s">{</span>
 193   <span class="k">my</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 194   <span class="k">my</span><span class="s">(</span><span class="i">$ChainIndex</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ChainLabel</span><span class="cm">,</span> <span class="i">$SequenceFileName</span><span class="cm">,</span> <span class="i">$Residue</span><span class="cm">,</span> <span class="i">$ResidueCode</span><span class="cm">,</span> <span class="i">$StandardResidue</span><span class="cm">,</span> <span class="i">$ChainSequence</span><span class="cm">,</span> <span class="i">$WrappedChainSequence</span><span class="cm">,</span> <span class="i">$ChainSequenceID</span><span class="cm">,</span> <span class="i">$ChainsAndResiduesInfoRef</span><span class="cm">,</span> <span class="i">$ChainResiduesRef</span><span class="cm">,</span> <span class="i">%ChainSequencesDataMap</span><span class="s">)</span><span class="sc">;</span>
 195 
 196   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">SequenceRecordSource</span>} =~ <span class="q">/^SeqRes$/i</span><span class="s">)</span> <span class="s">{</span>
 197     <span class="i">$ChainsAndResiduesInfoRef</span> = <span class="i">GetChainsAndResidues</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="q">&#39;SeqRes&#39;</span><span class="s">)</span><span class="sc">;</span>
 198   <span class="s">}</span>
 199   <span class="k">else</span> <span class="s">{</span>
 200     <span class="i">$ChainsAndResiduesInfoRef</span> = <span class="i">GetChainsAndResidues</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 201   <span class="s">}</span>
 202 
 203   <span class="c"># Generate sequence data for all the chains...</span>
 204   <span class="i">%ChainSequencesDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 205   <span class="i">@</span>{<span class="i">$ChainSequencesDataMap</span>{<span class="w">IDs</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 206   <span class="i">%</span>{<span class="i">$ChainSequencesDataMap</span>{<span class="w">Sequence</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 207   <span class="i">%</span>{<span class="i">$ChainSequencesDataMap</span>{<span class="w">Description</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 208 
 209   <span class="k">for</span> <span class="i">$ChainIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}[<span class="i">$FileIndex</span>]}<span class="s">)</span> <span class="s">{</span>
 210     <span class="i">$ChainID</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}[<span class="i">$FileIndex</span>][<span class="i">$ChainIndex</span>]<span class="sc">;</span>
 211     <span class="i">$ChainLabel</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">ChainLabels</span>}[<span class="i">$FileIndex</span>][<span class="i">$ChainIndex</span>]<span class="sc">;</span>
 212 
 213     <span class="c"># Setup sequence ID...</span>
 214     <span class="i">$ChainSequenceID</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">ChainSequenceIDs</span>}[<span class="i">$FileIndex</span>][<span class="i">$ChainIndex</span>]<span class="sc">;</span>
 215     <span class="k">push</span> <span class="i">@</span>{<span class="i">$ChainSequencesDataMap</span>{<span class="w">IDs</span>}}<span class="cm">,</span> <span class="i">$ChainSequenceID</span><span class="sc">;</span>
 216     <span class="i">$ChainSequencesDataMap</span>{<span class="w">Description</span>}{<span class="i">$ChainID</span>} = <span class="i">$ChainSequenceID</span><span class="sc">;</span>
 217 
 218     <span class="c"># Collect sequence data for the chain...</span>
 219     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">SequenceRecordSource</span>} =~ <span class="q">/^SeqRes/i</span><span class="s">)</span> <span class="s">{</span>
 220       <span class="i">$ChainResiduesRef</span> = \<span class="i">@</span>{<span class="i">$ChainsAndResiduesInfoRef</span>-&gt;{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}}<span class="sc">;</span>
 221     <span class="s">}</span>
 222     <span class="k">else</span> <span class="s">{</span>
 223       <span class="i">$ChainResiduesRef</span> = \<span class="i">@</span>{<span class="i">$ChainsAndResiduesInfoRef</span>-&gt;{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}}<span class="sc">;</span>
 224     <span class="s">}</span>
 225     <span class="c"># Setup sequence data...</span>
 226     <span class="i">$ChainSequence</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
 227     <span class="j">RESIDUE:</span> <span class="k">for</span> <span class="i">$Residue</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ChainResiduesRef</span>}<span class="s">)</span> <span class="s">{</span>
 228       <span class="s">(</span><span class="i">$ResidueCode</span><span class="cm">,</span> <span class="i">$StandardResidue</span><span class="s">)</span> = <span class="i">GetResidueCode</span><span class="s">(</span><span class="i">$Residue</span><span class="s">)</span><span class="sc">;</span>
 229       <span class="k">if</span> <span class="s">(</span>!<span class="i">$StandardResidue</span><span class="s">)</span> <span class="s">{</span>
 230         <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">KeepNonStandardSequences</span>}<span class="s">)</span> <span class="s">{</span>
 231           <span class="i">$ResidueCode</span> = <span class="i">$OptionsInfo</span>{<span class="w">NonStandardSequenceCode</span>}<span class="sc">;</span>
 232           <span class="k">warn</span> <span class="q">&quot;Warning: Keeping nonstandard residue $Residue in $ChainLabel...\n&quot;</span><span class="sc">;</span>
 233         <span class="s">}</span>
 234         <span class="k">else</span> <span class="s">{</span>
 235           <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring nonstandard residue $Residue in $ChainLabel...\n&quot;</span><span class="sc">;</span>
 236           <span class="k">next</span> <span class="j">RESIDUE</span><span class="sc">;</span>
 237         <span class="s">}</span>
 238       <span class="s">}</span>
 239       <span class="i">$ChainSequence</span> .= <span class="i">$ResidueCode</span><span class="sc">;</span>
 240     <span class="s">}</span>
 241     <span class="i">$ChainSequencesDataMap</span>{<span class="w">Sequence</span>}{<span class="i">$ChainID</span>} = <span class="i">$ChainSequence</span><span class="sc">;</span>
 242 
 243   <span class="s">}</span>
 244 
 245   <span class="c"># Write out the sequence files...</span>
 246   <span class="k">my</span><span class="s">(</span><span class="i">$SequenceID</span><span class="cm">,</span> <span class="i">$SequenceDescription</span><span class="cm">,</span> <span class="i">$Sequence</span><span class="cm">,</span> <span class="i">%SequencesDataMap</span> <span class="s">)</span><span class="sc">;</span>
 247   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">CombineChainSequences</span>}<span class="s">)</span> <span class="s">{</span>
 248     <span class="c"># Combine all the chain sequences...</span>
 249     <span class="i">$Sequence</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
 250     <span class="k">for</span> <span class="i">$ChainIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}[<span class="i">$FileIndex</span>]}<span class="s">)</span> <span class="s">{</span>
 251       <span class="i">$ChainID</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}[<span class="i">$FileIndex</span>][<span class="i">$ChainIndex</span>]<span class="sc">;</span>
 252 
 253       <span class="i">$Sequence</span> .= <span class="i">$ChainSequencesDataMap</span>{<span class="w">Sequence</span>}{<span class="i">$ChainID</span>}<span class="sc">;</span>
 254     <span class="s">}</span>
 255     <span class="i">$SequenceID</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">ChainSequenceIDsPrefix</span>}[<span class="i">$FileIndex</span>][<span class="n">0</span>] . <span class="q">&quot;_CombinedChains|PDB&quot;</span><span class="sc">;</span><span class="sc">;</span>
 256     <span class="i">$SequenceDescription</span> = <span class="i">$SequenceID</span><span class="sc">;</span>
 257     <span class="i">$SequenceFileName</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$FileIndex</span>][<span class="n">0</span>]<span class="sc">;</span>
 258 
 259     <span class="k">print</span> <span class="q">&quot;Generating sequence file $SequenceFileName...\n&quot;</span><span class="sc">;</span>
 260     <span class="i">%SequencesDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 261     <span class="i">@</span>{<span class="i">$SequencesDataMap</span>{<span class="w">IDs</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 262     <span class="i">%</span>{<span class="i">$SequencesDataMap</span>{<span class="w">Sequence</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 263     <span class="i">%</span>{<span class="i">$SequencesDataMap</span>{<span class="w">Description</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 264 
 265     <span class="k">push</span> <span class="i">@</span>{<span class="i">$SequencesDataMap</span>{<span class="w">IDs</span>}}<span class="cm">,</span> <span class="i">$SequenceID</span><span class="sc">;</span>
 266     <span class="i">$SequencesDataMap</span>{<span class="w">Description</span>}{<span class="i">$SequenceID</span>} = <span class="i">$SequenceDescription</span><span class="sc">;</span>
 267     <span class="i">$SequencesDataMap</span>{<span class="w">Sequence</span>}{<span class="i">$SequenceID</span>} = <span class="i">$Sequence</span><span class="sc">;</span>
 268 
 269     <span class="i">WritePearsonFastaSequenceFile</span><span class="s">(</span><span class="i">$SequenceFileName</span><span class="cm">,</span> \<span class="i">%SequencesDataMap</span><span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">MaxSequenceLength</span>}<span class="s">)</span><span class="sc">;</span>
 270   <span class="s">}</span>
 271   <span class="k">else</span> <span class="s">{</span>
 272     <span class="c"># For each specifed chain, write out the sequences...</span>
 273     <span class="k">for</span> <span class="i">$ChainIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}[<span class="i">$FileIndex</span>]}<span class="s">)</span> <span class="s">{</span>
 274       <span class="i">$ChainID</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}[<span class="i">$FileIndex</span>][<span class="i">$ChainIndex</span>]<span class="sc">;</span>
 275 
 276       <span class="i">$SequenceFileName</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$FileIndex</span>][<span class="i">$ChainIndex</span>]<span class="sc">;</span>
 277 
 278       <span class="i">$SequenceID</span> = <span class="i">$ChainSequencesDataMap</span>{<span class="w">IDs</span>}[<span class="i">$ChainIndex</span>]<span class="sc">;</span>
 279       <span class="i">$SequenceDescription</span> = <span class="i">$ChainSequencesDataMap</span>{<span class="w">Description</span>}{<span class="i">$ChainID</span>}<span class="sc">;</span>
 280       <span class="i">$Sequence</span> = <span class="i">$ChainSequencesDataMap</span>{<span class="w">Sequence</span>}{<span class="i">$ChainID</span>}<span class="sc">;</span>
 281 
 282       <span class="k">print</span> <span class="q">&quot;Generating sequence file $SequenceFileName...\n&quot;</span><span class="sc">;</span>
 283       <span class="i">%SequencesDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 284       <span class="i">@</span>{<span class="i">$SequencesDataMap</span>{<span class="w">IDs</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 285       <span class="i">%</span>{<span class="i">$SequencesDataMap</span>{<span class="w">Sequence</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 286       <span class="i">%</span>{<span class="i">$SequencesDataMap</span>{<span class="w">Description</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 287 
 288       <span class="k">push</span> <span class="i">@</span>{<span class="i">$SequencesDataMap</span>{<span class="w">IDs</span>}}<span class="cm">,</span> <span class="i">$SequenceID</span><span class="sc">;</span>
 289       <span class="i">$SequencesDataMap</span>{<span class="w">Description</span>}{<span class="i">$SequenceID</span>} = <span class="i">$SequenceDescription</span><span class="sc">;</span>
 290       <span class="i">$SequencesDataMap</span>{<span class="w">Sequence</span>}{<span class="i">$SequenceID</span>} = <span class="i">$Sequence</span><span class="sc">;</span>
 291 
 292       <span class="i">WritePearsonFastaSequenceFile</span><span class="s">(</span><span class="i">$SequenceFileName</span><span class="cm">,</span> \<span class="i">%SequencesDataMap</span><span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">MaxSequenceLength</span>}<span class="s">)</span><span class="sc">;</span>
 293     <span class="s">}</span>
 294   <span class="s">}</span>
 295 <span class="s">}</span>
 296 
 297 <span class="c"># Extract atoms...</span>
<a name="ExtractByAtoms-"></a> 298 <span class="k">sub </span><span class="m">ExtractByAtoms</span> <span class="s">{</span>
 299   <span class="k">my</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 300   <span class="k">my</span><span class="s">(</span><span class="i">$PDBFileName</span><span class="cm">,</span>  <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$ChainRecordCount</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">$IgnoreRecord</span><span class="cm">,</span> <span class="i">$ConectRecordLinesRef</span><span class="cm">,</span> <span class="i">%AtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 301 
 302   <span class="i">$PDBFileName</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$FileIndex</span>][<span class="n">0</span>]<span class="sc">;</span>
 303   <span class="k">print</span> <span class="q">&quot;Generating PDBFileName file $PDBFileName...\n&quot;</span><span class="sc">;</span>
 304   <span class="k">open</span> <span class="w">OUTFILE</span><span class="cm">,</span> <span class="q">&quot;&gt;$PDBFileName&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Can&#39;t open $PDBFileName: $! \n&quot;</span><span class="sc">;</span>
 305 
 306   <span class="c"># Write out header and other older recors...</span>
 307   <span class="i">WriteHeaderAndOlderRecords</span><span class="s">(</span>\<span class="i">*OUTFILE</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 308 
 309   <span class="c"># Write out all ATOM records along with TER and model records to indicate</span>
 310   <span class="c"># chains and multiple models..</span>
 311   <span class="i">%AtomNumbersMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 312   <span class="i">$ChainRecordCount</span> = <span class="n">0</span><span class="sc">;</span>
 313   <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>
 314     <span class="k">if</span> <span class="s">(</span><span class="i">CheckRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 315       <span class="s">(</span><span class="i">$AtomNumber</span><span class="cm">,</span> <span class="i">$AtomName</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>
 316 
 317       <span class="c"># Check atoms...</span>
 318       <span class="i">$IgnoreRecord</span> = <span class="n">1</span><span class="sc">;</span>
 319       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^Atoms$/i</span><span class="s">)</span> <span class="s">{</span>
 320         <span class="i">$IgnoreRecord</span> = <span class="n">0</span><span class="sc">;</span>
 321       <span class="s">}</span>
 322       <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^(CAlphas|AtomNames)$/i</span><span class="s">)</span> <span class="s">{</span>
 323         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNamesMap</span>}{<span class="k">lc</span> <span class="i">$AtomName</span>}<span class="s">)</span> <span class="s">{</span>
 324           <span class="i">$IgnoreRecord</span> = <span class="n">0</span><span class="sc">;</span>
 325         <span class="s">}</span>
 326       <span class="s">}</span>
 327       <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^AtomNums$/i</span><span class="s">)</span> <span class="s">{</span>
 328         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNumsMap</span>}{<span class="i">$AtomNumber</span>}<span class="s">)</span> <span class="s">{</span>
 329           <span class="i">$IgnoreRecord</span> = <span class="n">0</span><span class="sc">;</span>
 330         <span class="s">}</span>
 331       <span class="s">}</span>
 332       <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^AtomsRange$/i</span><span class="s">)</span> <span class="s">{</span>
 333         <span class="k">if</span> <span class="s">(</span><span class="i">$AtomNumber</span> &gt;= <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedStartAtomNum</span>} &amp;&amp; <span class="i">$AtomNumber</span> &lt;= <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedEndAtomNum</span>}<span class="s">)</span> <span class="s">{</span>
 334           <span class="i">$IgnoreRecord</span> = <span class="n">0</span><span class="sc">;</span>
 335         <span class="s">}</span>
 336       <span class="s">}</span>
 337 
 338       <span class="k">if</span> <span class="s">(</span>!<span class="i">$IgnoreRecord</span><span class="s">)</span> <span class="s">{</span>
 339         <span class="i">$ChainRecordCount</span>++<span class="sc">;</span>
 340         <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 341 
 342         <span class="i">$AtomNumber</span> = <span class="k">int</span> <span class="i">$AtomNumber</span><span class="sc">;</span>
 343         <span class="i">$AtomNumbersMap</span>{<span class="i">$AtomNumber</span>} = <span class="i">$AtomName</span><span class="sc">;</span>
 344       <span class="s">}</span>
 345     <span class="s">}</span>
 346     <span class="k">elsif</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>
 347       <span class="k">if</span> <span class="s">(</span><span class="i">$ChainRecordCount</span><span class="s">)</span> <span class="s">{</span>
 348         <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateTerRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 349       <span class="s">}</span>
 350       <span class="i">$ChainRecordCount</span> = <span class="n">0</span><span class="sc">;</span>
 351     <span class="s">}</span>
 352     <span class="k">elsif</span> <span class="s">(</span><span class="i">IsModelRecordType</span><span class="s">(</span><span class="i">$RecordLine</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>
 353       <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 354     <span class="s">}</span>
 355   <span class="s">}</span>
 356 
 357   <span class="c"># Write out appropriate CONECT records...</span>
 358   <span class="i">$ConectRecordLinesRef</span> = <span class="i">GetConectRecordLines</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> \<span class="i">%AtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 359   <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConectRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span>
 360     <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 361   <span class="s">}</span>
 362 
 363   <span class="c"># Write out END record...</span>
 364   <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateEndRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 365 
 366   <span class="k">close</span> <span class="w">OUTFILE</span><span class="sc">;</span>
 367 <span class="s">}</span>
 368 
 369 <span class="c"># Extract residues...</span>
<a name="ExtractByResidues-"></a> 370 <span class="k">sub </span><span class="m">ExtractByResidues</span> <span class="s">{</span>
 371   <span class="k">my</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 372   <span class="k">my</span><span class="s">(</span><span class="i">$PDBFileName</span><span class="cm">,</span>  <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$ChainRecordCount</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">$ConectRecordLinesRef</span><span class="cm">,</span> <span class="i">$IgnoreRecord</span><span class="cm">,</span> <span class="i">%AtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 373 
 374   <span class="i">$PDBFileName</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$FileIndex</span>][<span class="n">0</span>]<span class="sc">;</span>
 375   <span class="k">print</span> <span class="q">&quot;Generating PDBFileName file $PDBFileName...\n&quot;</span><span class="sc">;</span>
 376   <span class="k">open</span> <span class="w">OUTFILE</span><span class="cm">,</span> <span class="q">&quot;&gt;$PDBFileName&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Can&#39;t open $PDBFileName: $! \n&quot;</span><span class="sc">;</span>
 377 
 378   <span class="c"># Write out header and other older recors...</span>
 379   <span class="i">WriteHeaderAndOlderRecords</span><span class="s">(</span>\<span class="i">*OUTFILE</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 380 
 381   <span class="c"># Write out all ATOM records for specified residues with TER and model records to indicate</span>
 382   <span class="c"># chains and multiple models...</span>
 383   <span class="i">%AtomNumbersMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 384   <span class="i">$ChainRecordCount</span> = <span class="n">0</span><span class="sc">;</span>
 385   <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>
 386     <span class="k">if</span> <span class="s">(</span><span class="i">CheckRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 387       <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="s">)</span> = <span class="i">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span>
 388 
 389       <span class="c"># Check residues...</span>
 390       <span class="i">$IgnoreRecord</span> = <span class="n">1</span><span class="sc">;</span>
 391       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^ResidueNums$/i</span><span class="s">)</span> <span class="s">{</span>
 392         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNumsMap</span>}{<span class="i">$ResidueNumber</span>}<span class="s">)</span> <span class="s">{</span>
 393           <span class="i">$IgnoreRecord</span> = <span class="n">0</span><span class="sc">;</span>
 394         <span class="s">}</span>
 395       <span class="s">}</span>
 396       <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^ResiduesRange$/i</span><span class="s">)</span> <span class="s">{</span>
 397         <span class="k">if</span> <span class="s">(</span><span class="i">$ResidueNumber</span> &gt;= <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedStartResidueNum</span>} &amp;&amp; <span class="i">$ResidueNumber</span> &lt;= <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedEndResidueNum</span>}<span class="s">)</span> <span class="s">{</span>
 398           <span class="i">$IgnoreRecord</span> = <span class="n">0</span><span class="sc">;</span>
 399         <span class="s">}</span>
 400       <span class="s">}</span>
 401       <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^ResidueNames$/i</span><span class="s">)</span> <span class="s">{</span>
 402         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNamesMap</span>}{<span class="k">lc</span> <span class="i">$ResidueName</span>}<span class="s">)</span> <span class="s">{</span>
 403           <span class="i">$IgnoreRecord</span> = <span class="n">0</span><span class="sc">;</span>
 404         <span class="s">}</span>
 405       <span class="s">}</span>
 406       <span class="k">if</span> <span class="s">(</span>!<span class="i">$IgnoreRecord</span><span class="s">)</span> <span class="s">{</span>
 407         <span class="i">$ChainRecordCount</span>++<span class="sc">;</span>
 408         <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 409         <span class="i">$AtomNumber</span> = <span class="k">int</span> <span class="i">$AtomNumber</span><span class="sc">;</span>
 410         <span class="i">$AtomNumbersMap</span>{<span class="i">$AtomNumber</span>} = <span class="i">$AtomName</span><span class="sc">;</span>
 411       <span class="s">}</span>
 412     <span class="s">}</span>
 413     <span class="k">elsif</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>
 414       <span class="k">if</span> <span class="s">(</span><span class="i">$ChainRecordCount</span><span class="s">)</span> <span class="s">{</span>
 415         <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateTerRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 416       <span class="s">}</span>
 417       <span class="i">$ChainRecordCount</span> = <span class="n">0</span><span class="sc">;</span>
 418     <span class="s">}</span>
 419     <span class="k">elsif</span> <span class="s">(</span><span class="i">IsModelRecordType</span><span class="s">(</span><span class="i">$RecordLine</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>
 420       <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 421     <span class="s">}</span>
 422   <span class="s">}</span>
 423 
 424   <span class="c"># Write out appropriate CONECT records...</span>
 425   <span class="i">$ConectRecordLinesRef</span> = <span class="i">GetConectRecordLines</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> \<span class="i">%AtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 426   <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConectRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span>
 427     <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 428   <span class="s">}</span>
 429   <span class="c"># Write out END record...</span>
 430   <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateEndRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 431 
 432   <span class="k">close</span> <span class="w">OUTFILE</span><span class="sc">;</span>
 433 <span class="s">}</span>
 434 
 435 <span class="c"># Extract non water records...</span>
<a name="ExtractNonWaterRecords-"></a> 436 <span class="k">sub </span><span class="m">ExtractNonWaterRecords</span> <span class="s">{</span>
 437   <span class="k">my</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 438   <span class="k">my</span><span class="s">(</span><span class="i">$PDBFileName</span><span class="cm">,</span>  <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$ChainRecordCount</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">$ConectRecordLinesRef</span><span class="cm">,</span> <span class="i">%AtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 439 
 440   <span class="i">$PDBFileName</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$FileIndex</span>][<span class="n">0</span>]<span class="sc">;</span>
 441   <span class="k">print</span> <span class="q">&quot;Generating PDBFileName file $PDBFileName...\n&quot;</span><span class="sc">;</span>
 442   <span class="k">open</span> <span class="w">OUTFILE</span><span class="cm">,</span> <span class="q">&quot;&gt;$PDBFileName&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Can&#39;t open $PDBFileName: $! \n&quot;</span><span class="sc">;</span>
 443 
 444   <span class="c"># Write out header and other older recors...</span>
 445   <span class="i">WriteHeaderAndOlderRecords</span><span class="s">(</span>\<span class="i">*OUTFILE</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 446 
 447   <span class="c"># Write out all ATOM/HETATM non water records along with TER and model records to indicate</span>
 448   <span class="c"># chains and multiple models..</span>
 449   <span class="i">%AtomNumbersMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 450   <span class="i">$ChainRecordCount</span> = <span class="n">0</span><span class="sc">;</span>
 451   <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>
 452     <span class="k">if</span> <span class="s">(</span><span class="i">CheckRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 453       <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="s">)</span> = <span class="i">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span>
 454       <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span> <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedWaterResiduesMap</span>}{<span class="i">$ResidueName</span>} <span class="s">)</span> <span class="s">{</span>
 455         <span class="i">$ChainRecordCount</span>++<span class="sc">;</span>
 456         <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 457         <span class="i">$AtomNumber</span> = <span class="k">int</span> <span class="i">$AtomNumber</span><span class="sc">;</span>
 458         <span class="i">$AtomNumbersMap</span>{<span class="i">$AtomNumber</span>} = <span class="i">$AtomName</span><span class="sc">;</span>
 459       <span class="s">}</span>
 460     <span class="s">}</span>
 461     <span class="k">elsif</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>
 462       <span class="k">if</span> <span class="s">(</span><span class="i">$ChainRecordCount</span><span class="s">)</span> <span class="s">{</span>
 463         <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateTerRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 464       <span class="s">}</span>
 465       <span class="i">$ChainRecordCount</span> = <span class="n">0</span><span class="sc">;</span>
 466     <span class="s">}</span>
 467     <span class="k">elsif</span> <span class="s">(</span><span class="i">IsModelRecordType</span><span class="s">(</span><span class="i">$RecordLine</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>
 468       <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 469     <span class="s">}</span>
 470   <span class="s">}</span>
 471 
 472   <span class="c"># Write out appropriate CONECT records...</span>
 473   <span class="i">$ConectRecordLinesRef</span> = <span class="i">GetConectRecordLines</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> \<span class="i">%AtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 474   <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConectRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span>
 475     <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 476   <span class="s">}</span>
 477   <span class="c"># Write out END record...</span>
 478   <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateEndRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 479 
 480   <span class="k">close</span> <span class="w">OUTFILE</span><span class="sc">;</span>
 481 <span class="s">}</span>
 482 
 483 <span class="c"># Extract non hydrogen records...</span>
<a name="ExtractNonHydrogenRecords-"></a> 484 <span class="k">sub </span><span class="m">ExtractNonHydrogenRecords</span> <span class="s">{</span>
 485   <span class="k">my</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 486   <span class="k">my</span><span class="s">(</span><span class="i">$PDBFileName</span><span class="cm">,</span>  <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$ChainRecordCount</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">$ConectRecordLinesRef</span><span class="cm">,</span> <span class="i">%AtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 487 
 488   <span class="i">$PDBFileName</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$FileIndex</span>][<span class="n">0</span>]<span class="sc">;</span>
 489   <span class="k">print</span> <span class="q">&quot;Generating PDBFileName file $PDBFileName...\n&quot;</span><span class="sc">;</span>
 490   <span class="k">open</span> <span class="w">OUTFILE</span><span class="cm">,</span> <span class="q">&quot;&gt;$PDBFileName&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Can&#39;t open $PDBFileName: $! \n&quot;</span><span class="sc">;</span>
 491 
 492   <span class="c"># Write out header and other older recors...</span>
 493   <span class="i">WriteHeaderAndOlderRecords</span><span class="s">(</span>\<span class="i">*OUTFILE</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 494 
 495   <span class="c"># Write out all ATOM/HETATM non hydrogen records along with TER and model records to indicate</span>
 496   <span class="c"># chains and multiple models..</span>
 497   <span class="i">%AtomNumbersMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 498   <span class="i">$ChainRecordCount</span> = <span class="n">0</span><span class="sc">;</span>
 499   <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>
 500     <span class="k">if</span> <span class="s">(</span><span class="i">CheckRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 501       <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>
 502       <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>
 503         <span class="i">$ChainRecordCount</span>++<span class="sc">;</span>
 504         <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 505         <span class="i">$AtomNumber</span> = <span class="k">int</span> <span class="i">$AtomNumber</span><span class="sc">;</span>
 506         <span class="i">$AtomNumbersMap</span>{<span class="i">$AtomNumber</span>} = <span class="i">$AtomName</span><span class="sc">;</span>
 507       <span class="s">}</span>
 508     <span class="s">}</span>
 509     <span class="k">elsif</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>
 510       <span class="k">if</span> <span class="s">(</span><span class="i">$ChainRecordCount</span><span class="s">)</span> <span class="s">{</span>
 511         <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateTerRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 512       <span class="s">}</span>
 513       <span class="i">$ChainRecordCount</span> = <span class="n">0</span><span class="sc">;</span>
 514     <span class="s">}</span>
 515     <span class="k">elsif</span> <span class="s">(</span><span class="i">IsModelRecordType</span><span class="s">(</span><span class="i">$RecordLine</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>
 516       <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 517     <span class="s">}</span>
 518   <span class="s">}</span>
 519 
 520   <span class="c"># Write out appropriate CONECT records...</span>
 521   <span class="i">$ConectRecordLinesRef</span> = <span class="i">GetConectRecordLines</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> \<span class="i">%AtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 522   <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConectRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span>
 523     <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 524   <span class="s">}</span>
 525   <span class="c"># Write out END record...</span>
 526   <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateEndRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 527 
 528   <span class="k">close</span> <span class="w">OUTFILE</span><span class="sc">;</span>
 529 <span class="s">}</span>
 530 
 531 <span class="c"># Extract ATOM/HETATM records by distance...</span>
<a name="ExtractByDistance-"></a> 532 <span class="k">sub </span><span class="m">ExtractByDistance</span> <span class="s">{</span>
 533   <span class="k">my</span><span class="s">(</span><span class="i">$FileIndex</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 534   <span class="k">my</span><span class="s">(</span><span class="i">$PDBFileName</span><span class="cm">,</span>  <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$RecordLineNum</span><span class="cm">,</span> <span class="i">$ChainRecordCount</span><span class="cm">,</span> <span class="i">$ConectRecordLinesRef</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">$IgnoreRecord</span><span class="cm">,</span> <span class="i">$ResidueID</span><span class="cm">,</span> <span class="i">@OriginCoords</span><span class="cm">,</span> <span class="i">@Coords</span><span class="cm">,</span> <span class="i">%AtomNumbersMap</span><span class="cm">,</span> <span class="i">%ResiduesDataMap</span><span class="s">)</span><span class="sc">;</span>
 535 
 536   <span class="i">$PDBFileName</span> = <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$FileIndex</span>][<span class="n">0</span>]<span class="sc">;</span>
 537   <span class="k">print</span> <span class="q">&quot;Generating PDBFileName file $PDBFileName...\n&quot;</span><span class="sc">;</span>
 538   <span class="k">open</span> <span class="w">OUTFILE</span><span class="cm">,</span> <span class="q">&quot;&gt;$PDBFileName&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Can&#39;t open $PDBFileName: $! \n&quot;</span><span class="sc">;</span>
 539 
 540   <span class="c"># Write out header and other older recors...</span>
 541   <span class="i">WriteHeaderAndOlderRecords</span><span class="s">(</span>\<span class="i">*OUTFILE</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 542 
 543   <span class="c"># Setup coordinates of origin to calculate distance...</span>
 544   <span class="i">@OriginCoords</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 545   <span class="k">push</span> <span class="i">@OriginCoords</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">DistanceOrigin</span>}[<span class="i">$FileIndex</span>]}<span class="sc">;</span>
 546 
 547   <span class="c"># Write out all ATOM records for which meet specified criteria along with TER and model records to indicate</span>
 548   <span class="c"># chains and multiple models...</span>
 549   <span class="i">%AtomNumbersMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 550 
 551   <span class="i">%ResiduesDataMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 552   <span class="i">%</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">ID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 553   <span class="i">%</span>{<span class="i">$ResiduesDataMap</span>{<span class="w">Status</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 554 
 555   <span class="i">$ChainRecordCount</span> = <span class="n">0</span><span class="sc">;</span>
 556   <span class="i">$RecordLineNum</span> = <span class="n">0</span><span class="sc">;</span>
 557 
 558   <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>
 559     <span class="i">$RecordLineNum</span>++<span class="sc">;</span>
 560     <span class="k">if</span> <span class="s">(</span><span class="i">CheckRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 561       <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="s">)</span> = <span class="i">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span>
 562       <span class="i">@Coords</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="k">push</span> <span class="i">@Coords</span><span class="cm">,</span> <span class="s">(</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="s">)</span><span class="sc">;</span>
 563 
 564       <span class="i">$IgnoreRecord</span> = <span class="n">1</span><span class="sc">;</span>
 565       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">DistanceSelectionMode</span>} =~ <span class="q">/^ByResidue$/i</span><span class="s">)</span> <span class="s">{</span>
 566         <span class="i">$ResidueID</span> = <span class="q">&quot;${ResidueName}_${ResidueNumber}_${ChainID}&quot;</span><span class="sc">;</span>
 567         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ResiduesDataMap</span>{<span class="w">ID</span>}{<span class="i">$ResidueID</span>}<span class="s">)</span> <span class="s">{</span>
 568           <span class="c"># Residue data has been processed; check its selection status...</span>
 569           <span class="k">if</span> <span class="s">(</span><span class="i">$ResiduesDataMap</span>{<span class="w">Status</span>}{<span class="i">$ResidueID</span>}<span class="s">)</span> <span class="s">{</span>
 570             <span class="i">$IgnoreRecord</span> = <span class="n">0</span><span class="sc">;</span>
 571           <span class="s">}</span>
 572         <span class="s">}</span>
 573         <span class="k">else</span> <span class="s">{</span>
 574           <span class="c"># Residue hasn&#39;t been processed...</span>
 575           <span class="i">$ResiduesDataMap</span>{<span class="w">ID</span>}{<span class="i">$ResidueID</span>} = <span class="i">$ResidueID</span><span class="sc">;</span>
 576           <span class="i">$ResiduesDataMap</span>{<span class="w">Status</span>}{<span class="i">$ResidueID</span>} = <span class="n">0</span><span class="sc">;</span>
 577           <span class="k">if</span> <span class="s">(</span><span class="i">CheckResidueDistance</span><span class="s">(</span><span class="i">$ResidueID</span><span class="cm">,</span> <span class="i">$RecordLineNum</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> \<span class="i">@OriginCoords</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 578             <span class="i">$IgnoreRecord</span> = <span class="n">0</span><span class="sc">;</span>
 579             <span class="i">$ResiduesDataMap</span>{<span class="w">Status</span>}{<span class="i">$ResidueID</span>} = <span class="n">1</span><span class="sc">;</span>
 580           <span class="s">}</span>
 581         <span class="s">}</span>
 582       <span class="s">}</span>
 583       <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">DistanceSelectionMode</span>} =~ <span class="q">/^ByAtom$/i</span><span class="s">)</span> <span class="s">{</span>
 584         <span class="k">if</span> <span class="s">(</span><span class="i">CheckDistance</span><span class="s">(</span>\<span class="i">@Coords</span><span class="cm">,</span> \<span class="i">@OriginCoords</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 585           <span class="i">$IgnoreRecord</span> = <span class="n">0</span><span class="sc">;</span>
 586         <span class="s">}</span>
 587       <span class="s">}</span>
 588 
 589       <span class="k">if</span> <span class="s">(</span>!<span class="i">$IgnoreRecord</span><span class="s">)</span> <span class="s">{</span>
 590         <span class="i">$ChainRecordCount</span>++<span class="sc">;</span>
 591         <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 592         <span class="i">$AtomNumber</span> = <span class="k">int</span> <span class="i">$AtomNumber</span><span class="sc">;</span>
 593         <span class="i">$AtomNumbersMap</span>{<span class="i">$AtomNumber</span>} = <span class="i">$AtomName</span><span class="sc">;</span>
 594       <span class="s">}</span>
 595     <span class="s">}</span>
 596     <span class="k">elsif</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>
 597       <span class="k">if</span> <span class="s">(</span><span class="i">$ChainRecordCount</span><span class="s">)</span> <span class="s">{</span>
 598         <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateTerRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 599       <span class="s">}</span>
 600       <span class="i">$ChainRecordCount</span> = <span class="n">0</span><span class="sc">;</span>
 601     <span class="s">}</span>
 602     <span class="k">elsif</span> <span class="s">(</span><span class="i">IsModelRecordType</span><span class="s">(</span><span class="i">$RecordLine</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>
 603       <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 604     <span class="s">}</span>
 605   <span class="s">}</span>
 606 
 607   <span class="c"># Write out appropriate CONECT records...</span>
 608   <span class="i">$ConectRecordLinesRef</span> = <span class="i">GetConectRecordLines</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> \<span class="i">%AtomNumbersMap</span><span class="s">)</span><span class="sc">;</span>
 609   <span class="k">for</span> <span class="i">$RecordLine</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ConectRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span>
 610     <span class="k">print</span> <span class="i">OUTFILE</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 611   <span class="s">}</span>
 612 
 613   <span class="c"># Write out END record...</span>
 614   <span class="k">print</span> <span class="i">OUTFILE</span> <span class="i">GenerateEndRecordLine</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 615 
 616   <span class="k">close</span> <span class="w">OUTFILE</span><span class="sc">;</span>
 617 <span class="s">}</span>
 618 
 619 <span class="c"># Does record type correspond to the specified record type?</span>
<a name="CheckRecordType-"></a> 620 <span class="k">sub </span><span class="m">CheckRecordType</span> <span class="s">{</span>
 621   <span class="k">my</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 622   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="s">)</span><span class="sc">;</span>
 623 
 624   <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span>
 625   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">RecordMode</span>} =~ <span class="q">/^Atom$/i</span><span class="s">)</span> <span class="s">{</span>
 626     <span class="i">$Status</span> = <span class="i">IsAtomRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 627   <span class="s">}</span>
 628   <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">RecordMode</span>} =~ <span class="q">/^Hetatm$/i</span><span class="s">)</span> <span class="s">{</span>
 629     <span class="i">$Status</span> = <span class="i">IsHetatmRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 630   <span class="s">}</span>
 631   <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">RecordMode</span>} =~ <span class="q">/^AtomAndHetatm$/i</span><span class="s">)</span> <span class="s">{</span>
 632     <span class="i">$Status</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="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 633   <span class="s">}</span>
 634 
 635   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span>
 636 <span class="s">}</span>
 637 
 638 <span class="c"># Does record meets distance citerion specified by the user?</span>
<a name="CheckResidueDistance-"></a> 639 <span class="k">sub </span><span class="m">CheckResidueDistance</span> <span class="s">{</span>
 640   <span class="k">my</span><span class="s">(</span><span class="i">$SpecifiedResidueID</span><span class="cm">,</span> <span class="i">$StartingLineNum</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$OriginCoordsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 641   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="cm">,</span> <span class="i">$RecordLine</span><span class="cm">,</span> <span class="i">$RecordLineIndex</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">$ResidueID</span><span class="cm">,</span> <span class="i">@Coords</span><span class="s">)</span><span class="sc">;</span>
 642 
 643   <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span>
 644 
 645   <span class="j">RECORDLINE:</span> <span class="k">for</span> <span class="i">$RecordLineIndex</span> <span class="s">(</span><span class="s">(</span><span class="i">$StartingLineNum</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>
 646     <span class="i">$RecordLine</span> = <span class="i">$PDBRecordLinesRef</span>-&gt;[<span class="i">$RecordLineIndex</span>]<span class="sc">;</span>
 647     <span class="k">if</span> <span class="s">(</span>!<span class="i">CheckRecordType</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 648       <span class="k">next</span> <span class="j">RECORDLINE</span><span class="sc">;</span>
 649     <span class="s">}</span>
 650     <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="s">)</span> = <span class="i">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span>
 651     <span class="i">$ResidueID</span> = <span class="q">&quot;${ResidueName}_${ResidueNumber}_${ChainID}&quot;</span><span class="sc">;</span>
 652 
 653     <span class="k">if</span> <span class="s">(</span><span class="i">$ResidueID</span> !~ <span class="q">/^$SpecifiedResidueID$/i</span><span class="s">)</span> <span class="s">{</span>
 654       <span class="c"># It&#39;s a new residue line...</span>
 655       <span class="k">last</span> <span class="j">RECORDLINE</span><span class="sc">;</span>
 656     <span class="s">}</span>
 657 
 658     <span class="c"># Check distance...</span>
 659     <span class="i">@Coords</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="k">push</span> <span class="i">@Coords</span><span class="cm">,</span> <span class="s">(</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="s">)</span><span class="sc">;</span>
 660     <span class="k">if</span> <span class="s">(</span><span class="i">CheckDistance</span><span class="s">(</span>\<span class="i">@Coords</span><span class="cm">,</span> <span class="i">$OriginCoordsRef</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 661       <span class="c"># Distance criterion is met for at least one record in the residue...</span>
 662       <span class="i">$Status</span> = <span class="n">1</span><span class="sc">;</span>
 663       <span class="k">last</span> <span class="j">RECORDLINE</span><span class="sc">;</span>
 664     <span class="s">}</span>
 665   <span class="s">}</span>
 666   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span>
 667 <span class="s">}</span>
 668 
 669 <span class="c"># Does record meets distance citerion specified by the user?</span>
<a name="CheckDistance-"></a> 670 <span class="k">sub </span><span class="m">CheckDistance</span> <span class="s">{</span>
 671   <span class="k">my</span><span class="s">(</span><span class="i">$CoordsRef</span><span class="cm">,</span> <span class="i">$OriginCoordsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 672   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$Distance</span><span class="cm">,</span> <span class="i">$DistanceSquare</span><span class="s">)</span><span class="sc">;</span>
 673 
 674   <span class="i">$Status</span> = <span class="n">0</span><span class="sc">;</span>
 675 
 676   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^Residue$/i</span><span class="s">)</span> <span class="s">{</span>
 677     <span class="c"># Go over coordinates of all the atoms in the residue...</span>
 678     <span class="k">my</span><span class="s">(</span><span class="i">$ResidueCoordsCount</span><span class="s">)</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$OriginCoordsRef</span>}<span class="sc">;</span>
 679     <span class="j">INDEX:</span> <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$ResidueCoordsCount</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 680       <span class="i">$DistanceSquare</span> = <span class="s">(</span><span class="i">$CoordsRef</span>-&gt;[<span class="n">0</span>] - <span class="i">$OriginCoordsRef</span>-&gt;[<span class="i">$Index</span>]<span class="s">)</span>**<span class="n">2</span> + <span class="s">(</span><span class="i">$CoordsRef</span>-&gt;[<span class="n">1</span>] - <span class="i">$OriginCoordsRef</span>-&gt;[<span class="i">$Index</span> + <span class="n">1</span>]<span class="s">)</span>**<span class="n">2</span> + <span class="s">(</span><span class="i">$CoordsRef</span>-&gt;[<span class="n">2</span>] - <span class="i">$OriginCoordsRef</span>-&gt;[<span class="i">$Index</span> + <span class="n">2</span>]<span class="s">)</span>**<span class="n">2</span><span class="sc">;</span>
 681       <span class="i">$Distance</span> = <span class="k">sqrt</span> <span class="i">$DistanceSquare</span><span class="sc">;</span>
 682       <span class="k">if</span> <span class="s">(</span><span class="i">$Distance</span> &lt;= <span class="i">$OptionsInfo</span>{<span class="w">MaxExtractionDistance</span>}<span class="s">)</span> <span class="s">{</span>
 683         <span class="i">$Status</span> = <span class="n">1</span><span class="sc">;</span>
 684         <span class="k">last</span> <span class="j">INDEX</span><span class="sc">;</span>
 685       <span class="s">}</span>
 686     <span class="s">}</span>
 687   <span class="s">}</span>
 688   <span class="k">else</span> <span class="s">{</span>
 689     <span class="i">$DistanceSquare</span> = <span class="n">0</span><span class="sc">;</span>
 690     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 691       <span class="i">$DistanceSquare</span> += <span class="s">(</span><span class="i">$CoordsRef</span>-&gt;[<span class="i">$Index</span>] - <span class="i">$OriginCoordsRef</span>-&gt;[<span class="i">$Index</span>]<span class="s">)</span>**<span class="n">2</span><span class="sc">;</span>
 692     <span class="s">}</span>
 693     <span class="i">$Distance</span> = <span class="k">sqrt</span> <span class="i">$DistanceSquare</span><span class="sc">;</span>
 694     <span class="i">$Status</span> = <span class="s">(</span><span class="i">$Distance</span> &lt;= <span class="i">$OptionsInfo</span>{<span class="w">MaxExtractionDistance</span>}<span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 695   <span class="s">}</span>
 696 
 697   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span>
 698 <span class="s">}</span>
 699 
 700 <span class="c"># Write out modifed header and other older records...</span>
<a name="WriteHeaderAndOlderRecords-"></a> 701 <span class="k">sub </span><span class="m">WriteHeaderAndOlderRecords</span> <span class="s">{</span>
 702   <span class="k">my</span><span class="s">(</span><span class="i">$OutFileRef</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 703 
 704   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ModifyHeaderRecord</span>}<span class="s">)</span> <span class="s">{</span>
 705     <span class="c"># Write out modified HEADER record...</span>
 706     <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="i">GetHeaderRecordInformation</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
 707     <span class="i">$Classification</span> = <span class="q">&#39;Data extracted using MayaChemTools&#39;</span><span class="sc">;</span>
 708     <span class="k">print</span> <span class="i">$OutFileRef</span> <span class="i">GenerateHeaderRecordLine</span><span class="s">(</span><span class="i">$IDCode</span><span class="cm">,</span> <span class="i">$Classification</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 709   <span class="s">}</span>
 710   <span class="k">else</span> <span class="s">{</span>
 711     <span class="k">print</span> <span class="i">$OutFileRef</span> <span class="i">$PDBRecordLinesRef</span>-&gt;[<span class="n">0</span>]<span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
 712   <span class="s">}</span>
 713 
 714   <span class="c"># Write out any old records...</span>
 715   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">KeepOldRecords</span>}<span class="s">)</span> <span class="s">{</span>
 716     <span class="k">my</span><span class="s">(</span><span class="i">$RecordLineIndex</span><span class="cm">,</span> <span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span>
 717     <span class="c"># Skip HEADER record and write out older records all the way upto first MODEL/ATOM/HETATM records from input file...</span>
 718     <span class="j">RECORDLINE:</span> <span class="k">for</span> <span class="i">$RecordLineIndex</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#</span>{<span class="i">$PDBRecordLinesRef</span>}<span class="s">)</span> <span class="s">{</span>
 719       <span class="i">$RecordLine</span> = <span class="i">$PDBRecordLinesRef</span>-&gt;[<span class="i">$RecordLineIndex</span>]<span class="sc">;</span>
 720       <span class="k">if</span> <span class="s">(</span><span class="i">IsModelRecordType</span><span class="s">(</span><span class="i">$RecordLine</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>
 721         <span class="k">last</span> <span class="j">RECORDLINE</span><span class="sc">;</span>
 722       <span class="s">}</span>
 723       <span class="k">print</span> <span class="i">$OutFileRef</span> <span class="q">&quot;$RecordLine\n&quot;</span><span class="sc">;</span>
 724     <span class="s">}</span>
 725   <span class="s">}</span>
 726 <span class="s">}</span>
 727 
 728 <span class="c"># Get header record information assuming it&#39;s the first record...</span>
<a name="GetHeaderRecordInformation-"></a> 729 <span class="k">sub </span><span class="m">GetHeaderRecordInformation</span> <span class="s">{</span>
 730   <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>
 731   <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="cm">,</span> <span class="i">$HeaderRecordLine</span><span class="s">)</span><span class="sc">;</span>
 732 
 733   <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>
 734   <span class="i">$HeaderRecordLine</span> = <span class="i">$PDBRecordLinesRef</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span>
 735   <span class="k">if</span> <span class="s">(</span><span class="i">IsHeaderRecordType</span><span class="s">(</span><span class="i">$HeaderRecordLine</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 736     <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="i">ParseHeaderRecordLine</span><span class="s">(</span><span class="i">$HeaderRecordLine</span><span class="s">)</span><span class="sc">;</span>
 737   <span class="s">}</span>
 738   <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>
 739 <span class="s">}</span>
 740 
 741 <span class="c"># Get one letter residue code...</span>
<a name="GetResidueCode-"></a> 742 <span class="k">sub </span><span class="m">GetResidueCode</span> <span class="s">{</span>
 743   <span class="k">my</span><span class="s">(</span><span class="i">$ResidueName</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 744   <span class="k">my</span><span class="s">(</span><span class="i">$ResidueCode</span><span class="cm">,</span> <span class="i">$StandardResidue</span><span class="s">)</span><span class="sc">;</span>
 745 
 746   <span class="i">$ResidueCode</span> = <span class="i">$OptionsInfo</span>{<span class="w">NonStandardSequenceCode</span>}<span class="sc">;</span>
 747   <span class="i">$StandardResidue</span> = <span class="n">0</span><span class="sc">;</span>
 748 
 749   <span class="k">if</span> <span class="s">(</span><span class="k">length</span><span class="s">(</span><span class="i">$ResidueName</span><span class="s">)</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 750     <span class="c"># Assume it&#39;s an amino acid...</span>
 751     <span class="k">if</span> <span class="s">(</span><span class="i">AminoAcids::IsAminoAcid</span><span class="s">(</span><span class="i">$ResidueName</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 752       <span class="c"># Standard amino acid...</span>
 753       <span class="i">$ResidueCode</span> = <span class="i">AminoAcids::GetAminoAcidOneLetterCode</span><span class="s">(</span><span class="i">$ResidueName</span><span class="s">)</span><span class="sc">;</span>
 754       <span class="i">$StandardResidue</span> = <span class="n">1</span><span class="sc">;</span>
 755     <span class="s">}</span>
 756   <span class="s">}</span>
 757   <span class="k">elsif</span> <span class="s">(</span><span class="k">length</span><span class="s">(</span><span class="i">$ResidueName</span><span class="s">)</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
 758     <span class="c"># Assume it&#39;s a nucleic acid...</span>
 759     <span class="k">if</span> <span class="s">(</span><span class="i">$ResidueName</span> =~ <span class="q">/^(A|G|T|U|C)$/i</span><span class="s">)</span> <span class="s">{</span>
 760       <span class="i">$ResidueCode</span> = <span class="i">$ResidueName</span><span class="sc">;</span>
 761       <span class="i">$StandardResidue</span> = <span class="n">1</span><span class="sc">;</span>
 762     <span class="s">}</span>
 763   <span class="s">}</span>
 764 
 765   <span class="k">return</span> <span class="s">(</span><span class="i">$ResidueCode</span><span class="cm">,</span> <span class="i">$StandardResidue</span><span class="s">)</span><span class="sc">;</span>
 766 <span class="s">}</span>
 767 
 768 <span class="c"># Process option values...</span>
<a name="ProcessOptions-"></a> 769 <span class="k">sub </span><span class="m">ProcessOptions</span> <span class="s">{</span>
 770   <span class="i">%OptionsInfo</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 771   <span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} = <span class="i">$Options</span>{<span class="w">mode</span>}<span class="sc">;</span>
 772 
 773   <span class="k">my</span><span class="s">(</span><span class="i">@SpecifiedChains</span><span class="s">)</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 774   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">chains</span>} =~ <span class="q">/^(First|All)$/i</span><span class="s">)</span> <span class="s">{</span>
 775     <span class="i">$OptionsInfo</span>{<span class="w">ChainsToExtract</span>} = <span class="i">$Options</span>{<span class="w">chains</span>}<span class="sc">;</span>
 776   <span class="s">}</span>
 777   <span class="k">else</span> <span class="s">{</span>
 778     <span class="i">@SpecifiedChains</span> = <span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$Options</span>{<span class="w">chains</span>}<span class="sc">;</span>
 779     <span class="i">$OptionsInfo</span>{<span class="w">ChainsToExtract</span>} = <span class="q">&#39;Specified&#39;</span><span class="sc">;</span>
 780   <span class="s">}</span>
 781   <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedChains</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 782   <span class="k">push</span> <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedChains</span>}}<span class="cm">,</span> <span class="i">@SpecifiedChains</span><span class="sc">;</span>
 783 
 784   <span class="i">$OptionsInfo</span>{<span class="w">CombineChains</span>} = <span class="s">(</span><span class="i">$Options</span>{<span class="w">combinechains</span>} =~ <span class="q">/^Yes$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 785 
 786   <span class="i">$OptionsInfo</span>{<span class="w">CombineChainSequences</span>} = <span class="s">(</span><span class="i">$Options</span>{<span class="w">combinechains</span>} =~ <span class="q">/^Yes$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 787 
 788   <span class="i">ProcessResiduesOptions</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 789   <span class="i">ProcessAtomsOptions</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 790   <span class="i">ProcessDistanceOptions</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 791 
 792   <span class="i">$OptionsInfo</span>{<span class="w">WaterResidueNames</span>} = <span class="i">$Options</span>{<span class="w">waterresiduenames</span>}<span class="sc">;</span>
 793   <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedWaterResiduesList</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 794   <span class="i">%</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedWaterResiduesMap</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 795 
 796   <span class="k">my</span><span class="s">(</span><span class="i">@SpecifiedWaterResiduesList</span><span class="s">)</span><span class="sc">;</span>
 797   <span class="i">@SpecifiedWaterResiduesList</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 798 
 799   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^NonWater$/i</span><span class="s">)</span> <span class="s">{</span>
 800     <span class="k">my</span><span class="s">(</span><span class="i">$WaterResidueName</span><span class="s">)</span><span class="sc">;</span>
 801     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">WaterResidueNames</span>} =~ <span class="q">/Automatic/i</span><span class="s">)</span> <span class="s">{</span>
 802       <span class="k">push</span> <span class="i">@SpecifiedWaterResiduesList</span><span class="cm">,</span> <span class="s">(</span><span class="q">&#39;HOH&#39;</span><span class="cm">,</span> <span class="q">&#39;WAT&#39;</span><span class="cm">,</span> <span class="q">&#39;H2O&#39;</span><span class="s">)</span><span class="sc">;</span>
 803     <span class="s">}</span>
 804     <span class="k">else</span> <span class="s">{</span>
 805       <span class="i">@SpecifiedWaterResiduesList</span> = <span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$Options</span>{<span class="w">waterresiduenames</span>}<span class="sc">;</span>
 806     <span class="s">}</span>
 807     <span class="k">for</span> <span class="i">$WaterResidueName</span> <span class="s">(</span><span class="i">@SpecifiedWaterResiduesList</span><span class="s">)</span> <span class="s">{</span>
 808       <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedWaterResiduesMap</span>}{<span class="i">$WaterResidueName</span>} = <span class="i">$WaterResidueName</span><span class="sc">;</span>
 809     <span class="s">}</span>
 810   <span class="s">}</span>
 811   <span class="k">push</span> <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedWaterResiduesList</span>}}<span class="cm">,</span> <span class="i">@SpecifiedWaterResiduesList</span><span class="sc">;</span>
 812 
 813   <span class="i">$OptionsInfo</span>{<span class="w">RecordMode</span>} = <span class="i">$Options</span>{<span class="w">recordmode</span>} ? <span class="i">$Options</span>{<span class="w">recordmode</span>} <span class="co">:</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">mode</span>} =~ <span class="q">/^(Atoms|CAlphas|AtomNums|AtomsRange|AtomNames)$/i</span> ? <span class="q">&quot;Atom&quot;</span> <span class="co">:</span> <span class="q">&quot;AtomAndHetatm&quot;</span><span class="s">)</span><span class="sc">;</span>
 814 
 815   <span class="i">$OptionsInfo</span>{<span class="w">KeepOldRecords</span>} = <span class="s">(</span><span class="i">$Options</span>{<span class="w">keepoldrecords</span>} =~ <span class="q">/^Yes$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 816 
 817   <span class="i">$OptionsInfo</span>{<span class="w">ModifyHeaderRecord</span>} = <span class="s">(</span><span class="i">$Options</span>{<span class="w">modifyheader</span>} =~ <span class="q">/^Yes$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 818 
 819   <span class="i">$OptionsInfo</span>{<span class="w">KeepNonStandardSequences</span>} = <span class="s">(</span><span class="i">$Options</span>{<span class="w">nonstandardkeep</span>} =~ <span class="q">/^Yes$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 820   <span class="i">$OptionsInfo</span>{<span class="w">NonStandardSequenceCode</span>} = <span class="i">$Options</span>{<span class="w">nonstandardcode</span>}<span class="sc">;</span>
 821   <span class="i">$OptionsInfo</span>{<span class="w">MaxSequenceLength</span>} = <span class="i">$Options</span>{<span class="w">sequencelength</span>}<span class="sc">;</span>
 822   <span class="i">$OptionsInfo</span>{<span class="w">SequenceRecordSource</span>} = <span class="i">$Options</span>{<span class="w">sequencerecords</span>}<span class="sc">;</span>
 823   <span class="i">$OptionsInfo</span>{<span class="w">SequenceIDPrefixSource</span>} = <span class="i">$Options</span>{<span class="w">sequenceidprefix</span>}<span class="sc">;</span>
 824 
 825   <span class="i">$OptionsInfo</span>{<span class="w">OverwriteFiles</span>} = <span class="i">$Options</span>{<span class="w">overwrite</span>} ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 826   <span class="i">$OptionsInfo</span>{<span class="w">OutFileRoot</span>} = <span class="i">$Options</span>{<span class="w">root</span>} ? <span class="i">$Options</span>{<span class="w">root</span>} <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 827 <span class="s">}</span>
 828 
 829 <span class="c"># Process specified residue options...</span>
<a name="ProcessResiduesOptions-"></a> 830 <span class="k">sub </span><span class="m">ProcessResiduesOptions</span> <span class="s">{</span>
 831   <span class="k">my</span><span class="s">(</span><span class="i">$ResidueNum</span><span class="cm">,</span> <span class="i">$StartResidueNum</span><span class="cm">,</span> <span class="i">$EndResNum</span><span class="cm">,</span> <span class="i">$ResidueName</span><span class="cm">,</span> <span class="i">@SpecifiedResidueNumsList</span><span class="cm">,</span> <span class="i">@SpecifiedResidueNamesList</span><span class="s">)</span><span class="sc">;</span>
 832 
 833   <span class="i">@SpecifiedResidueNumsList</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 834   <span class="s">(</span><span class="i">$StartResidueNum</span><span class="cm">,</span> <span class="i">$EndResNum</span><span class="s">)</span> = <span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span>
 835 
 836   <span class="i">@SpecifiedResidueNamesList</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 837 
 838   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^(ResidueNums|ResiduesRange|ResidueNames)$/i</span><span class="s">)</span> <span class="s">{</span>
 839     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Options</span>{<span class="w">residues</span>}<span class="s">)</span> <span class="s">{</span>
 840       <span class="k">die</span> <span class="q">&quot;Error: You must specify a value for \&quot;--Residues\&quot; option in \&quot;ResidueNums, ResiduesRange, or ResidueNames\&quot; \&quot;-m, --mode\&quot;. \n&quot;</span><span class="sc">;</span>
 841     <span class="s">}</span>
 842     <span class="i">$OptionsInfo</span>{<span class="w">Residues</span>} = <span class="i">$Options</span>{<span class="w">residues</span>}<span class="sc">;</span>
 843     <span class="i">$OptionsInfo</span>{<span class="w">Residues</span>} =~ <span class="q">s/ //g</span><span class="sc">;</span>
 844 
 845     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^ResidueNames$/i</span><span class="s">)</span> <span class="s">{</span>
 846       <span class="i">@SpecifiedResidueNamesList</span> = <span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">Residues</span>}<span class="sc">;</span>
 847     <span class="s">}</span>
 848     <span class="k">else</span> <span class="s">{</span>
 849       <span class="i">@SpecifiedResidueNumsList</span> = <span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">Residues</span>}<span class="sc">;</span>
 850       <span class="k">for</span> <span class="i">$ResidueNum</span> <span class="s">(</span><span class="i">@SpecifiedResidueNumsList</span><span class="s">)</span> <span class="s">{</span>
 851         <span class="k">if</span> <span class="s">(</span>!<span class="i">IsPositiveInteger</span><span class="s">(</span><span class="i">$ResidueNum</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 852           <span class="k">die</span> <span class="q">&quot;Error: Invalid residue number value, $ResidueNum, for \&quot;--Residues\&quot; option during \&quot;ResidueNumes\&quot; or \&quot;ResiduesRange\&quot;value of \&quot;-m --mode\&quot; option: Residue number must be a positive integer.\n&quot;</span><span class="sc">;</span>
 853         <span class="s">}</span>
 854       <span class="s">}</span>
 855       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^ResiduesRange$/i</span><span class="s">)</span> <span class="s">{</span>
 856         <span class="k">if</span> <span class="s">(</span><span class="i">@SpecifiedResidueNumsList</span> != <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 857           <span class="k">die</span> <span class="q">&quot;Error: Invalid number of residue number values, &quot;</span><span class="cm">,</span> <span class="k">scalar</span><span class="s">(</span><span class="i">@SpecifiedResidueNumsList</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;, for \&quot;--Residues\&quot; option during \&quot;ResiduesRange\&quot; value of \&quot;-m --mode\&quot; option: The number of values must be 2 corresponding to start and end residue numbers.\n&quot;</span><span class="sc">;</span>
 858         <span class="s">}</span>
 859         <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedResidueNumsList</span>[<span class="n">0</span>] &gt; <span class="i">$SpecifiedResidueNumsList</span>[<span class="n">1</span>]<span class="s">)</span> <span class="s">{</span>
 860           <span class="k">die</span> <span class="q">&quot;Error: Invalid residue number values, @SpecifiedResidueNumsList, for \&quot;--Residues\&quot; option during \&quot;ResiduesRange\&quot; value of \&quot;-m --mode\&quot; option: The start residue number must be less than end residue number.\n&quot;</span><span class="sc">;</span>
 861         <span class="s">}</span>
 862         <span class="s">(</span><span class="i">$StartResidueNum</span><span class="cm">,</span> <span class="i">$EndResNum</span><span class="s">)</span> = <span class="i">@SpecifiedResidueNumsList</span><span class="sc">;</span>
 863       <span class="s">}</span>
 864     <span class="s">}</span>
 865   <span class="s">}</span>
 866 
 867   <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNumsList</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 868   <span class="k">push</span> <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNumsList</span>}}<span class="cm">,</span> <span class="i">@SpecifiedResidueNumsList</span><span class="sc">;</span>
 869 
 870   <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedStartResidueNum</span>} = <span class="i">$StartResidueNum</span><span class="sc">;</span>
 871   <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedEndResidueNum</span>} = <span class="i">$EndResNum</span><span class="sc">;</span>
 872 
 873   <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNamesList</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 874   <span class="k">push</span> <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNamesList</span>}}<span class="cm">,</span> <span class="i">@SpecifiedResidueNamesList</span><span class="sc">;</span>
 875 
 876   <span class="c"># Set up a specified residue numbers map...</span>
 877   <span class="i">%</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNumsMap</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 878   <span class="k">for</span> <span class="i">$ResidueNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNumsList</span>}}<span class="s">)</span> <span class="s">{</span>
 879     <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNumsMap</span>}{<span class="i">$ResidueNum</span>} = <span class="i">$ResidueNum</span><span class="sc">;</span>
 880   <span class="s">}</span>
 881 
 882   <span class="c"># Set up a specified residue names map...</span>
 883   <span class="i">%</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNamesMap</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 884   <span class="k">for</span> <span class="i">$ResidueName</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNamesList</span>}}<span class="s">)</span> <span class="s">{</span>
 885     <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedResidueNamesMap</span>}{<span class="k">lc</span> <span class="i">$ResidueName</span>} = <span class="k">lc</span> <span class="i">$ResidueName</span><span class="sc">;</span>
 886   <span class="s">}</span>
 887 
 888 <span class="s">}</span>
 889 
 890 <span class="c"># Process specified atom options...</span>
<a name="ProcessAtomsOptions-"></a> 891 <span class="k">sub </span><span class="m">ProcessAtomsOptions</span> <span class="s">{</span>
 892   <span class="k">my</span><span class="s">(</span><span class="i">$AtomNum</span><span class="cm">,</span> <span class="i">$StartAtomNum</span><span class="cm">,</span> <span class="i">$EndAtomNum</span><span class="cm">,</span> <span class="i">$AtomName</span><span class="cm">,</span> <span class="i">@SpecifiedAtomNumsList</span><span class="cm">,</span> <span class="i">@SpecifiedAtomNamesList</span><span class="s">)</span><span class="sc">;</span>
 893 
 894   <span class="i">@SpecifiedAtomNumsList</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 895   <span class="s">(</span><span class="i">$StartAtomNum</span><span class="cm">,</span> <span class="i">$EndAtomNum</span><span class="s">)</span> = <span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span>
 896 
 897   <span class="i">@SpecifiedAtomNamesList</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 898 
 899   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^(AtomNums|AtomsRange|AtomNames)$/i</span><span class="s">)</span> <span class="s">{</span>
 900     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Options</span>{<span class="w">atoms</span>}<span class="s">)</span> <span class="s">{</span>
 901       <span class="k">die</span> <span class="q">&quot;Error: You must specify a value for \&quot;--Atoms\&quot; option in \&quot;AtomNums, AtomsRange, or AtomNames\&quot; \&quot;-m, --mode\&quot;. \n&quot;</span><span class="sc">;</span>
 902     <span class="s">}</span>
 903     <span class="i">$OptionsInfo</span>{<span class="w">Atoms</span>} = <span class="i">$Options</span>{<span class="w">atoms</span>}<span class="sc">;</span>
 904     <span class="i">$OptionsInfo</span>{<span class="w">Atoms</span>} =~ <span class="q">s/ //g</span><span class="sc">;</span>
 905 
 906     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^AtomNames$/i</span><span class="s">)</span> <span class="s">{</span>
 907       <span class="i">@SpecifiedAtomNamesList</span> = <span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">Atoms</span>}<span class="sc">;</span>
 908     <span class="s">}</span>
 909     <span class="k">else</span> <span class="s">{</span>
 910       <span class="i">@SpecifiedAtomNumsList</span> = <span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">Atoms</span>}<span class="sc">;</span>
 911       <span class="k">for</span> <span class="i">$AtomNum</span> <span class="s">(</span><span class="i">@SpecifiedAtomNumsList</span><span class="s">)</span> <span class="s">{</span>
 912         <span class="k">if</span> <span class="s">(</span>!<span class="i">IsPositiveInteger</span><span class="s">(</span><span class="i">$AtomNum</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 913           <span class="k">die</span> <span class="q">&quot;Error: Invalid atom number value, $AtomNum, for \&quot;--Atoms\&quot; option during \&quot;AtomNums\&quot; or \&quot;AtomsRange\&quot;value of \&quot;-m --mode\&quot; option: Atom number must be a positive integer.\n&quot;</span><span class="sc">;</span>
 914         <span class="s">}</span>
 915       <span class="s">}</span>
 916       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^AtomsRange$/i</span><span class="s">)</span> <span class="s">{</span>
 917         <span class="k">if</span> <span class="s">(</span><span class="i">@SpecifiedAtomNumsList</span> != <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 918           <span class="k">die</span> <span class="q">&quot;Error: Invalid number of atom number values, &quot;</span><span class="cm">,</span> <span class="k">scalar</span><span class="s">(</span><span class="i">@SpecifiedAtomNumsList</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;, for \&quot;--Atoms\&quot; option during \&quot;AtomsRange\&quot; value of \&quot;-m --mode\&quot; option: The number of values must be 2 corresponding to start and end atom numbers.\n&quot;</span><span class="sc">;</span>
 919         <span class="s">}</span>
 920         <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedAtomNumsList</span>[<span class="n">0</span>] &gt; <span class="i">$SpecifiedAtomNumsList</span>[<span class="n">1</span>]<span class="s">)</span> <span class="s">{</span>
 921           <span class="k">die</span> <span class="q">&quot;Error: Invalid atom number values, @SpecifiedAtomNumsList, for \&quot;--Atoms\&quot; option during \&quot;AtomsRange\&quot; value of \&quot;-m --mode\&quot; option: The start atom number must be less than end atom number.\n&quot;</span><span class="sc">;</span>
 922         <span class="s">}</span>
 923         <span class="s">(</span><span class="i">$StartAtomNum</span><span class="cm">,</span> <span class="i">$EndAtomNum</span><span class="s">)</span> = <span class="i">@SpecifiedAtomNumsList</span><span class="sc">;</span>
 924       <span class="s">}</span>
 925     <span class="s">}</span>
 926   <span class="s">}</span>
 927   <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^CAlphas$/i</span><span class="s">)</span> <span class="s">{</span>
 928     <span class="i">@SpecifiedAtomNamesList</span> = <span class="s">(</span><span class="q">&quot;CA&quot;</span><span class="s">)</span><span class="sc">;</span>
 929   <span class="s">}</span>
 930 
 931   <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNumsList</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 932   <span class="k">push</span> <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNumsList</span>}}<span class="cm">,</span> <span class="i">@SpecifiedAtomNumsList</span><span class="sc">;</span>
 933 
 934   <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedStartAtomNum</span>} = <span class="i">$StartAtomNum</span><span class="sc">;</span>
 935   <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedEndAtomNum</span>} = <span class="i">$EndAtomNum</span><span class="sc">;</span>
 936 
 937   <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNamesList</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 938   <span class="k">push</span> <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNamesList</span>}}<span class="cm">,</span> <span class="i">@SpecifiedAtomNamesList</span><span class="sc">;</span>
 939 
 940   <span class="c"># Set up a specified residue numbers map...</span>
 941   <span class="i">%</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNumsMap</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 942   <span class="k">for</span> <span class="i">$AtomNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNumsList</span>}}<span class="s">)</span> <span class="s">{</span>
 943     <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNumsMap</span>}{<span class="i">$AtomNum</span>} = <span class="i">$AtomNum</span><span class="sc">;</span>
 944   <span class="s">}</span>
 945 
 946   <span class="c"># Set up a specified residue names map...</span>
 947   <span class="i">%</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNamesMap</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 948   <span class="k">for</span> <span class="i">$AtomName</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNamesList</span>}}<span class="s">)</span> <span class="s">{</span>
 949     <span class="i">$OptionsInfo</span>{<span class="w">SpecifiedAtomNamesMap</span>}{<span class="k">lc</span> <span class="i">$AtomName</span>} = <span class="k">lc</span> <span class="i">$AtomName</span><span class="sc">;</span>
 950   <span class="s">}</span>
 951 
 952 <span class="s">}</span>
 953 
 954 <span class="c"># Process specified distance options...</span>
<a name="ProcessDistanceOptions-"></a> 955 <span class="k">sub </span><span class="m">ProcessDistanceOptions</span> <span class="s">{</span>
 956   <span class="k">my</span><span class="s">(</span><span class="i">@SpecifiedDistanceOrigin</span><span class="s">)</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 957 
 958   <span class="i">$OptionsInfo</span>{<span class="w">MaxExtractionDistance</span>} = <span class="i">$Options</span>{<span class="w">distance</span>}<span class="sc">;</span>
 959   <span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} = <span class="i">$Options</span>{<span class="w">distancemode</span>}<span class="sc">;</span>
 960   <span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceOrigin</span>} = <span class="i">$Options</span>{<span class="w">distanceorigin</span>} ? <span class="i">$Options</span>{<span class="w">distanceorigin</span>} <span class="co">:</span> <span class="q">&#39;&#39;</span><span class="sc">;</span>
 961   <span class="i">$OptionsInfo</span>{<span class="w">DistanceSelectionMode</span>} = <span class="i">$Options</span>{<span class="w">distanceselectionmode</span>}<span class="sc">;</span>
 962 
 963   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^Distance$/i</span><span class="s">)</span> <span class="s">{</span>
 964     <span class="k">if</span> <span class="s">(</span>!<span class="i">$Options</span>{<span class="w">distanceorigin</span>}<span class="s">)</span> <span class="s">{</span>
 965       <span class="k">die</span> <span class="q">&quot;Error: You must specify a value for \&quot;--distanceorigin\&quot; option in \&quot;Distance\&quot; \&quot;-m, --mode\&quot;. \n&quot;</span><span class="sc">;</span>
 966     <span class="s">}</span>
 967     <span class="i">@SpecifiedDistanceOrigin</span> = <span class="k">split</span> <span class="q">/\,/</span><span class="cm">,</span> <span class="i">$Options</span>{<span class="w">distanceorigin</span>}<span class="sc">;</span>
 968     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^Atom$/i</span><span class="s">)</span> <span class="s">{</span>
 969       <span class="k">if</span> <span class="s">(</span><span class="i">@SpecifiedDistanceOrigin</span> != <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 970         <span class="k">die</span> <span class="q">&quot;Error: Invalid number of values, &quot;</span><span class="cm">,</span> <span class="k">scalar</span><span class="s">(</span><span class="i">@SpecifiedDistanceOrigin</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot; for option \&quot;distanceorigin\&quot; option during \&quot;Atom\&quot; value of \&quot;--distancemode\&quot; : The number of values must be 2.\n&quot;</span><span class="sc">;</span>
 971       <span class="s">}</span>
 972       <span class="k">if</span> <span class="s">(</span>!<span class="i">IsPositiveInteger</span><span class="s">(</span><span class="i">$SpecifiedDistanceOrigin</span>[<span class="n">0</span>]<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 973         <span class="k">die</span> <span class="q">&quot;Error: Invalid atom number value, &quot;</span><span class="cm">,</span> <span class="i">$SpecifiedDistanceOrigin</span>[<span class="n">0</span>]<span class="cm">,</span> <span class="q">&quot;, for option \&quot;distanceorigin\&quot; option during \&quot;Atom\&quot; value of \&quot;--distancemode\&quot;. Allowed values: &gt; 0\n&quot;</span><span class="sc">;</span>
 974       <span class="s">}</span>
 975     <span class="s">}</span>
 976     <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^Hetatm$/i</span><span class="s">)</span> <span class="s">{</span>
 977       <span class="k">if</span> <span class="s">(</span><span class="i">@SpecifiedDistanceOrigin</span> != <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 978         <span class="k">die</span> <span class="q">&quot;Error: Invalid number of values, &quot;</span><span class="cm">,</span> <span class="k">scalar</span><span class="s">(</span><span class="i">@SpecifiedDistanceOrigin</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot; for option \&quot;distanceorigin\&quot; option during \&quot;Hetatm\&quot; value of \&quot;--distancemode\&quot; : The number of values must be 2.\n&quot;</span><span class="sc">;</span>
 979       <span class="s">}</span>
 980       <span class="k">if</span> <span class="s">(</span>!<span class="i">IsPositiveInteger</span><span class="s">(</span><span class="i">$SpecifiedDistanceOrigin</span>[<span class="n">0</span>]<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 981         <span class="k">die</span> <span class="q">&quot;Error: Invalid hetatm number value, &quot;</span><span class="cm">,</span> <span class="i">$SpecifiedDistanceOrigin</span>[<span class="n">0</span>]<span class="cm">,</span> <span class="q">&quot;, for option \&quot;distanceorigin\&quot; option during \&quot;Hetatm\&quot; value of \&quot;--distancemode\&quot;. Allowed values: &gt; 0\n&quot;</span><span class="sc">;</span>
 982       <span class="s">}</span>
 983     <span class="s">}</span>
 984     <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^Residue$/i</span><span class="s">)</span> <span class="s">{</span>
 985       <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">@SpecifiedDistanceOrigin</span> == <span class="n">2</span> || <span class="i">@SpecifiedDistanceOrigin</span> == <span class="n">3</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 986         <span class="k">die</span> <span class="q">&quot;Error: Invalid number of values, &quot;</span><span class="cm">,</span> <span class="k">scalar</span><span class="s">(</span><span class="i">@SpecifiedDistanceOrigin</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot; for option \&quot;distanceorigin\&quot; option during \&quot;Residue\&quot; value of \&quot;--distancemode\&quot; : The number of values must be either 2 or 3.\n&quot;</span><span class="sc">;</span>
 987       <span class="s">}</span>
 988       <span class="k">if</span> <span class="s">(</span>!<span class="i">IsPositiveInteger</span><span class="s">(</span><span class="i">$SpecifiedDistanceOrigin</span>[<span class="n">0</span>]<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 989         <span class="k">die</span> <span class="q">&quot;Error: Invalid residue number value, &quot;</span><span class="cm">,</span> <span class="i">$SpecifiedDistanceOrigin</span>[<span class="n">0</span>]<span class="cm">,</span> <span class="q">&quot;, for option \&quot;distanceorigin\&quot; option during \&quot;Residue\&quot; value of \&quot;--distancemode\&quot;. Allowed values: &gt; 0\n&quot;</span><span class="sc">;</span>
 990       <span class="s">}</span>
 991     <span class="s">}</span>
 992     <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^XYZ$/i</span><span class="s">)</span> <span class="s">{</span>
 993       <span class="k">if</span> <span class="s">(</span><span class="i">@SpecifiedDistanceOrigin</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 994         <span class="k">die</span> <span class="q">&quot;Error: Invalid number of values, &quot;</span><span class="cm">,</span> <span class="k">scalar</span><span class="s">(</span><span class="i">@SpecifiedDistanceOrigin</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot; for option \&quot;distanceorigin\&quot; option during \&quot;XYZ\&quot; value of \&quot;--distancemode\&quot; : The number of values must be 3.\n&quot;</span><span class="sc">;</span>
 995       <span class="s">}</span>
 996       <span class="k">my</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 997       <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@SpecifiedDistanceOrigin</span><span class="s">)</span> <span class="s">{</span>
 998         <span class="k">if</span> <span class="s">(</span>!<span class="i">IsNumerical</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 999           <span class="k">die</span> <span class="q">&quot;Error: Invalid coordinate value, &quot;</span><span class="cm">,</span> <span class="i">$SpecifiedDistanceOrigin</span>[<span class="n">0</span>]<span class="cm">,</span> <span class="q">&quot;, for option \&quot;distanceorigin\&quot; option during \&quot;XYZ\&quot; value of \&quot;--distancemode\&quot;. Allowed values: numerical\n&quot;</span><span class="sc">;</span>
1000         <span class="s">}</span>
1001       <span class="s">}</span>
1002     <span class="s">}</span>
1003   <span class="s">}</span>
1004   <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedExtractionDistanceOrigin</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1005   <span class="k">push</span> <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedExtractionDistanceOrigin</span>}}<span class="cm">,</span> <span class="i">@SpecifiedDistanceOrigin</span><span class="sc">;</span>
1006 
1007 <span class="s">}</span>
1008 
1009 <span class="c"># Retrieve information about PDB files...</span>
<a name="RetrievePDBFilesInfo-"></a>1010 <span class="k">sub </span><span class="m">RetrievePDBFilesInfo</span> <span class="s">{</span>
1011   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$PDBFile</span><span class="cm">,</span> <span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="cm">,</span> <span class="i">$ChainLabel</span><span class="cm">,</span> <span class="i">$ChainsAndResiduesInfoRef</span><span class="cm">,</span> <span class="i">$Mode</span><span class="cm">,</span> <span class="i">$FileDir</span><span class="cm">,</span> <span class="i">$FileName</span><span class="cm">,</span> <span class="i">$FileExt</span><span class="cm">,</span> <span class="i">$OutFileName</span><span class="cm">,</span> <span class="i">$OutFileRoot</span><span class="cm">,</span> <span class="i">@SpecifiedChains</span><span class="cm">,</span> <span class="i">@DistanceOrigin</span><span class="cm">,</span> <span class="i">@OutFileNames</span><span class="cm">,</span> <span class="i">@ChainLabels</span><span class="cm">,</span> <span class="i">@ChainSequenceIDs</span><span class="cm">,</span> <span class="i">@ChainSequenceIDsPrefix</span><span class="s">)</span><span class="sc">;</span>
1012 
1013   <span class="i">%PDBFilesInfo</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1014   <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">FileOkay</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1015   <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">OutFileRoot</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1016   <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1017   <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">ChainLabels</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1018   <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">ChainSequenceIDs</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1019   <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">ChainSequenceIDsPrefix</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1020   <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1021   <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">DistanceOrigin</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1022 
1023   <span class="j">FILELIST:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#PDBFilesList</span><span class="s">)</span> <span class="s">{</span>
1024     <span class="i">$PDBFilesInfo</span>{<span class="w">FileOkay</span>}[<span class="i">$Index</span>] = <span class="n">0</span><span class="sc">;</span>
1025 
1026     <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileRoot</span>}[<span class="i">$Index</span>] = <span class="q">&#39;&#39;</span><span class="sc">;</span>
1027     <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1028     <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1029     <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">ChainLabels</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1030     <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">ChainSequenceIDs</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1031     <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">ChainSequenceIDsPrefix</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1032     <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1033     <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">DistanceOrigin</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1034 
1035     <span class="i">$PDBFile</span> = <span class="i">$PDBFilesList</span>[<span class="i">$Index</span>]<span class="sc">;</span>
1036     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">-e</span> <span class="i">$PDBFile</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1037       <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $PDBFile: It doesn&#39;t exist\n&quot;</span><span class="sc">;</span>
1038       <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
1039     <span class="s">}</span>
1040     <span class="k">if</span> <span class="s">(</span>!<span class="i">CheckFileType</span><span class="s">(</span><span class="i">$PDBFile</span><span class="cm">,</span> <span class="q">&quot;pdb&quot;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1041       <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $PDBFile: It&#39;s not a PDB file\n&quot;</span><span class="sc">;</span>
1042       <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
1043     <span class="s">}</span>
1044     <span class="k">if</span> <span class="s">(</span>! <span class="k">open</span> <span class="w">PDBFILE</span><span class="cm">,</span> <span class="q">&quot;$PDBFile&quot;</span><span class="s">)</span> <span class="s">{</span>
1045       <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $PDBFile: Couldn&#39;t open it: $! \n&quot;</span><span class="sc">;</span>
1046       <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
1047     <span class="s">}</span>
1048     <span class="k">close</span> <span class="w">PDBFILE</span><span class="sc">;</span>
1049 
1050     <span class="c"># Get PDB data...</span>
1051     <span class="i">$PDBRecordLinesRef</span> = <span class="i">ReadPDBFile</span><span class="s">(</span><span class="i">$PDBFile</span><span class="s">)</span><span class="sc">;</span>
1052     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^Sequences$/i</span> &amp;&amp; <span class="i">$OptionsInfo</span>{<span class="w">SequenceRecordSource</span>} =~ <span class="q">/^SeqRes$/i</span><span class="s">)</span> <span class="s">{</span>
1053       <span class="i">$ChainsAndResiduesInfoRef</span> = <span class="i">GetChainsAndResidues</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="cm">,</span> <span class="q">&#39;SeqRes&#39;</span><span class="s">)</span><span class="sc">;</span>
1054     <span class="s">}</span>
1055     <span class="k">else</span> <span class="s">{</span>
1056       <span class="i">$ChainsAndResiduesInfoRef</span> = <span class="i">GetChainsAndResidues</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
1057     <span class="s">}</span>
1058     <span class="k">if</span> <span class="s">(</span>!<span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ChainsAndResiduesInfoRef</span>-&gt;{<span class="w">ChainIDs</span>}}<span class="s">)</span> <span class="s">{</span>
1059       <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $PDBFile: No chains found \n&quot;</span><span class="sc">;</span>
1060       <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
1061     <span class="s">}</span>
1062 
1063     <span class="c"># Make sure specified chains exist in PDB file...</span>
1064     <span class="i">@SpecifiedChains</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1065     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ChainsToExtract</span>} =~ <span class="q">/^Specified$/i</span><span class="s">)</span> <span class="s">{</span>
1066       <span class="k">for</span> <span class="i">$ChainID</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedChains</span>}}<span class="s">)</span> <span class="s">{</span>
1067         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ChainsAndResiduesInfoRef</span>-&gt;{<span class="w">Residues</span>}{<span class="i">$ChainID</span>}<span class="s">)</span> <span class="s">{</span>
1068           <span class="k">push</span> <span class="i">@SpecifiedChains</span><span class="cm">,</span> <span class="i">$ChainID</span><span class="sc">;</span>
1069         <span class="s">}</span>
1070         <span class="k">else</span> <span class="s">{</span>
1071           <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $PDBFile: Specified chain, $ChainID, in \&quot;-c, --chains\&quot; option doesn&#39;t exist.\n&quot;</span><span class="sc">;</span>
1072           <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
1073         <span class="s">}</span>
1074       <span class="s">}</span>
1075     <span class="s">}</span>
1076     <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ChainsToExtract</span>} =~ <span class="q">/^First$/i</span><span class="s">)</span> <span class="s">{</span>
1077       <span class="k">push</span> <span class="i">@SpecifiedChains</span><span class="cm">,</span> <span class="i">$ChainsAndResiduesInfoRef</span>-&gt;{<span class="w">ChainIDs</span>}[<span class="n">0</span>]<span class="sc">;</span>
1078     <span class="s">}</span>
1079     <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ChainsToExtract</span>} =~ <span class="q">/^All$/i</span><span class="s">)</span> <span class="s">{</span>
1080       <span class="k">push</span> <span class="i">@SpecifiedChains</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$ChainsAndResiduesInfoRef</span>-&gt;{<span class="w">ChainIDs</span>}}<span class="sc">;</span>
1081     <span class="s">}</span>
1082     <span class="c"># Setup chain labels to use for sequence IDs and generating output files...</span>
1083     <span class="i">@ChainLabels</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1084     <span class="k">for</span> <span class="i">$ChainID</span> <span class="s">(</span><span class="i">@SpecifiedChains</span><span class="s">)</span> <span class="s">{</span>
1085       <span class="i">$ChainLabel</span> = <span class="i">$ChainID</span><span class="sc">;</span> <span class="i">$ChainLabel</span> =~ <span class="q">s/^None//ig</span><span class="sc">;</span>
1086       <span class="i">$ChainLabel</span> = <span class="q">&quot;Chain${ChainLabel}&quot;</span><span class="sc">;</span>
1087       <span class="k">push</span> <span class="i">@ChainLabels</span><span class="cm">,</span> <span class="i">$ChainLabel</span><span class="sc">;</span>
1088     <span class="s">}</span>
1089 
1090     <span class="c"># Make sure specified distance origin is valid...</span>
1091     <span class="i">@DistanceOrigin</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1092     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^Distance$/i</span><span class="s">)</span> <span class="s">{</span>
1093       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^(Atom|Hetatm)$/i</span><span class="s">)</span> <span class="s">{</span>
1094         <span class="k">my</span><span class="s">(</span><span class="i">$RecordType</span><span class="cm">,</span> <span class="i">$SpecifiedAtomName</span><span class="cm">,</span> <span class="i">$SpecifiedAtomNumber</span><span class="cm">,</span> <span class="i">$RecordFound</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">$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">$RecordLine</span><span class="s">)</span><span class="sc">;</span>
1095         <span class="i">$RecordType</span> = <span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>}<span class="sc">;</span>
1096         <span class="s">(</span><span class="i">$SpecifiedAtomNumber</span><span class="cm">,</span> <span class="i">$SpecifiedAtomName</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedExtractionDistanceOrigin</span>}}<span class="sc">;</span>
1097         <span class="i">$RecordFound</span> = <span class="n">0</span><span class="sc">;</span>
1098         <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>
1099           <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>
1100             <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span>
1101           <span class="s">}</span>
1102           <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="s">)</span> = <span class="i">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span>
1103           <span class="i">$AtomName</span> = <span class="i">RemoveLeadingAndTrailingWhiteSpaces</span><span class="s">(</span><span class="i">$AtomName</span><span class="s">)</span><span class="sc">;</span>
1104           <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">$RecordType</span> =~ <span class="q">/^Atom$/i</span> &amp;&amp; <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><span class="i">$RecordType</span> =~ <span class="q">/^Hetatm$/i</span> &amp;&amp; <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>
1105             <span class="k">if</span> <span class="s">(</span><span class="i">$AtomNumber</span> == <span class="i">$SpecifiedAtomNumber</span> &amp;&amp; <span class="i">$AtomName</span> <span class="k">eq</span> <span class="i">$SpecifiedAtomName</span><span class="s">)</span> <span class="s">{</span>
1106               <span class="i">$RecordFound</span> = <span class="n">1</span><span class="sc">;</span>
1107               <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span>
1108             <span class="s">}</span>
1109           <span class="s">}</span>
1110         <span class="s">}</span>
1111         <span class="k">if</span> <span class="s">(</span>!<span class="i">$RecordFound</span><span class="s">)</span> <span class="s">{</span>
1112           <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $PDBFile: &quot;</span><span class="cm">,</span> <span class="k">uc</span><span class="s">(</span><span class="i">$RecordType</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot; record corresponding to \&quot;--distanceorigin\&quot; option value, $OptionsInfo{ExtractionDistanceOrigin}, doesn&#39;t exist.\n&quot;</span><span class="sc">;</span>
1113           <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
1114         <span class="s">}</span>
1115         <span class="k">push</span> <span class="i">@DistanceOrigin</span><span class="cm">,</span> <span class="s">(</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="s">)</span><span class="sc">;</span>
1116       <span class="s">}</span>
1117       <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^Residue$/i</span><span class="s">)</span> <span class="s">{</span>
1118         <span class="k">my</span><span class="s">(</span><span class="i">$SpecifiedResidueNumber</span><span class="cm">,</span> <span class="i">$SpecifiedResidueName</span><span class="cm">,</span> <span class="i">$SpecifiedChainID</span><span class="cm">,</span> <span class="i">$RecordFound</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">$RecordLine</span><span class="s">)</span><span class="sc">;</span>
1119         <span class="i">$SpecifiedChainID</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
1120         <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedExtractionDistanceOrigin</span>}} == <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
1121           <span class="s">(</span><span class="i">$SpecifiedResidueNumber</span><span class="cm">,</span> <span class="i">$SpecifiedResidueName</span><span class="cm">,</span> <span class="i">$SpecifiedChainID</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedExtractionDistanceOrigin</span>}}<span class="sc">;</span>
1122         <span class="s">}</span>
1123         <span class="k">else</span> <span class="s">{</span>
1124           <span class="s">(</span><span class="i">$SpecifiedResidueNumber</span><span class="cm">,</span> <span class="i">$SpecifiedResidueName</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedExtractionDistanceOrigin</span>}}<span class="sc">;</span>
1125         <span class="s">}</span>
1126         <span class="i">$RecordFound</span> = <span class="n">0</span><span class="sc">;</span>
1127         <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>
1128           <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>
1129             <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span>
1130           <span class="s">}</span>
1131           <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="s">)</span> = <span class="i">ParseAtomRecordLine</span><span class="s">(</span><span class="i">$RecordLine</span><span class="s">)</span><span class="sc">;</span>
1132           <span class="i">$ResidueName</span> = <span class="i">RemoveLeadingAndTrailingWhiteSpaces</span><span class="s">(</span><span class="i">$ResidueName</span><span class="s">)</span><span class="sc">;</span>
1133           <span class="i">$ChainID</span> = <span class="i">RemoveLeadingAndTrailingWhiteSpaces</span><span class="s">(</span><span class="i">$ChainID</span><span class="s">)</span><span class="sc">;</span>
1134           <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedChainID</span> &amp;&amp; <span class="s">(</span><span class="i">$SpecifiedChainID</span> <span class="k">ne</span> <span class="i">$ChainID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1135             <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span>
1136           <span class="s">}</span>
1137           <span class="k">if</span> <span class="s">(</span><span class="i">$ResidueNumber</span> == <span class="i">$SpecifiedResidueNumber</span> &amp;&amp; <span class="i">$ResidueName</span> <span class="k">eq</span> <span class="i">$SpecifiedResidueName</span><span class="s">)</span> <span class="s">{</span>
1138             <span class="c"># Store coordinates for all the atoms...</span>
1139             <span class="i">$RecordFound</span> = <span class="n">1</span><span class="sc">;</span>
1140             <span class="k">push</span> <span class="i">@DistanceOrigin</span><span class="cm">,</span> <span class="s">(</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="s">)</span><span class="sc">;</span>
1141             <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span>
1142           <span class="s">}</span>
1143         <span class="s">}</span>
1144         <span class="k">if</span> <span class="s">(</span>!<span class="i">$RecordFound</span><span class="s">)</span> <span class="s">{</span>
1145           <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $PDBFile: ATOM/HETATM record corresponding to \&quot;--distanceorigin\&quot; option value, $OptionsInfo{ExtractionDistanceOrigin}, doesn&#39;t exist.\n&quot;</span><span class="sc">;</span>
1146           <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
1147         <span class="s">}</span>
1148       <span class="s">}</span>
1149       <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^XYZ$/i</span><span class="s">)</span> <span class="s">{</span>
1150         <span class="k">push</span> <span class="i">@DistanceOrigin</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">SpecifiedExtractionDistanceOrigin</span>}}<span class="sc">;</span>
1151       <span class="s">}</span>
1152     <span class="s">}</span>
1153     <span class="c"># Setup output file names...</span>
1154     <span class="i">@OutFileNames</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1155     <span class="i">$FileDir</span> = <span class="q">&quot;&quot;</span><span class="sc">;</span> <span class="i">$FileName</span> = <span class="q">&quot;&quot;</span><span class="sc">;</span> <span class="i">$FileExt</span> = <span class="q">&quot;&quot;</span><span class="sc">;</span>
1156     <span class="s">(</span><span class="i">$FileDir</span><span class="cm">,</span> <span class="i">$FileName</span><span class="cm">,</span> <span class="i">$FileExt</span><span class="s">)</span> = <span class="i">ParseFileName</span><span class="s">(</span><span class="i">$PDBFile</span><span class="s">)</span><span class="sc">;</span>
1157     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">OutFileRoot</span>} &amp;&amp; <span class="s">(</span><span class="i">@PDBFilesList</span> == <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1158       <span class="k">my</span> <span class="s">(</span><span class="i">$RootFileDir</span><span class="cm">,</span> <span class="i">$RootFileName</span><span class="cm">,</span> <span class="i">$RootFileExt</span><span class="s">)</span> = <span class="i">ParseFileName</span><span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">OutFileRoot</span>}<span class="s">)</span><span class="sc">;</span>
1159       <span class="k">if</span> <span class="s">(</span><span class="i">$RootFileName</span> &amp;&amp; <span class="i">$RootFileExt</span><span class="s">)</span> <span class="s">{</span>
1160         <span class="i">$FileName</span> = <span class="i">$RootFileName</span><span class="sc">;</span>
1161       <span class="s">}</span>
1162       <span class="k">else</span> <span class="s">{</span>
1163         <span class="i">$FileName</span> = <span class="i">$OptionsInfo</span>{<span class="w">OutFileRoot</span>}<span class="sc">;</span>
1164       <span class="s">}</span>
1165       <span class="i">$OutFileRoot</span> = <span class="i">$FileName</span><span class="sc">;</span>
1166     <span class="s">}</span>
1167     <span class="k">else</span> <span class="s">{</span>
1168       <span class="i">$OutFileRoot</span> = <span class="i">$FileName</span><span class="sc">;</span>
1169     <span class="s">}</span>
1170     <span class="i">$Mode</span> = <span class="i">$OptionsInfo</span>{<span class="w">Mode</span>}<span class="sc">;</span>
1171     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^(Atoms|CAlphas|AtomNums|AtomsRange|AtomNames|ResidueNums|ResiduesRange|ResidueNames|Distance|NonWater|NonHydrogens)$/i</span><span class="s">)</span> <span class="s">{</span>
1172       <span class="i">$OutFileName</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
1173       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^CAlphas$/i</span><span class="s">)</span> <span class="s">{</span>
1174         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}CAlphas.pdb&quot;</span><span class="sc">;</span>
1175       <span class="s">}</span>
1176       <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^Atoms$/i</span><span class="s">)</span> <span class="s">{</span>
1177         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}Atoms.pdb&quot;</span><span class="sc">;</span>
1178       <span class="s">}</span>
1179       <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AtomNums$/i</span><span class="s">)</span> <span class="s">{</span>
1180         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}AtomNums.pdb&quot;</span><span class="sc">;</span>
1181       <span class="s">}</span>
1182       <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AtomsRange$/i</span><span class="s">)</span> <span class="s">{</span>
1183         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}AtomsRange.pdb&quot;</span><span class="sc">;</span>
1184       <span class="s">}</span>
1185       <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AtomNames$/i</span><span class="s">)</span> <span class="s">{</span>
1186         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}AtomNames.pdb&quot;</span><span class="sc">;</span>
1187       <span class="s">}</span>
1188       <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^ResidueNums$/i</span><span class="s">)</span> <span class="s">{</span>
1189         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}ResidueNums.pdb&quot;</span><span class="sc">;</span>
1190       <span class="s">}</span>
1191       <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^ResiduesRange$/i</span><span class="s">)</span> <span class="s">{</span>
1192         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}ResiduesRange.pdb&quot;</span><span class="sc">;</span>
1193       <span class="s">}</span>
1194       <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^ResidueNames$/i</span><span class="s">)</span> <span class="s">{</span>
1195         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}ResidueNames.pdb&quot;</span><span class="sc">;</span>
1196       <span class="s">}</span>
1197       <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^NonWater$/i</span><span class="s">)</span> <span class="s">{</span>
1198         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}NonWater.pdb&quot;</span><span class="sc">;</span>
1199       <span class="s">}</span>
1200       <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^NonHydrogens$/i</span><span class="s">)</span> <span class="s">{</span>
1201         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}NonHydrogens.pdb&quot;</span><span class="sc">;</span>
1202       <span class="s">}</span>
1203       <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^Distance$/i</span><span class="s">)</span> <span class="s">{</span>
1204         <span class="k">my</span><span class="s">(</span><span class="i">$DistanceMode</span><span class="s">)</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
1205         <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^Atom$/i</span><span class="s">)</span> <span class="s">{</span>
1206           <span class="i">$DistanceMode</span> = <span class="q">&#39;Atom&#39;</span><span class="sc">;</span>
1207         <span class="s">}</span>
1208         <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^Hetatm$/i</span><span class="s">)</span> <span class="s">{</span>
1209           <span class="i">$DistanceMode</span> = <span class="q">&#39;Hetatm&#39;</span><span class="sc">;</span>
1210         <span class="s">}</span>
1211         <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^Residue$/i</span><span class="s">)</span> <span class="s">{</span>
1212           <span class="i">$DistanceMode</span> = <span class="q">&#39;Residue&#39;</span><span class="sc">;</span>
1213         <span class="s">}</span>
1214         <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">ExtractionDistanceMode</span>} =~ <span class="q">/^XYZ$/i</span><span class="s">)</span> <span class="s">{</span>
1215           <span class="i">$DistanceMode</span> = <span class="q">&#39;XYZ&#39;</span><span class="sc">;</span>
1216         <span class="s">}</span>
1217         <span class="i">$OutFileName</span> = <span class="q">&quot;${OutFileRoot}DistanceBy${DistanceMode}.pdb&quot;</span><span class="sc">;</span>
1218       <span class="s">}</span>
1219       <span class="k">push</span> <span class="i">@OutFileNames</span><span class="cm">,</span> <span class="i">$OutFileName</span><span class="sc">;</span>
1220       <span class="k">if</span> <span class="s">(</span>!<span class="i">$OptionsInfo</span>{<span class="w">OverwriteFiles</span>} &amp;&amp; <span class="s">(</span><span class="k">-e</span> <span class="i">$OutFileName</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1221         <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $PDBFile: The file $OutFileName already exists\n&quot;</span><span class="sc">;</span>
1222         <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
1223       <span class="s">}</span>
1224     <span class="s">}</span>
1225     <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^(Chains|Sequences)$/i</span><span class="s">)</span> <span class="s">{</span>
1226       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">CombineChainSequences</span>}<span class="s">)</span> <span class="s">{</span>
1227         <span class="i">$OutFileName</span> = <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^Chains$/i</span><span class="s">)</span> ? <span class="q">&quot;${OutFileRoot}ExtractedChains.pdb&quot;</span> <span class="co">:</span> <span class="q">&quot;${OutFileRoot}SequencesChainsCombined.fasta&quot;</span><span class="sc">;</span>
1228         <span class="k">push</span> <span class="i">@OutFileNames</span><span class="cm">,</span> <span class="i">$OutFileName</span><span class="sc">;</span>
1229         <span class="k">if</span> <span class="s">(</span>!<span class="i">$OptionsInfo</span>{<span class="w">OverwriteFiles</span>} &amp;&amp; <span class="s">(</span><span class="k">-e</span> <span class="i">$OutFileName</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1230           <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $PDBFile: The file $OutFileName already exists\n&quot;</span><span class="sc">;</span>
1231           <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
1232         <span class="s">}</span>
1233       <span class="s">}</span>
1234       <span class="k">else</span> <span class="s">{</span>
1235         <span class="k">for</span> <span class="i">$ChainLabel</span> <span class="s">(</span><span class="i">@ChainLabels</span><span class="s">)</span> <span class="s">{</span>
1236           <span class="i">$OutFileName</span> = <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^Chains$/i</span><span class="s">)</span> ? <span class="q">&quot;${OutFileRoot}${ChainLabel}.pdb&quot;</span> <span class="co">:</span> <span class="q">&quot;${OutFileRoot}Sequences${ChainLabel}.fasta&quot;</span><span class="sc">;</span>
1237           <span class="k">push</span> <span class="i">@OutFileNames</span><span class="cm">,</span> <span class="i">$OutFileName</span><span class="sc">;</span>
1238           <span class="k">if</span> <span class="s">(</span>!<span class="i">$OptionsInfo</span>{<span class="w">OverwriteFiles</span>} &amp;&amp; <span class="s">(</span><span class="k">-e</span> <span class="i">$OutFileName</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1239             <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $PDBFile: The file $OutFileName already exists\n&quot;</span><span class="sc">;</span>
1240             <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
1241           <span class="s">}</span>
1242         <span class="s">}</span>
1243       <span class="s">}</span>
1244     <span class="s">}</span>
1245     <span class="i">@ChainSequenceIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1246     <span class="i">@ChainSequenceIDsPrefix</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1247     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^Sequences$/i</span><span class="s">)</span> <span class="s">{</span>
1248       <span class="k">my</span><span class="s">(</span><span class="i">$HeaderRecordLine</span><span class="cm">,</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="cm">,</span> <span class="i">$IDPrefix</span><span class="s">)</span><span class="sc">;</span>
1249       <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="i">GetHeaderRecordInformation</span><span class="s">(</span><span class="i">$PDBRecordLinesRef</span><span class="s">)</span><span class="sc">;</span>
1250 
1251       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">SequenceIDPrefixSource</span>} =~ <span class="q">/^FileName$/i</span><span class="s">)</span> <span class="s">{</span>
1252         <span class="i">$IDPrefix</span> = <span class="i">$FileName</span><span class="sc">;</span>
1253       <span class="s">}</span>
1254       <span class="k">elsif</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">SequenceIDPrefixSource</span>} =~ <span class="q">/^HeaderRecord$/i</span><span class="s">)</span> <span class="s">{</span>
1255         <span class="i">$IDPrefix</span> = <span class="i">IsNotEmpty</span><span class="s">(</span><span class="i">$IDCode</span><span class="s">)</span> ? <span class="i">$IDCode</span> <span class="co">:</span> <span class="q">&#39;&#39;</span><span class="sc">;</span>
1256       <span class="s">}</span>
1257       <span class="k">else</span> <span class="s">{</span>
1258         <span class="i">$IDPrefix</span> = <span class="i">IsNotEmpty</span><span class="s">(</span><span class="i">$IDCode</span><span class="s">)</span> ? <span class="i">$IDCode</span> <span class="co">:</span> <span class="i">$FileName</span><span class="sc">;</span>
1259       <span class="s">}</span>
1260 
1261       <span class="k">for</span> <span class="i">$ChainLabel</span> <span class="s">(</span><span class="i">@ChainLabels</span><span class="s">)</span> <span class="s">{</span>
1262         <span class="k">push</span> <span class="i">@ChainSequenceIDsPrefix</span><span class="cm">,</span> <span class="i">$IDPrefix</span><span class="sc">;</span>
1263         <span class="k">push</span> <span class="i">@ChainSequenceIDs</span><span class="cm">,</span> <span class="q">&quot;${IDPrefix}_${ChainLabel}|PDB&quot;</span><span class="sc">;</span>
1264       <span class="s">}</span>
1265     <span class="s">}</span>
1266 
1267     <span class="i">$PDBFilesInfo</span>{<span class="w">FileOkay</span>}[<span class="i">$Index</span>] = <span class="n">1</span><span class="sc">;</span>
1268     <span class="i">$PDBFilesInfo</span>{<span class="w">OutFileRoot</span>}[<span class="i">$Index</span>] = <span class="i">$OutFileRoot</span><span class="sc">;</span>
1269 
1270     <span class="k">push</span> <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">OutFileNames</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@OutFileNames</span><span class="sc">;</span>
1271     <span class="k">push</span> <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">ChainLabels</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@ChainLabels</span><span class="sc">;</span>
1272     <span class="k">push</span> <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">ChainSequenceIDsPrefix</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@ChainSequenceIDsPrefix</span><span class="sc">;</span>
1273     <span class="k">push</span> <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">ChainSequenceIDs</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@ChainSequenceIDs</span><span class="sc">;</span>
1274     <span class="k">push</span> <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">SpecifiedChains</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@SpecifiedChains</span><span class="sc">;</span>
1275     <span class="k">push</span> <span class="i">@</span>{<span class="i">$PDBFilesInfo</span>{<span class="w">DistanceOrigin</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@DistanceOrigin</span><span class="sc">;</span>
1276   <span class="s">}</span>
1277 <span class="s">}</span>
1278 
1279 
1280 <span class="c"># Setup script usage  and retrieve command line arguments specified using various options...</span>
<a name="SetupScriptUsage-"></a>1281 <span class="k">sub </span><span class="m">SetupScriptUsage</span> <span class="s">{</span>
1282 
1283   <span class="c"># Retrieve all the options...</span>
1284   <span class="i">%Options</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1285   <span class="i">$Options</span>{<span class="w">chains</span>} = <span class="q">&#39;First&#39;</span><span class="sc">;</span>
1286   <span class="i">$Options</span>{<span class="w">combinechains</span>} = <span class="q">&#39;no&#39;</span><span class="sc">;</span>
1287   <span class="i">$Options</span>{<span class="w">distance</span>} = <span class="n">10.0</span><span class="sc">;</span>
1288   <span class="i">$Options</span>{<span class="w">distancemode</span>} = <span class="q">&#39;XYZ&#39;</span><span class="sc">;</span>
1289   <span class="i">$Options</span>{<span class="w">distanceselectionmode</span>} = <span class="q">&#39;ByAtom&#39;</span><span class="sc">;</span>
1290   <span class="i">$Options</span>{<span class="w">keepoldrecords</span>} = <span class="q">&#39;no&#39;</span><span class="sc">;</span>
1291   <span class="i">$Options</span>{<span class="w">mode</span>} = <span class="q">&#39;NonWater&#39;</span><span class="sc">;</span>
1292   <span class="i">$Options</span>{<span class="w">modifyheader</span>} = <span class="q">&#39;yes&#39;</span><span class="sc">;</span>
1293   <span class="i">$Options</span>{<span class="w">nonstandardkeep</span>} = <span class="q">&#39;yes&#39;</span><span class="sc">;</span>
1294   <span class="i">$Options</span>{<span class="w">nonstandardcode</span>} = <span class="q">&#39;X&#39;</span><span class="sc">;</span>
1295   <span class="i">$Options</span>{<span class="w">sequencelength</span>} = <span class="n">80</span><span class="sc">;</span>
1296   <span class="i">$Options</span>{<span class="w">sequenceidprefix</span>} = <span class="q">&#39;Automatic&#39;</span><span class="sc">;</span>
1297   <span class="i">$Options</span>{<span class="w">sequencerecords</span>} = <span class="q">&#39;Atom&#39;</span><span class="sc">;</span>
1298   <span class="i">$Options</span>{<span class="w">waterresiduenames</span>} = <span class="q">&#39;Automatic&#39;</span><span class="sc">;</span>
1299 
1300   <span class="k">if</span> <span class="s">(</span>!<span class="i">GetOptions</span><span class="s">(</span>\<span class="i">%Options</span><span class="cm">,</span> <span class="q">&quot;atoms|a=s&quot;</span><span class="cm">,</span> <span class="q">&quot;chains|c=s&quot;</span><span class="cm">,</span> <span class="q">&quot;combinechains=s&quot;</span><span class="cm">,</span> <span class="q">&quot;distance|d=f&quot;</span><span class="cm">,</span> <span class="q">&quot;distancemode=s&quot;</span><span class="cm">,</span> <span class="q">&quot;distanceorigin=s&quot;</span><span class="cm">,</span> <span class="q">&quot;distanceselectionmode=s&quot;</span><span class="cm">,</span> <span class="q">&quot;help|h&quot;</span><span class="cm">,</span> <span class="q">&quot;keepoldrecords|k=s&quot;</span><span class="cm">,</span> <span class="q">&quot;mode|m=s&quot;</span><span class="cm">,</span> <span class="q">&quot;modifyheader=s&quot;</span><span class="cm">,</span> <span class="q">&quot;nonstandardkeep=s&quot;</span><span class="cm">,</span> <span class="q">&quot;nonstandardcode=s&quot;</span><span class="cm">,</span> <span class="q">&quot;overwrite|o&quot;</span><span class="cm">,</span> <span class="q">&quot;root|r=s&quot;</span><span class="cm">,</span> <span class="q">&quot;recordmode=s&quot;</span><span class="cm">,</span> <span class="q">&quot;residues=s&quot;</span><span class="cm">,</span> <span class="q">&quot;sequencelength=i&quot;</span><span class="cm">,</span> <span class="q">&quot;sequenceidprefix=s&quot;</span><span class="cm">,</span> <span class="q">&quot;sequencerecords=s&quot;</span><span class="cm">,</span> <span class="q">&quot;waterresiduenames=s&quot;</span><span class="cm">,</span> <span class="q">&quot;workingdir|w=s&quot;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1301     <span class="k">die</span> <span class="q">&quot;\nTo get a list of valid options and their values, use \&quot;$ScriptName -h\&quot; or\n\&quot;perl -S $ScriptName -h\&quot; command and try again...\n&quot;</span><span class="sc">;</span>
1302   <span class="s">}</span>
1303   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">workingdir</span>}<span class="s">)</span> <span class="s">{</span>
1304     <span class="k">if</span> <span class="s">(</span>! <span class="k">-d</span> <span class="i">$Options</span>{<span class="w">workingdir</span>}<span class="s">)</span> <span class="s">{</span>
1305       <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{workingdir}, for option \&quot;-w --workingdir\&quot; is not a directory name.\n&quot;</span><span class="sc">;</span>
1306     <span class="s">}</span>
1307     <span class="k">chdir</span> <span class="i">$Options</span>{<span class="w">workingdir</span>} <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Couldn&#39;t chdir $Options{workingdir}: $! \n&quot;</span><span class="sc">;</span>
1308   <span class="s">}</span>
1309   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">combinechains</span>} !~ <span class="q">/^(yes|no)$/i</span><span class="s">)</span> <span class="s">{</span>
1310     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{combinechains}, for option \&quot;--CombineChains\&quot; is not valid. Allowed values: yes or no\n&quot;</span><span class="sc">;</span>
1311   <span class="s">}</span>
1312   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">distancemode</span>} !~ <span class="q">/^(Atom|Hetatm|Residue|XYZ)$/i</span><span class="s">)</span> <span class="s">{</span>
1313     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{distancemode}, for option \&quot;--DistanceMode\&quot; is not valid. Allowed values: Atom, Hetatm, Residue, or XYZ\n&quot;</span><span class="sc">;</span>
1314   <span class="s">}</span>
1315   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">distanceselectionmode</span>} !~ <span class="q">/^(ByAtom|ByResidue)$/i</span><span class="s">)</span> <span class="s">{</span>
1316     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{distanceselectionmode}, for option \&quot;--DistanceSelectionMode\&quot; is not valid. Allowed values: ByAtom or ByResidue\n&quot;</span><span class="sc">;</span>
1317   <span class="s">}</span>
1318   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">keepoldrecords</span>} !~ <span class="q">/^(yes|no)$/i</span><span class="s">)</span> <span class="s">{</span>
1319     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{keepoldrecords}, for option \&quot;--KeepOldRecords\&quot; is not valid. Allowed values: yes or no\n&quot;</span><span class="sc">;</span>
1320   <span class="s">}</span>
1321   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">mode</span>} !~ <span class="q">/^(Chains|Sequences|Atoms|CAlphas|AtomNums|AtomsRange|AtomNames|ResidueNums|ResidueNames|ResiduesRange|Distance|NonWater|NonHydrogens)$/i</span><span class="s">)</span> <span class="s">{</span>
1322     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{mode}, for option \&quot;m, --mode\&quot; is not valid. Allowed values: Chains, Sequences, Atoms, CAlphas, AtomNums, AtomsRange, AtomNames, ResidueNums, ResiduesRange, ResidueNames, Distance, NonWater, NonHydrogens\n&quot;</span><span class="sc">;</span>
1323   <span class="s">}</span>
1324   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">modifyheader</span>} !~ <span class="q">/^(yes|no)$/i</span><span class="s">)</span> <span class="s">{</span>
1325     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{modifyheader}, for option \&quot;--ModifyHeader\&quot; is not valid. Allowed values: yes or no\n&quot;</span><span class="sc">;</span>
1326   <span class="s">}</span>
1327   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">nonstandardkeep</span>} !~ <span class="q">/^(yes|no)$/i</span><span class="s">)</span> <span class="s">{</span>
1328     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{nonstandardkeep}, for option \&quot;--NonStandardKeep\&quot; is not valid. Allowed values: yes or no\n&quot;</span><span class="sc">;</span>
1329   <span class="s">}</span>
1330   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">nonstandardcode</span>} !~ <span class="q">/^(\?|\-|X)$/i</span><span class="s">)</span> <span class="s">{</span>
1331     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{nonstandardcode}, for option \&quot;--NonStandardCode\&quot; is not valid. Allowed values: ?, -, or X\n&quot;</span><span class="sc">;</span>
1332   <span class="s">}</span>
1333   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">recordmode</span>} &amp;&amp; <span class="i">$Options</span>{<span class="w">recordmode</span>} !~ <span class="q">/^(Atom|Hetatm|AtomAndHetatm)$/i</span><span class="s">)</span> <span class="s">{</span>
1334     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{recordmode}, for option \&quot;--RecordMode\&quot; is not valid. Allowed values: Atom, Hetatm, AtomAndHetatm\n&quot;</span><span class="sc">;</span>
1335   <span class="s">}</span>
1336   <span class="k">if</span> <span class="s">(</span>!<span class="i">IsPositiveInteger</span><span class="s">(</span><span class="i">$Options</span>{<span class="w">sequencelength</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1337     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{sequencelength}, for option \&quot;--SequenceLength\&quot; is not valid. Allowed values: &gt;0\n&quot;</span><span class="sc">;</span>
1338   <span class="s">}</span>
1339   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">sequencerecords</span>} !~ <span class="q">/^(Atom|SeqRes)$/i</span><span class="s">)</span> <span class="s">{</span>
1340     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{sequencerecords}, for option \&quot;--SequenceRecords\&quot; is not valid. Allowed values: Atom or SeqRes\n&quot;</span><span class="sc">;</span>
1341   <span class="s">}</span>
1342   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">sequenceidprefix</span>} !~ <span class="q">/^(FileName|HeaderRecord|Automatic)$/i</span><span class="s">)</span> <span class="s">{</span>
1343     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{sequenceidprefix}, for option \&quot;--SequenceIDPrefix\&quot; is not valid. Allowed values: FileName, HeaderRecord, or AutomaticAtom\n&quot;</span><span class="sc">;</span>
1344   <span class="s">}</span>
1345 <span class="s">}</span>
1346 
<a name="EOF-"></a></pre>
<p>&nbsp;</p>
<br />
<center>
<img src="../../../images/h2o2.png">
</center>
</body>
</html>