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 +3/−0
- Bio/PDB/Structure/Elements.hs +592/−569
- changelog +5/−0
- hPDB.cabal +19/−2
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)