packages feed

hPDB 1.2.0.6 → 1.2.0.7

raw patch · 4 files changed

+619/−571 lines, 4 filesdep +unordered-containersdep ~base

Dependencies added: unordered-containers

Dependency ranges changed: base

Files

AUTHORS view
@@ -1,3 +1,6 @@ This parser and associated example programs were created by: Michal J. Gajda 2010-2013 In his free time, unencumbered by work duties.++Thanks a lot to Ben Gamari for extensive analysis of the atom lookup problem:+https://ghc.haskell.org/trac/ghc/ticket/10565
Bio/PDB/Structure/Elements.hs view
@@ -1,571 +1,594 @@ {-# LANGUAGE OverloadedStrings #-} -- | Basic properties of chemical 'Element's as suggested by Cambridge Structural Database.-module Bio.PDB.Structure.Elements(Element(..),-                                  -- Finding element for a given atom-                                  assignElement,-                                  -- Guessing element name from atom name (for standard residues only.)-                                  guessElement,-                                  -- properties of elements-                                  atomicNumber, atomicMass,-                                  covalentRadius,    maxCovalentRadius,-                                  vanDerWaalsRadius, maxVanDerWaalsRadius) where--import Prelude hiding (error, String)-import Data.ByteString.Char8 as BS-import System.IO.Unsafe(unsafePerformIO)-import System.IO(stderr)-import Bio.PDB.Structure(Atom(..))---- | Type alias for 'Element' names.-type Element = BS.ByteString--- TODO: May be better as a newtype, and make sure that other modules use this declaration---- | Internal method that reports error to stderr, and return given default value.-defaulting e defaultValue = unsafePerformIO $ do BS.hPutStrLn stderr $ BS.concat e-                                                 return defaultValue--{-# INLINE atomicNumber      #-}--- | Atomic number of a given element-atomicNumber :: Element -> Int-atomicNumber       "C" =   6-atomicNumber       "N" =   7-atomicNumber       "O" =   8-atomicNumber       "P" =  15-atomicNumber       "S" =  16-atomicNumber       "H" =   1-atomicNumber      "AC" =  89-atomicNumber      "AG" =  47-atomicNumber      "AL" =  13-atomicNumber      "AM" =  95-atomicNumber      "AR" =  18-atomicNumber      "AS" =  33-atomicNumber      "AT" =  85-atomicNumber      "AU" =  79-atomicNumber       "B" =   5-atomicNumber      "BA" =  56-atomicNumber      "BE" =   4-atomicNumber      "BH" = 107-atomicNumber      "BI" =  83-atomicNumber      "BK" =  97-atomicNumber      "BR" =  35-atomicNumber      "CA" =  20-atomicNumber      "CD" =  48-atomicNumber      "CE" =  58-atomicNumber      "CF" =  98-atomicNumber      "CL" =  17-atomicNumber      "CM" =  96-atomicNumber      "CO" =  27-atomicNumber      "CR" =  24-atomicNumber      "CS" =  55-atomicNumber      "CU" =  29-atomicNumber      "DB" = 105-atomicNumber      "DS" = 110-atomicNumber      "DY" =  66-atomicNumber      "ER" =  68-atomicNumber      "ES" =  99-atomicNumber      "EU" =  63-atomicNumber       "F" =   9-atomicNumber      "FE" =  26-atomicNumber      "FM" = 100-atomicNumber      "FR" =  87-atomicNumber      "GA" =  31-atomicNumber      "GD" =  64-atomicNumber      "GE" =  32-atomicNumber      "HE" =   2-atomicNumber      "HF" =  72-atomicNumber      "HG" =  80-atomicNumber      "HO" =  67-atomicNumber      "HS" = 108-atomicNumber       "I" =  53-atomicNumber      "IN" =  49-atomicNumber      "IR" =  77-atomicNumber       "K" =  19-atomicNumber      "KR" =  36-atomicNumber      "LA" =  57-atomicNumber      "LI" =   3-atomicNumber      "LR" = 103-atomicNumber      "LU" =  71-atomicNumber      "MD" = 101-atomicNumber      "MG" =  12-atomicNumber      "MN" =  25-atomicNumber      "MO" =  42-atomicNumber      "MT" = 109-atomicNumber      "NA" =  11-atomicNumber      "NB" =  41-atomicNumber      "ND" =  60-atomicNumber      "NE" =  10-atomicNumber      "NI" =  28-atomicNumber      "NO" = 102-atomicNumber      "NP" =  93-atomicNumber      "OS" =  76-atomicNumber      "PA" =  91-atomicNumber      "PB" =  82-atomicNumber      "PD" =  46-atomicNumber      "PM" =  61-atomicNumber      "PO" =  84-atomicNumber      "PR" =  59-atomicNumber      "PT" =  78-atomicNumber      "PU" =  94-atomicNumber      "RA" =  88-atomicNumber      "RB" =  37-atomicNumber      "RE" =  75-atomicNumber      "RF" = 104-atomicNumber      "RH" =  45-atomicNumber      "RN" =  86-atomicNumber      "RU" =  44-atomicNumber      "SB" =  51-atomicNumber      "SC" =  21-atomicNumber      "SE" =  34-atomicNumber      "SG" = 106-atomicNumber      "SI" =  14-atomicNumber      "SM" =  62-atomicNumber      "SN" =  50-atomicNumber      "SR" =  38-atomicNumber      "TA" =  73-atomicNumber      "TB" =  65-atomicNumber      "TC" =  43-atomicNumber      "TE" =  52-atomicNumber      "TH" =  90-atomicNumber      "TI" =  22-atomicNumber      "TL" =  81-atomicNumber      "TM" =  69-atomicNumber       "U" =  92-atomicNumber       "V" =  23-atomicNumber       "W" =  74-atomicNumber      "XE" =  54-atomicNumber       "Y" =  39-atomicNumber      "YB" =  70-atomicNumber      "ZN" =  30-atomicNumber      "ZR" =  40-atomicNumber      x    = defaulting ["Unknown atomic number for element:", BS.pack $ show x] 0--{-# INLINE covalentRadius    #-}--- | Covalent radius of an element with a given name.-covalentRadius    "AC" = 2.15-covalentRadius    "AG" = 1.45-covalentRadius    "AL" = 1.21-covalentRadius    "AM" = 1.80-covalentRadius    "AR" = 1.51-covalentRadius    "AS" = 1.21-covalentRadius    "AT" = 1.21-covalentRadius    "AU" = 1.36-covalentRadius     "B" = 0.83-covalentRadius    "BA" = 2.15-covalentRadius    "BE" = 0.96-covalentRadius    "BH" = 1.50-covalentRadius    "BI" = 1.48-covalentRadius    "BK" = 1.54-covalentRadius    "BR" = 1.21-covalentRadius     "C" = 0.68-covalentRadius    "CA" = 1.76-covalentRadius    "CD" = 1.44-covalentRadius    "CE" = 2.04-covalentRadius    "CF" = 1.83-covalentRadius    "CL" = 0.99-covalentRadius    "CM" = 1.69-covalentRadius    "CO" = 1.26-covalentRadius    "CR" = 1.39-covalentRadius    "CS" = 2.44-covalentRadius    "CU" = 1.32-covalentRadius    "DB" = 1.50-covalentRadius    "DS" = 1.50-covalentRadius    "DY" = 1.92-covalentRadius    "ER" = 1.89-covalentRadius    "ES" = 1.50-covalentRadius    "EU" = 1.98-covalentRadius     "F" = 0.64-covalentRadius    "FE" = 1.52-covalentRadius    "FM" = 1.50-covalentRadius    "FR" = 2.60-covalentRadius    "GA" = 1.22-covalentRadius    "GD" = 1.96-covalentRadius    "GE" = 1.17-covalentRadius     "H" = 0.23-covalentRadius    "HE" = 1.50-covalentRadius    "HF" = 1.75-covalentRadius    "HG" = 1.32-covalentRadius    "HO" = 1.92-covalentRadius    "HS" = 1.50-covalentRadius     "I" = 1.40-covalentRadius    "IN" = 1.42-covalentRadius    "IR" = 1.41-covalentRadius     "K" = 2.03-covalentRadius    "KR" = 1.50-covalentRadius    "LA" = 2.07-covalentRadius    "LI" = 1.28-covalentRadius    "LR" = 1.50-covalentRadius    "LU" = 1.87-covalentRadius    "MD" = 1.50-covalentRadius    "MG" = 1.41-covalentRadius    "MN" = 1.61-covalentRadius    "MO" = 1.54-covalentRadius    "MT" = 1.50-covalentRadius     "N" = 0.68-covalentRadius    "NA" = 1.66-covalentRadius    "NB" = 1.64-covalentRadius    "ND" = 2.01-covalentRadius    "NE" = 1.50-covalentRadius    "NI" = 1.24-covalentRadius    "NO" = 1.50-covalentRadius    "NP" = 1.90-covalentRadius     "O" = 0.68-covalentRadius    "OS" = 1.44-covalentRadius     "P" = 1.05-covalentRadius    "PA" = 2.00-covalentRadius    "PB" = 1.46-covalentRadius    "PD" = 1.39-covalentRadius    "PM" = 1.99-covalentRadius    "PO" = 1.40-covalentRadius    "PR" = 2.03-covalentRadius    "PT" = 1.36-covalentRadius    "PU" = 1.87-covalentRadius    "RA" = 2.21-covalentRadius    "RB" = 2.20-covalentRadius    "RE" = 1.51-covalentRadius    "RF" = 1.50-covalentRadius    "RH" = 1.42-covalentRadius    "RN" = 1.50-covalentRadius    "RU" = 1.46-covalentRadius     "S" = 1.02-covalentRadius    "SB" = 1.39-covalentRadius    "SC" = 1.70-covalentRadius    "SE" = 1.22-covalentRadius    "SG" = 1.50-covalentRadius    "SI" = 1.20-covalentRadius    "SM" = 1.98-covalentRadius    "SN" = 1.39-covalentRadius    "SR" = 1.95-covalentRadius    "TA" = 1.70-covalentRadius    "TB" = 1.94-covalentRadius    "TC" = 1.47-covalentRadius    "TE" = 1.47-covalentRadius    "TH" = 2.06-covalentRadius    "TI" = 1.60-covalentRadius    "TL" = 1.45-covalentRadius    "TM" = 1.90-covalentRadius     "U" = 1.96-covalentRadius     "V" = 1.53-covalentRadius     "W" = 1.62-covalentRadius    "XE" = 1.50-covalentRadius     "Y" = 1.90-covalentRadius    "YB" = 1.87-covalentRadius    "ZN" = 1.22-covalentRadius    "ZR" = 1.75-covalentRadius    x    = defaulting ["Unknown covalent radius for element:", BS.pack $ show x] 0.0--{-# INLINE maxCovalentRadius #-}--- | Upper bound of @covalentRadius@.-maxCovalentRadius :: Double-maxCovalentRadius  = covalentRadius "FR"--{-# INLINE atomicMass        #-}--- | Atomic mass of a given element in g/mol-atomicMass :: Element -> Double-atomicMass         "C" =  12.011-atomicMass         "N" =  14.007-atomicMass         "O" =  15.999-atomicMass         "P" =  30.974-atomicMass         "S" =  32.066-atomicMass         "H" =   1.008-atomicMass        "AC" = 227.000-atomicMass        "AG" = 107.868-atomicMass        "AL" =  26.982-atomicMass        "AM" = 243.000-atomicMass        "AR" =  39.948-atomicMass        "AS" =  74.922-atomicMass        "AT" = 210.000-atomicMass        "AU" = 196.967-atomicMass         "B" =  10.811-atomicMass        "BA" = 137.327-atomicMass        "BE" =   9.012-atomicMass        "BH" = 264.000-atomicMass        "BI" = 208.980-atomicMass        "BK" = 247.000-atomicMass        "BR" =  79.904-atomicMass        "CA" =  40.078-atomicMass        "CD" = 112.411-atomicMass        "CE" = 140.116-atomicMass        "CF" = 251.000-atomicMass        "CL" =  35.453-atomicMass        "CM" = 247.000-atomicMass        "CO" =  58.933-atomicMass        "CR" =  51.996-atomicMass        "CS" = 132.905-atomicMass        "CU" =  63.546-atomicMass        "DB" = 262.000-atomicMass        "DS" = 271.000-atomicMass        "DY" = 162.500-atomicMass        "ER" = 167.260-atomicMass        "ES" = 252.000-atomicMass        "EU" = 151.964-atomicMass         "F" =  18.998-atomicMass        "FE" =  55.845-atomicMass        "FM" = 257.000-atomicMass        "FR" = 223.000-atomicMass        "GA" =  69.723-atomicMass        "GD" = 157.250-atomicMass        "GE" =  72.610-atomicMass        "HE" =   4.003-atomicMass        "HF" = 178.490-atomicMass        "HG" = 200.590-atomicMass        "HO" = 164.930-atomicMass        "HS" = 269.000-atomicMass         "I" = 126.904-atomicMass        "IN" = 114.818-atomicMass        "IR" = 192.217-atomicMass         "K" =  39.098-atomicMass        "KR" =  83.800-atomicMass        "LA" = 138.906-atomicMass        "LI" =   6.941-atomicMass        "LR" = 262.000-atomicMass        "LU" = 174.967-atomicMass        "MD" = 258.000-atomicMass        "MG" =  24.305-atomicMass        "MN" =  54.938-atomicMass        "MO" =  95.940-atomicMass        "MT" = 268.000-atomicMass        "NA" =  22.991-atomicMass        "NB" =  92.906-atomicMass        "ND" = 144.240-atomicMass        "NE" =  20.180-atomicMass        "NI" =  58.693-atomicMass        "NO" = 259.000-atomicMass        "NP" = 237.000-atomicMass        "OS" = 190.230-atomicMass        "PA" = 231.036-atomicMass        "PB" = 207.200-atomicMass        "PD" = 106.420-atomicMass        "PM" = 145.000-atomicMass        "PO" = 210.000-atomicMass        "PR" = 140.908-atomicMass        "PT" = 195.078-atomicMass        "PU" = 244.000-atomicMass        "RA" = 226.000-atomicMass        "RB" =  85.468-atomicMass        "RE" = 186.207-atomicMass        "RF" = 261.000-atomicMass        "RH" = 102.906-atomicMass        "RN" = 222.000-atomicMass        "RU" = 101.070-atomicMass        "SB" = 121.760-atomicMass        "SC" =  44.956-atomicMass        "SE" =  78.960-atomicMass        "SG" = 266.000-atomicMass        "SI" =  28.086-atomicMass        "SM" = 150.360-atomicMass        "SN" = 118.710-atomicMass        "SR" =  87.620-atomicMass        "TA" = 180.948-atomicMass        "TB" = 158.925-atomicMass        "TC" =  98.000-atomicMass        "TE" = 127.600-atomicMass        "TH" = 232.038-atomicMass        "TI" =  47.867-atomicMass        "TL" = 204.383-atomicMass        "TM" = 168.934-atomicMass         "U" = 238.029-atomicMass         "V" =  50.942-atomicMass         "W" = 183.840-atomicMass        "XE" = 131.290-atomicMass         "Y" =  88.906-atomicMass        "YB" = 173.040-atomicMass        "ZN" =  65.390-atomicMass        "ZR" =  91.224-atomicMass        x    = defaulting ["Unknown atomic mass for element:", BS.pack $ show x] 0.0--{-# INLINE vanDerWaalsRadius #-}--- | Van der Waals radius of the given element-vanDerWaalsRadius :: Element -> Double-vanDerWaalsRadius  "C" = 1.70-vanDerWaalsRadius  "N" = 1.55-vanDerWaalsRadius  "O" = 1.52-vanDerWaalsRadius  "P" = 1.80-vanDerWaalsRadius  "S" = 1.80-vanDerWaalsRadius "AC" = 2.00-vanDerWaalsRadius "AG" = 1.72-vanDerWaalsRadius "AL" = 2.00-vanDerWaalsRadius "AM" = 2.00-vanDerWaalsRadius "AR" = 1.88-vanDerWaalsRadius "AS" = 1.85-vanDerWaalsRadius "AT" = 2.00-vanDerWaalsRadius "AU" = 1.66-vanDerWaalsRadius  "B" = 2.00-vanDerWaalsRadius "BA" = 2.00-vanDerWaalsRadius "BE" = 2.00-vanDerWaalsRadius "BH" = 2.00-vanDerWaalsRadius "BI" = 2.00-vanDerWaalsRadius "BK" = 2.00-vanDerWaalsRadius "BR" = 1.85-vanDerWaalsRadius "CA" = 2.00-vanDerWaalsRadius "CD" = 1.58-vanDerWaalsRadius "CE" = 2.00-vanDerWaalsRadius "CF" = 2.00-vanDerWaalsRadius "CL" = 1.75-vanDerWaalsRadius "CM" = 2.00-vanDerWaalsRadius "CO" = 2.00-vanDerWaalsRadius "CR" = 2.00-vanDerWaalsRadius "CS" = 2.00-vanDerWaalsRadius "CU" = 1.40-vanDerWaalsRadius "DB" = 2.00-vanDerWaalsRadius "DS" = 2.00-vanDerWaalsRadius "DY" = 2.00-vanDerWaalsRadius "ER" = 2.00-vanDerWaalsRadius "ES" = 2.00-vanDerWaalsRadius "EU" = 2.00-vanDerWaalsRadius  "F" = 1.47-vanDerWaalsRadius "FE" = 2.00-vanDerWaalsRadius "FM" = 2.00-vanDerWaalsRadius "FR" = 2.00-vanDerWaalsRadius "GA" = 1.87-vanDerWaalsRadius "GD" = 2.00-vanDerWaalsRadius "GE" = 2.00-vanDerWaalsRadius  "H" = 1.09-vanDerWaalsRadius "HE" = 1.40-vanDerWaalsRadius "HF" = 2.00-vanDerWaalsRadius "HG" = 1.55-vanDerWaalsRadius "HO" = 2.00-vanDerWaalsRadius "HS" = 2.00-vanDerWaalsRadius  "I" = 1.98-vanDerWaalsRadius "IN" = 1.93-vanDerWaalsRadius "IR" = 2.00-vanDerWaalsRadius  "K" = 2.75-vanDerWaalsRadius "KR" = 2.02-vanDerWaalsRadius "LA" = 2.00-vanDerWaalsRadius "LI" = 1.82-vanDerWaalsRadius "LR" = 2.00-vanDerWaalsRadius "LU" = 2.00-vanDerWaalsRadius "MD" = 2.00-vanDerWaalsRadius "MG" = 1.73-vanDerWaalsRadius "MN" = 2.00-vanDerWaalsRadius "MO" = 2.00-vanDerWaalsRadius "MT" = 2.00-vanDerWaalsRadius "NA" = 2.27-vanDerWaalsRadius "NB" = 2.00-vanDerWaalsRadius "ND" = 2.00-vanDerWaalsRadius "NE" = 1.54-vanDerWaalsRadius "NI" = 1.63-vanDerWaalsRadius "NO" = 2.00-vanDerWaalsRadius "NP" = 2.00-vanDerWaalsRadius "OS" = 2.00-vanDerWaalsRadius "PA" = 2.00-vanDerWaalsRadius "PB" = 2.02-vanDerWaalsRadius "PD" = 1.63-vanDerWaalsRadius "PM" = 2.00-vanDerWaalsRadius "PO" = 2.00-vanDerWaalsRadius "PR" = 2.00-vanDerWaalsRadius "PT" = 1.72-vanDerWaalsRadius "PU" = 2.00-vanDerWaalsRadius "RA" = 2.00-vanDerWaalsRadius "RB" = 2.00-vanDerWaalsRadius "RE" = 2.00-vanDerWaalsRadius "RF" = 2.00-vanDerWaalsRadius "RH" = 2.00-vanDerWaalsRadius "RN" = 2.00-vanDerWaalsRadius "RU" = 2.00-vanDerWaalsRadius "SB" = 2.00-vanDerWaalsRadius "SC" = 2.00-vanDerWaalsRadius "SE" = 1.90-vanDerWaalsRadius "SG" = 2.00-vanDerWaalsRadius "SI" = 2.10-vanDerWaalsRadius "SM" = 2.00-vanDerWaalsRadius "SN" = 2.17-vanDerWaalsRadius "SR" = 2.00-vanDerWaalsRadius "TA" = 2.00-vanDerWaalsRadius "TB" = 2.00-vanDerWaalsRadius "TC" = 2.00-vanDerWaalsRadius "TE" = 2.06-vanDerWaalsRadius "TH" = 2.00-vanDerWaalsRadius "TI" = 2.00-vanDerWaalsRadius "TL" = 1.96-vanDerWaalsRadius "TM" = 2.00-vanDerWaalsRadius  "U" = 1.86-vanDerWaalsRadius  "V" = 2.00-vanDerWaalsRadius  "W" = 2.00-vanDerWaalsRadius "XE" = 2.16-vanDerWaalsRadius  "Y" = 2.00-vanDerWaalsRadius "YB" = 2.00-vanDerWaalsRadius "ZN" = 1.39-vanDerWaalsRadius "ZR" = 2.00-vanDerWaalsRadius e    = defaulting ["Do not know van der Waals radius of", BS.pack $ show e] 0.0--{-# INLINE maxVanDerWaalsRadius #-}--- | Upper bound of @vanDerWaalsRadius@.-maxVanDerWaalsRadius :: Double-maxVanDerWaalsRadius  = vanDerWaalsRadius "K"--{-# INLINE assignElement #-}--- | Given a PDB 'Atom' extract or guess its 'Element' name.-assignElement :: Atom -> Element-assignElement at = case element at of-                     ""   -> guessElement . atName $ at-                     code -> code--{-# INLINE guessElement #-}--- | Guessing an 'Element' name from PDB 'Atom' name. --- Returns empty string, if 'Element' can't be guessed.-guessElement :: BS.ByteString -> Element-guessElement "C"   = "C"-guessElement "C1'" = "C"-guessElement "C2"  = "C"-guessElement "C2'" = "C"-guessElement "C3'" = "C"-guessElement "C4"  = "C"-guessElement "C4'" = "C"-guessElement "C5"  = "C"-guessElement "C5'" = "C"-guessElement "C6"  = "C"-guessElement "C8"  = "C"-guessElement "CA"  = "C"-guessElement "CB"  = "C"-guessElement "CD"  = "C"-guessElement "CD1" = "C"-guessElement "CD2" = "C"-guessElement "CE"  = "C"-guessElement "CE1" = "C"-guessElement "CE2" = "C"-guessElement "CE3" = "C"-guessElement "CG"  = "C"-guessElement "CG1" = "C"-guessElement "CG2" = "C"-guessElement "CH2" = "C"-guessElement "CZ"  = "C"-guessElement "CZ2" = "C"-guessElement "CZ3" = "C"-guessElement "N"   = "N"-guessElement "N1"  = "N"-guessElement "N2"  = "N"-guessElement "N3"  = "N"-guessElement "N4"  = "N"-guessElement "N6"  = "N"-guessElement "N7"  = "N"-guessElement "N9"  = "N"-guessElement "ND1" = "N"-guessElement "ND2" = "N"-guessElement "NE"  = "N"-guessElement "NE1" = "N"-guessElement "NE2" = "N"-guessElement "NH1" = "N"-guessElement "NH2" = "N"-guessElement "NZ"  = "N"-guessElement "O"   = "O"-guessElement "O2"  = "O"-guessElement "O2'" = "O"-guessElement "O3'" = "O"-guessElement "O4"  = "O"-guessElement "O4'" = "O"-guessElement "O5'" = "O"-guessElement "O6"  = "O"-guessElement "OD1" = "O"-guessElement "OD2" = "O"-guessElement "OE1" = "O"-guessElement "OE2" = "O"-guessElement "OG"  = "O"-guessElement "OG1" = "O"-guessElement "OH"  = "O"-guessElement "OP1" = "O"-guessElement "OP2" = "O"-guessElement "OXT" = "O"-guessElement "P"   = "P"-guessElement "SD"  = "S"-guessElement "SG"  = "S"-guessElement _     = "" -- not a standard residue of protein or nucleic acid+--+-- NOTE: This module contains functions that could use hash tables for the lookup instead.+-- See https://ghc.haskell.org/trac/ghc/ticket/10565+module Bio.PDB.Structure.Elements(Element(..),+                                  -- Finding element for a given atom+                                  assignElement,+                                  -- Guessing element name from atom name (for standard residues only.)+                                  guessElement,+                                  -- properties of elements+                                  atomicNumber, atomicMass,+                                  covalentRadius,    maxCovalentRadius,+                                  vanDerWaalsRadius, maxVanDerWaalsRadius) where++import Prelude hiding (error, String)+import Data.ByteString.Char8 as BS+import System.IO.Unsafe(unsafePerformIO)+import System.IO(stderr)+import Bio.PDB.Structure(Atom(..))+import Data.HashMap.Strict as M+import Data.Maybe++-- | Type alias for 'Element' names.+type Element = BS.ByteString+-- TODO: May be better as a newtype, and make sure that other modules use this declaration++-- | Internal method that reports error to stderr, and return given default value.+defaultingLookup :: BS.ByteString -> v -> HashMap Element v -> Element -> v+defaultingLookup msg defaultValue dict e =+      fromMaybe withWarning+    $ M.lookup (BS.unpack e) dict+  where+    withWarning = unsafePerformIO $ do BS.hPutStrLn stderr $ BS.concat [msg, BS.pack . show . BS.unpack $ e]+                                       return defaultValue++-- | Atomic number of a given element+atomicNumber :: Element -> Int+atomicNumber = defaultingLookup "Unknown atomic number for element:"+                                0 dict +  where+    dict = M.fromList [+              ( "C",   6)+             ,( "N",   7)+             ,( "O",   8)+             ,( "P",  15)+             ,( "S",  16)+             ,( "H",   1)+             ,("AC",  89)+             ,("AG",  47)+             ,("AL",  13)+             ,("AM",  95)+             ,("AR",  18)+             ,("AS",  33)+             ,("AT",  85)+             ,("AU",  79)+             ,( "B",   5)+             ,("BA",  56)+             ,("BE",   4)+             ,("BH", 107)+             ,("BI",  83)+             ,("BK",  97)+             ,("BR",  35)+             ,("CA",  20)+             ,("CD",  48)+             ,("CE",  58)+             ,("CF",  98)+             ,("CL",  17)+             ,("CM",  96)+             ,("CO",  27)+             ,("CR",  24)+             ,("CS",  55)+             ,("CU",  29)+             ,("DB", 105)+             ,("DS", 110)+             ,("DY",  66)+             ,("ER",  68)+             ,("ES",  99)+             ,("EU",  63)+             ,( "F",   9)+             ,("FE",  26)+             ,("FM", 100)+             ,("FR",  87)+             ,("GA",  31)+             ,("GD",  64)+             ,("GE",  32)+             ,("HE",   2)+             ,("HF",  72)+             ,("HG",  80)+             ,("HO",  67)+             ,("HS", 108)+             ,( "I",  53)+             ,("IN",  49)+             ,("IR",  77)+             ,( "K",  19)+             ,("KR",  36)+             ,("LA",  57)+             ,("LI",   3)+             ,("LR", 103)+             ,("LU",  71)+             ,("MD", 101)+             ,("MG",  12)+             ,("MN",  25)+             ,("MO",  42)+             ,("MT", 109)+             ,("NA",  11)+             ,("NB",  41)+             ,("ND",  60)+             ,("NE",  10)+             ,("NI",  28)+             ,("NO", 102)+             ,("NP",  93)+             ,("OS",  76)+             ,("PA",  91)+             ,("PB",  82)+             ,("PD",  46)+             ,("PM",  61)+             ,("PO",  84)+             ,("PR",  59)+             ,("PT",  78)+             ,("PU",  94)+             ,("RA",  88)+             ,("RB",  37)+             ,("RE",  75)+             ,("RF", 104)+             ,("RH",  45)+             ,("RN",  86)+             ,("RU",  44)+             ,("SB",  51)+             ,("SC",  21)+             ,("SE",  34)+             ,("SG", 106)+             ,("SI",  14)+             ,("SM",  62)+             ,("SN",  50)+             ,("SR",  38)+             ,("TA",  73)+             ,("TB",  65)+             ,("TC",  43)+             ,("TE",  52)+             ,("TH",  90)+             ,("TI",  22)+             ,("TL",  81)+             ,("TM",  69)+             ,( "U",  92)+             ,( "V",  23)+             ,( "W",  74)+             ,("XE",  54)+             ,( "Y",  39)+             ,("YB",  70)+             ,("ZN",  30)+             ,("ZR",  40)+             ]++-- | Covalent radius of an element with a given name.+covalentRadius = defaultingLookup "Unknown covalent radius for element:"+                                  0.0 dict +  where+    dict = M.fromList [+               ("AC", 2.15)+             , ("AG", 1.45)+             , ("AL", 1.21)+             , ("AM", 1.80)+             , ("AR", 1.51)+             , ("AS", 1.21)+             , ("AT", 1.21)+             , ("AU", 1.36)+             , ( "B", 0.83)+             , ("BA", 2.15)+             , ("BE", 0.96)+             , ("BH", 1.50)+             , ("BI", 1.48)+             , ("BK", 1.54)+             , ("BR", 1.21)+             , ( "C", 0.68)+             , ("CA", 1.76)+             , ("CD", 1.44)+             , ("CE", 2.04)+             , ("CF", 1.83)+             , ("CL", 0.99)+             , ("CM", 1.69)+             , ("CO", 1.26)+             , ("CR", 1.39)+             , ("CS", 2.44)+             , ("CU", 1.32)+             , ("DB", 1.50)+             , ("DS", 1.50)+             , ("DY", 1.92)+             , ("ER", 1.89)+             , ("ES", 1.50)+             , ("EU", 1.98)+             , ( "F", 0.64)+             , ("FE", 1.52)+             , ("FM", 1.50)+             , ("FR", 2.60)+             , ("GA", 1.22)+             , ("GD", 1.96)+             , ("GE", 1.17)+             , ( "H", 0.23)+             , ("HE", 1.50)+             , ("HF", 1.75)+             , ("HG", 1.32)+             , ("HO", 1.92)+             , ("HS", 1.50)+             , ( "I", 1.40)+             , ("IN", 1.42)+             , ("IR", 1.41)+             , ( "K", 2.03)+             , ("KR", 1.50)+             , ("LA", 2.07)+             , ("LI", 1.28)+             , ("LR", 1.50)+             , ("LU", 1.87)+             , ("MD", 1.50)+             , ("MG", 1.41)+             , ("MN", 1.61)+             , ("MO", 1.54)+             , ("MT", 1.50)+             , ( "N", 0.68)+             , ("NA", 1.66)+             , ("NB", 1.64)+             , ("ND", 2.01)+             , ("NE", 1.50)+             , ("NI", 1.24)+             , ("NO", 1.50)+             , ("NP", 1.90)+             , ( "O", 0.68)+             , ("OS", 1.44)+             , ( "P", 1.05)+             , ("PA", 2.00)+             , ("PB", 1.46)+             , ("PD", 1.39)+             , ("PM", 1.99)+             , ("PO", 1.40)+             , ("PR", 2.03)+             , ("PT", 1.36)+             , ("PU", 1.87)+             , ("RA", 2.21)+             , ("RB", 2.20)+             , ("RE", 1.51)+             , ("RF", 1.50)+             , ("RH", 1.42)+             , ("RN", 1.50)+             , ("RU", 1.46)+             , ( "S", 1.02)+             , ("SB", 1.39)+             , ("SC", 1.70)+             , ("SE", 1.22)+             , ("SG", 1.50)+             , ("SI", 1.20)+             , ("SM", 1.98)+             , ("SN", 1.39)+             , ("SR", 1.95)+             , ("TA", 1.70)+             , ("TB", 1.94)+             , ("TC", 1.47)+             , ("TE", 1.47)+             , ("TH", 2.06)+             , ("TI", 1.60)+             , ("TL", 1.45)+             , ("TM", 1.90)+             , ( "U", 1.96)+             , ( "V", 1.53)+             , ( "W", 1.62)+             , ("XE", 1.50)+             , ( "Y", 1.90)+             , ("YB", 1.87)+             , ("ZN", 1.22)+             , ("ZR", 1.75)+             ]++{-# INLINE maxCovalentRadius #-}+-- | Upper bound of @covalentRadius@.+maxCovalentRadius :: Double+maxCovalentRadius  = covalentRadius "FR"++-- | Atomic mass of a given element in g/mol+atomicMass :: Element -> Double+atomicMass = defaultingLookup "Unknown atomic mass for element:"+                              0.0 dict +  where+    dict = M.fromList [+              ( "C",  12.011)+             ,( "N",  14.007)+             ,( "O",  15.999)+             ,( "P",  30.974)+             ,( "S",  32.066)+             ,( "H",   1.008)+             ,("AC", 227.000)+             ,("AG", 107.868)+             ,("AL",  26.982)+             ,("AM", 243.000)+             ,("AR",  39.948)+             ,("AS",  74.922)+             ,("AT", 210.000)+             ,("AU", 196.967)+             ,( "B",  10.811)+             ,("BA", 137.327)+             ,("BE",   9.012)+             ,("BH", 264.000)+             ,("BI", 208.980)+             ,("BK", 247.000)+             ,("BR",  79.904)+             ,("CA",  40.078)+             ,("CD", 112.411)+             ,("CE", 140.116)+             ,("CF", 251.000)+             ,("CL",  35.453)+             ,("CM", 247.000)+             ,("CO",  58.933)+             ,("CR",  51.996)+             ,("CS", 132.905)+             ,("CU",  63.546)+             ,("DB", 262.000)+             ,("DS", 271.000)+             ,("DY", 162.500)+             ,("ER", 167.260)+             ,("ES", 252.000)+             ,("EU", 151.964)+             ,( "F",  18.998)+             ,("FE",  55.845)+             ,("FM", 257.000)+             ,("FR", 223.000)+             ,("GA",  69.723)+             ,("GD", 157.250)+             ,("GE",  72.610)+             ,("HE",   4.003)+             ,("HF", 178.490)+             ,("HG", 200.590)+             ,("HO", 164.930)+             ,("HS", 269.000)+             ,( "I", 126.904)+             ,("IN", 114.818)+             ,("IR", 192.217)+             ,( "K",  39.098)+             ,("KR",  83.800)+             ,("LA", 138.906)+             ,("LI",   6.941)+             ,("LR", 262.000)+             ,("LU", 174.967)+             ,("MD", 258.000)+             ,("MG",  24.305)+             ,("MN",  54.938)+             ,("MO",  95.940)+             ,("MT", 268.000)+             ,("NA",  22.991)+             ,("NB",  92.906)+             ,("ND", 144.240)+             ,("NE",  20.180)+             ,("NI",  58.693)+             ,("NO", 259.000)+             ,("NP", 237.000)+             ,("OS", 190.230)+             ,("PA", 231.036)+             ,("PB", 207.200)+             ,("PD", 106.420)+             ,("PM", 145.000)+             ,("PO", 210.000)+             ,("PR", 140.908)+             ,("PT", 195.078)+             ,("PU", 244.000)+             ,("RA", 226.000)+             ,("RB",  85.468)+             ,("RE", 186.207)+             ,("RF", 261.000)+             ,("RH", 102.906)+             ,("RN", 222.000)+             ,("RU", 101.070)+             ,("SB", 121.760)+             ,("SC",  44.956)+             ,("SE",  78.960)+             ,("SG", 266.000)+             ,("SI",  28.086)+             ,("SM", 150.360)+             ,("SN", 118.710)+             ,("SR",  87.620)+             ,("TA", 180.948)+             ,("TB", 158.925)+             ,("TC",  98.000)+             ,("TE", 127.600)+             ,("TH", 232.038)+             ,("TI",  47.867)+             ,("TL", 204.383)+             ,("TM", 168.934)+             ,( "U", 238.029)+             ,( "V",  50.942)+             ,( "W", 183.840)+             ,("XE", 131.290)+             ,( "Y",  88.906)+             ,("YB", 173.040)+             ,("ZN",  65.390)+             ,("ZR",  91.224)+             ]++-- | Van der Waals radius of the given element+vanDerWaalsRadius :: Element -> Double+vanDerWaalsRadius = defaultingLookup "Do not know van der Waals radius of "+                                     0.0 dict +  where+    dict = M.fromList [+             ( "C", 1.70)+            ,( "N", 1.55)+            ,( "O", 1.52)+            ,( "P", 1.80)+            ,( "S", 1.80)+            ,("AC", 2.00)+            ,("AG", 1.72)+            ,("AL", 2.00)+            ,("AM", 2.00)+            ,("AR", 1.88)+            ,("AS", 1.85)+            ,("AT", 2.00)+            ,("AU", 1.66)+            , ("B", 2.00)+            ,("BA", 2.00)+            ,("BE", 2.00)+            ,("BH", 2.00)+            ,("BI", 2.00)+            ,("BK", 2.00)+            ,("BR", 1.85)+            ,("CA", 2.00)+            ,("CD", 1.58)+            ,("CE", 2.00)+            ,("CF", 2.00)+            ,("CL", 1.75)+            ,("CM", 2.00)+            ,("CO", 2.00)+            ,("CR", 2.00)+            ,("CS", 2.00)+            ,("CU", 1.40)+            ,("DB", 2.00)+            ,("DS", 2.00)+            ,("DY", 2.00)+            ,("ER", 2.00)+            ,("ES", 2.00)+            ,("EU", 2.00)+            ,( "F", 1.47)+            ,("FE", 2.00)+            ,("FM", 2.00)+            ,("FR", 2.00)+            ,("GA", 1.87)+            ,("GD", 2.00)+            ,("GE", 2.00)+            ,( "H", 1.09)+            ,("HE", 1.40)+            ,("HF", 2.00)+            ,("HG", 1.55)+            ,("HO", 2.00)+            ,("HS", 2.00)+            ,( "I", 1.98)+            ,("IN", 1.93)+            ,("IR", 2.00)+            ,( "K", 2.75)+            ,("KR", 2.02)+            ,("LA", 2.00)+            ,("LI", 1.82)+            ,("LR", 2.00)+            ,("LU", 2.00)+            ,("MD", 2.00)+            ,("MG", 1.73)+            ,("MN", 2.00)+            ,("MO", 2.00)+            ,("MT", 2.00)+            ,("NA", 2.27)+            ,("NB", 2.00)+            ,("ND", 2.00)+            ,("NE", 1.54)+            ,("NI", 1.63)+            ,("NO", 2.00)+            ,("NP", 2.00)+            ,("OS", 2.00)+            ,("PA", 2.00)+            ,("PB", 2.02)+            ,("PD", 1.63)+            ,("PM", 2.00)+            ,("PO", 2.00)+            ,("PR", 2.00)+            ,("PT", 1.72)+            ,("PU", 2.00)+            ,("RA", 2.00)+            ,("RB", 2.00)+            ,("RE", 2.00)+            ,("RF", 2.00)+            ,("RH", 2.00)+            ,("RN", 2.00)+            ,("RU", 2.00)+            ,("SB", 2.00)+            ,("SC", 2.00)+            ,("SE", 1.90)+            ,("SG", 2.00)+            ,("SI", 2.10)+            ,("SM", 2.00)+            ,("SN", 2.17)+            ,("SR", 2.00)+            ,("TA", 2.00)+            ,("TB", 2.00)+            ,("TC", 2.00)+            ,("TE", 2.06)+            ,("TH", 2.00)+            ,("TI", 2.00)+            ,("TL", 1.96)+            ,("TM", 2.00)+            ,( "U", 1.86)+            ,( "V", 2.00)+            ,( "W", 2.00)+            ,("XE", 2.16)+            ,( "Y", 2.00)+            ,("YB", 2.00)+            ,("ZN", 1.39)+            ,("ZR", 2.00)+            ]++{-# INLINE maxVanDerWaalsRadius #-}+-- | Upper bound of @vanDerWaalsRadius@.+maxVanDerWaalsRadius :: Double+maxVanDerWaalsRadius  = vanDerWaalsRadius "K"++-- | Given a PDB 'Atom' extract or guess its 'Element' name.+assignElement :: Atom -> Element+assignElement at = case element at of+                     ""   -> guessElement . atName $ at+                     code -> code++-- | Guessing an 'Element' name from PDB 'Atom' name. +-- Returns empty string, if 'Element' can't be guessed.+guessElement :: BS.ByteString -> BS.ByteString+guessElement = \e -> fromMaybe "" $ M.lookup (BS.unpack e) els+  where+    els = M.fromList+        [ ("C"   , "C"),+          ("C1'" , "C"),+          ("C2"  , "C"),+          ("C2'" , "C"),+          ("C3'" , "C"),+          ("C4"  , "C"),+          ("C4'" , "C"),+          ("C5"  , "C"),+          ("C5'" , "C"),+          ("C6"  , "C"),+          ("C8"  , "C"),+          ("CA"  , "C"),+          ("CB"  , "C"),+          ("CD"  , "C"),+          ("CD1" , "C"),+          ("CD2" , "C"),+          ("CE"  , "C"),+          ("CE1" , "C"),+          ("CE2" , "C"),+          ("CE3" , "C"),+          ("CG"  , "C"),+          ("CG1" , "C"),+          ("CG2" , "C"),+          ("CH2" , "C"),+          ("CZ"  , "C"),+          ("CZ2" , "C"),+          ("CZ3" , "C"),+          ("N"   , "N"),+          ("N1"  , "N"),+          ("N2"  , "N"),+          ("N3"  , "N"),+          ("N4"  , "N"),+          ("N6"  , "N"),+          ("N7"  , "N"),+          ("N9"  , "N"),+          ("ND1" , "N"),+          ("ND2" , "N"),+          ("NE"  , "N"),+          ("NE1" , "N"),+          ("NE2" , "N"),+          ("NH1" , "N"),+          ("NH2" , "N"),+          ("NZ"  , "N"),+          ("O"   , "O"),+          ("O2"  , "O"),+          ("O2'" , "O"),+          ("O3'" , "O"),+          ("O4"  , "O"),+          ("O4'" , "O"),+          ("O5'" , "O"),+          ("O6"  , "O"),+          ("OD1" , "O"),+          ("OD2" , "O"),+          ("OE1" , "O"),+          ("OE2" , "O"),+          ("OG"  , "O"),+          ("OG1" , "O"),+          ("OH"  , "O"),+          ("OP1" , "O"),+          ("OP2" , "O"),+          ("OXT" , "O"),+          ("P"   , "P"),+          ("SD"  , "S"),+          ("SG"  , "S")]+
changelog view
@@ -1,4 +1,9 @@ -*-Changelog-*-+1.2.0.7  Jun 2016+	* Use hashmap for element properties.+	  Great thanks to Ben Gamari:+	  https://ghc.haskell.org/trac/ghc/ticket/917+ 1.2.0.6  Jun 2016 	* Updated bounds again. 
hPDB.cabal view
@@ -1,5 +1,5 @@ name:                hPDB-version:             1.2.0.6+version:             1.2.0.7 synopsis:            Protein Databank file format library homepage:            https://github.com/BioHaskell/hPDB stability:           stable@@ -57,7 +57,24 @@  Library   ghc-options:      -fspec-constr-count=4 -O3 -  build-depends:    base>=4.0, base <4.10, ghc-prim, directory, mtl, template-haskell, vector, AC-Vector, containers, deepseq, QuickCheck >= 2.5.0.0, text>=0.11.1.13, iterable >= 3.0, tagged >= 0.7, parallel >= 3.0.0.0, bytestring, zlib, Octree>= 0.5+  build-depends:    base>=4.0 && <4.10,+                    ghc-prim,+                    directory,+                    mtl,+                    template-haskell,+                    vector,+                    AC-Vector,+                    containers,+                    unordered-containers >= 0.2.5.0,+                    deepseq,+                    QuickCheck >= 2.5.0.0,+                    text>=0.11.1.13,+                    iterable >= 3.0,+                    tagged >= 0.7,+                    parallel >= 3.0.0.0,+                    bytestring,+                    zlib,+                    Octree>= 0.5   if flag(have-sse2)     ghc-options: -msse2    if flag(have-mmap)