hPDB 0.99 → 0.999
raw patch · 54 files changed
+287/−383 lines, 54 filesdep +iterabledep +mmapdep −bytestring-mmapdep ~text-formatsetup-changedPVP ok
version bump matches the API change (PVP)
Dependencies added: iterable, mmap
Dependencies removed: bytestring-mmap
Dependency ranges changed: text-format
API changes (from Hackage documentation)
- Bio.PDB.Structure.Vector: type Vec3D = Vector3
- Bio.PDB.Structure.Vector: unpackVec3D :: Vec3D -> (Double, Double, Double)
+ Bio.PDB.Structure.Vector: Vector3 :: {-# UNPACK #-} !Scalar -> {-# UNPACK #-} !Scalar -> {-# UNPACK #-} !Scalar -> Vector3
+ Bio.PDB.Structure.Vector: data Vector3 :: *
+ Bio.PDB.Structure.Vector: unpackVector3 :: Vector3 -> (Double, Double, Double)
+ Bio.PDB.Structure.Vector: v3x :: Vector3 -> {-# UNPACK #-} !Scalar
+ Bio.PDB.Structure.Vector: v3y :: Vector3 -> {-# UNPACK #-} !Scalar
+ Bio.PDB.Structure.Vector: v3z :: Vector3 -> {-# UNPACK #-} !Scalar
- Bio.PDB: (*|) :: Double -> Vec3D -> Vec3D
+ Bio.PDB: (*|) :: Double -> Vector3 -> Vector3
- Bio.PDB: (|*) :: Vec3D -> Double -> Vec3D
+ Bio.PDB: (|*) :: Vector3 -> Double -> Vector3
- Bio.PDB: class Iterable a b where imap f e = runIdentity $ imapM (\ b -> return $ f b) e
+ Bio.PDB: class Iterable a b
- Bio.PDB: parse :: String -> IO (Maybe Structure)
+ Bio.PDB: parse :: FilePath -> IO (Maybe Structure)
- Bio.PDB: vnorm :: Vec3D -> Double
+ Bio.PDB: vnorm :: Vector3 -> Double
- Bio.PDB: write :: Structure -> String -> IO ()
+ Bio.PDB: write :: Structure -> FilePath -> IO ()
- Bio.PDB.IO: parse :: String -> IO (Maybe Structure)
+ Bio.PDB.IO: parse :: FilePath -> IO (Maybe Structure)
- Bio.PDB.IO: write :: Structure -> String -> IO ()
+ Bio.PDB.IO: write :: Structure -> FilePath -> IO ()
- Bio.PDB.Iterable: class Iterable a b where imap f e = runIdentity $ imapM (\ b -> return $ f b) e
+ Bio.PDB.Iterable: class Iterable a b
- Bio.PDB.Structure: (*|) :: Double -> Vec3D -> Vec3D
+ Bio.PDB.Structure: (*|) :: Double -> Vector3 -> Vector3
- Bio.PDB.Structure: (|*) :: Vec3D -> Double -> Vec3D
+ Bio.PDB.Structure: (|*) :: Vector3 -> Double -> Vector3
- Bio.PDB.Structure: vdihedral :: Vec3D -> Vec3D -> Vec3D -> Double
+ Bio.PDB.Structure: vdihedral :: Vector3 -> Vector3 -> Vector3 -> Double
- Bio.PDB.Structure: vdot :: Vec3D -> Vec3D -> Double
+ Bio.PDB.Structure: vdot :: Vector3 -> Vector3 -> Double
- Bio.PDB.Structure: vnorm :: Vec3D -> Double
+ Bio.PDB.Structure: vnorm :: Vector3 -> Double
- Bio.PDB.Structure: vperpend :: Vec3D -> Vector3 -> Vec3D
+ Bio.PDB.Structure: vperpend :: Vector3 -> Vector3 -> Vector3
- Bio.PDB.Structure: vperpends :: Vec3D -> [Vector3] -> Vec3D
+ Bio.PDB.Structure: vperpends :: Vector3 -> [Vector3] -> Vector3
- Bio.PDB.Structure: vproj :: Vector3 -> Vector3 -> Vec3D
+ Bio.PDB.Structure: vproj :: Vector3 -> Vector3 -> Vector3
- Bio.PDB.Structure.Vector: (*|) :: Double -> Vec3D -> Vec3D
+ Bio.PDB.Structure.Vector: (*|) :: Double -> Vector3 -> Vector3
- Bio.PDB.Structure.Vector: (|*) :: Vec3D -> Double -> Vec3D
+ Bio.PDB.Structure.Vector: (|*) :: Vector3 -> Double -> Vector3
- Bio.PDB.Structure.Vector: vdihedral :: Vec3D -> Vec3D -> Vec3D -> Double
+ Bio.PDB.Structure.Vector: vdihedral :: Vector3 -> Vector3 -> Vector3 -> Double
- Bio.PDB.Structure.Vector: vdot :: Vec3D -> Vec3D -> Double
+ Bio.PDB.Structure.Vector: vdot :: Vector3 -> Vector3 -> Double
- Bio.PDB.Structure.Vector: vmap :: (Double -> Double) -> Vec3D -> Vec3D
+ Bio.PDB.Structure.Vector: vmap :: (Double -> Double) -> Vector3 -> Vector3
- Bio.PDB.Structure.Vector: vnorm :: Vec3D -> Double
+ Bio.PDB.Structure.Vector: vnorm :: Vector3 -> Double
- Bio.PDB.Structure.Vector: vnormalise :: Vec3D -> Vec3D
+ Bio.PDB.Structure.Vector: vnormalise :: Vector3 -> Vector3
- Bio.PDB.Structure.Vector: vperpend :: Vec3D -> Vector3 -> Vec3D
+ Bio.PDB.Structure.Vector: vperpend :: Vector3 -> Vector3 -> Vector3
- Bio.PDB.Structure.Vector: vperpends :: Vec3D -> [Vector3] -> Vec3D
+ Bio.PDB.Structure.Vector: vperpends :: Vector3 -> [Vector3] -> Vector3
- Bio.PDB.Structure.Vector: vproj :: Vector3 -> Vector3 -> Vec3D
+ Bio.PDB.Structure.Vector: vproj :: Vector3 -> Vector3 -> Vector3
- Bio.PDB.Structure.Vector: vzip :: (Double -> Double -> Double) -> Vec3D -> Vec3D -> Vec3D
+ Bio.PDB.Structure.Vector: vzip :: (Double -> Double -> Double) -> Vector3 -> Vector3 -> Vector3
- Bio.PDB.StructureBuilder: parse :: ByteString -> ByteString -> (Structure, List PDBEvent)
+ Bio.PDB.StructureBuilder: parse :: [Char] -> ByteString -> (Structure, List PDBEvent)
Files
- AUTHORS +3/−0
- Bio/PDB/Common.hs +0/−1
- Bio/PDB/EventParser/FastParse.hs +1/−0
- Bio/PDB/EventParser/HelixTypes.hs +4/−4
- Bio/PDB/EventParser/PDBEventParser.hs +2/−2
- Bio/PDB/EventParser/PDBEventPrinter.hs +44/−31
- Bio/PDB/EventParser/PDBParsingAbstractions.hs +2/−2
- Bio/PDB/EventParser/ParseATOM.hs +2/−2
- Bio/PDB/EventParser/ParseCAVEAT.hs +1/−1
- Bio/PDB/EventParser/ParseCISPEP.hs +1/−1
- Bio/PDB/EventParser/ParseCONECT.hs +1/−1
- Bio/PDB/EventParser/ParseCRYST1.hs +2/−2
- Bio/PDB/EventParser/ParseDBREF.hs +2/−2
- Bio/PDB/EventParser/ParseFORMUL.hs +1/−1
- Bio/PDB/EventParser/ParseHEADER.hs +1/−1
- Bio/PDB/EventParser/ParseHELIX.hs +1/−1
- Bio/PDB/EventParser/ParseHET.hs +1/−1
- Bio/PDB/EventParser/ParseHETNAM.hs +1/−1
- Bio/PDB/EventParser/ParseHYDBND.hs +1/−1
- Bio/PDB/EventParser/ParseIntRecord.hs +1/−1
- Bio/PDB/EventParser/ParseJRNL.hs +1/−1
- Bio/PDB/EventParser/ParseLINK.hs +2/−2
- Bio/PDB/EventParser/ParseListRecord.hs +1/−1
- Bio/PDB/EventParser/ParseMASTER.hs +1/−1
- Bio/PDB/EventParser/ParseMODRES.hs +2/−2
- Bio/PDB/EventParser/ParseMatrixRecord.hs +1/−1
- Bio/PDB/EventParser/ParseObsoleting.hs +1/−1
- Bio/PDB/EventParser/ParseREMARK.hs +1/−1
- Bio/PDB/EventParser/ParseREVDAT.hs +1/−1
- Bio/PDB/EventParser/ParseSEQADV.hs +2/−2
- Bio/PDB/EventParser/ParseSEQRES.hs +1/−1
- Bio/PDB/EventParser/ParseSHEET.hs +1/−1
- Bio/PDB/EventParser/ParseSITE.hs +2/−2
- Bio/PDB/EventParser/ParseSLTBRG.hs +1/−1
- Bio/PDB/EventParser/ParseSPLIT.hs +1/−1
- Bio/PDB/EventParser/ParseSSBOND.hs +1/−1
- Bio/PDB/EventParser/ParseSpecListRecord.hs +1/−1
- Bio/PDB/EventParser/ParseTER.hs +1/−1
- Bio/PDB/EventParser/ParseTITLE.hs +1/−1
- Bio/PDB/EventParser/ParseTVECT.hs +1/−1
- Bio/PDB/IO.hs +19/−15
- Bio/PDB/IO/OpenAnyFile.hs +9/−9
- Bio/PDB/InstantiateIterable.hs +0/−68
- Bio/PDB/Iterable.hs +9/−6
- Bio/PDB/Structure.hs +1/−1
- Bio/PDB/Structure/Elements.hs +1/−1
- Bio/PDB/Structure/List.hs +1/−1
- Bio/PDB/Structure/Vector.hs +15/−18
- Bio/PDB/StructureBuilder.hs +45/−43
- Bio/PDB/Util/MissingInstances.hs +1/−114
- INSTALL +32/−0
- README.md +13/−0
- Setup.hs +15/−1
- hPDB.cabal +30/−26
+ AUTHORS view
@@ -0,0 +1,3 @@+This parser and associated example programs were created by:+Michal J. Gajda 2010-2013+In his free time, unencumbered by work duties.
Bio/PDB/Common.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE StandaloneDeriving, BangPatterns #-} module Bio.PDB.Common(String(..), Vector3(..)) where
Bio/PDB/EventParser/FastParse.hs view
@@ -33,6 +33,7 @@ digitValue !c = ord c - ord '0' {-# INLINE final #-}+{-# ANN final "HLint: ignore Too strict if" #-} final :: Bool -> Double -> Maybe Double final !sign !f = if sign then Just (-f) else Just f
Bio/PDB/EventParser/HelixTypes.hs view
@@ -1,12 +1,12 @@ -- | Module contains enumeration of helix types, and auxiliary functions--- for converting these into numeric PDB CLASS code.+-- for converting these into PDB CLASS codes. module Bio.PDB.EventParser.HelixTypes(HelixT, helix2code, code2helix) where {-| Enumeration of helix types PDB Class number in columns 39-40 for each type of helix in HELIX record: - (1) Right-handed alpha (default)+ (1) Right-handed alpha (default, most common) (2) Right-handed omega @@ -40,7 +40,7 @@ Polyproline deriving (Eq, Ord, Show, Read) --- | helix2code converts a 'HelixT' enumeration into an PDB CLASS number.+-- | helix2code converts a 'HelixT' enumeration into an PDB CLASS code. helix2code RightAlpha = 1 helix2code RightOmega = 2 helix2code RightPi = 3@@ -52,7 +52,7 @@ helix2code Ribbon2_7 = 9 helix2code Polyproline = 10 --- | helix2code converts an PDB CLASS number into a 'HelixT' enumeration.+-- | helix2code converts an PDB CLASS code into a 'HelixT' enumeration. code2helix 1 = RightAlpha code2helix 2 = RightOmega code2helix 3 = RightPi
Bio/PDB/EventParser/PDBEventParser.hs view
@@ -76,7 +76,7 @@ a | "ENDMDL" `BS.isPrefixOf` a -> cont1 $! return [ENDMDL] a | "END" `BS.isPrefixOf` a -> cont1 $! return [END] -- common error in treatment of TER - omitting rest of the record- "TER" -> cont1 $! return [TER { num = (-1), resname = "", chain = ' ', resid = (-1), insCode = ' ' }]+ "TER" -> cont1 $! return [TER { num = -1, resname = "", chain = ' ', resid = -1, insCode = ' ' }] -- proper TER a | "TER" `BS.isPrefixOf` a -> cont1 $! parseTER line line_no a | "MASTER" `BS.isPrefixOf` a -> cont1 $! parseMASTER line line_no@@ -140,7 +140,7 @@ -- | Parses a strict ByteString 'contents' named 'fname' and performs 'action' -- on events given by parsing chunks, returning accumulated results. Accumulator -- is primed by 'acc'.-parsePDBRecords fname contents action acc = parsePDBLines fname contents 0 action acc+parsePDBRecords fname contents = parsePDBLines fname contents 0 -- | Checks whether line was ignored as unknown record type ignoreLine (PDBIgnoredLine _) = False
Bio/PDB/EventParser/PDBEventPrinter.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE OverloadedStrings, PatternGuards #-}+{-# LANGUAGE OverloadedStrings, PatternGuards, CPP #-} module Bio.PDB.EventParser.PDBEventPrinter(print, isPrintable) where@@ -9,17 +9,19 @@ import System.IO(Handle, IO, stderr) import qualified Data.ByteString.Char8 as BS import Data.String(IsString)-import Control.Monad(mapM, return)+import Control.Monad(mapM_, return) -import Bio.PDB.EventParser.PDBEvents+import Bio.PDB.EventParser.PDBEvents import qualified Bio.PDB.EventParser.ExperimentalMethods as ExperimentalMethods+#ifdef HAVE_TEXT_FORMAT import qualified Data.ByteString.Lazy as L-import Data.Text.Lazy.Encoding(encodeUtf8)-import Data.Text.Encoding (decodeUtf8)+import Data.Text.Lazy.Encoding(encodeUtf8)+import Data.Text.Encoding (decodeUtf8) import qualified Data.Text.Lazy as LT-import Data.Text.Lazy.Builder as B+import Data.Text.Lazy.Builder as B import qualified Data.Text.Format as F import qualified Data.Text.Buildable as BD+#endif -- | Prints a PDBEvent to a filehandle. print :: Handle -> PDBEvent -> IO ()@@ -37,18 +39,30 @@ elt = e, charge = ch, hetatm = isHet- } = do L.hPutStr handle . encodeUtf8 $ F.format "{}{} {}{}{} {}{}{} {}{}{}{}{} {}{}{}\n" args+ } =+#ifndef HAVE_TEXT_FORMAT+ hPrintf handle+ "%6s%5d %-3s%c%-3s %c%4d%c %8.3f%8.3f%8.3f%6.2f%6.2f %-4s%-2s%-2s\n"+ recname+ num (BS.unpack atype) al (BS.unpack rtype) c rid rins+ x y z occ bf+ (BS.unpack sid) (BS.unpack e) (BS.unpack ch) where+ recname :: Prelude.String+ recname = if isHet then "HETATM" else "ATOM "+#else+ L.hPutStr handle . encodeUtf8 $ F.format "{}{} {}{}{} {}{}{} {}{}{}{}{} {}{}{}\n" args+ where -- ra justifies a ByteString to the right ra i = F.right i ' ' . decodeUtf8 -- la justifies anything else (floating point or integer number) to the left la i = F.left i ' ' args = (recname, la 5 num, specfmt 4 3 atype,- conv al, ra 3 $ rtype,+ conv al, ra 3 rtype, conv c, la 4 rid, conv rins, ca x, ca y, ca z, pa occ, pa bf,- ra 4 $ sid, ra 2 $ e, ra 2 $ ch)+ ra 4 sid, ra 2 e, ra 2 ch) ca f = la 8 $ F.fixed 3 f -- align coordinate float pa f = la 6 $ F.fixed 2 f -- align property float recname = fromText $ if isHet then "HETATM" else "ATOM "@@ -56,6 +70,7 @@ conv x = fromString [x] -- specfmt mimics erratic alignment of PDB atom types: up to three characters are justified left, after prefixing by single space. specfmt i j a = B.fromLazyText . LT.justifyRight i ' ' . LT.justifyLeft j ' ' . B.toLazyText . fromText . decodeUtf8 $ a+#endif -- TODO: Note that this ANISOU code will be buggy for 4-letter atom codes that happen (rarely.) print handle ANISOU { no = n, @@ -110,7 +125,7 @@ print handle END = hPrintf handle "END\n" print handle ENDMDL = hPrintf handle "ENDMDL\n" print handle CONECT { atoms=ats } = do hPrintf handle "CONECT"- mapM (hPrintf handle "%5d") ats+ mapM_ (hPrintf handle "%5d") ats hPrintf handle "\n" print handle TER { num = n , resname = r ,@@ -129,15 +144,14 @@ numMaster = nmaster, numConect = ncon, numSeqres = nseq } = do hPrintf handle "MASTER %5d 0" nr- mapM (hPrintf handle "%5d")- [nhet, nhel, nsheet,- nturn, nsite, nxform, nats,- nmaster, ncon, nseq]+ mapM_ (hPrintf handle "%5d")+ [nhet, nhel, nsheet,+ nturn, nsite, nxform, nats,+ nmaster, ncon, nseq] hPrintf handle "\n" print handle REMARK { num = n,- text = t } = do mapM (hPrintf handle "REMARK %4d %-80s\n" n .- BS.unpack) t- return ()+ text = t } = mapM_ (hPrintf handle "REMARK %4d %-80s\n" n .+ BS.unpack) t {- KEYWDS { continuation :: !Int, aList :: ![String] } | AUTHOR { continuation :: !Int,@@ -149,11 +163,10 @@ print handle AUTHOR { continuation = c, aList = l } = printList handle "AUTHOR" "," c l print handle EXPDTA { continuation = c,- expMethods = e } = do mapM (hPrintf handle "EXPDTA %c%-80s\n"- (showContinuation c) .- BS.unpack .- ExperimentalMethods.showExpMethod) e- return ()+ expMethods = e } = mapM_ (hPrintf handle "EXPDTA %c%-80s\n"+ (showContinuation c) .+ BS.unpack .+ ExperimentalMethods.showExpMethod) e print handle TITLE { continuation = c, title = t } = hPrintf handle "TITLE %c%-80s\n" (showContinuation c)@@ -162,8 +175,8 @@ chain = ch, num = n, resList = l } = do hPrintf handle "SEQRES %3d %c %4d " sn ch n- mapM (hPrintf handle "%3s " .- BS.unpack) l+ mapM_ (hPrintf handle "%3s " .+ BS.unpack) l -- TODO: split when longer than X residues hPrintf handle "\n" print handle COMPND { cont = c,@@ -200,11 +213,11 @@ header :: String header = if aJRNL then "JRNL " else "REMARK 1 " [contd] = if c > 0 then show c else " "- printJRNL ((k,v):cs) = do hPrintf handle "%12s%4s %c %s\n"- (BS.unpack header)- (BS.unpack k)- contd- (BS.unpack v)+ printJRNL ((k,v):cs) = hPrintf handle "%12s%4s %c %s\n"+ (BS.unpack header)+ (BS.unpack k)+ contd+ (BS.unpack v) -- print errors: print handle (PDBParseError c r s) = hPrintf stderr "ERROR: In line %d column %d: %s" c r@@ -268,11 +281,11 @@ printMatrix :: Handle -> BS.ByteString -> Int -> [Vector3] -> [Double] -> IO () printMatrix handle ident n [] [] = return () printMatrix handle ident n (vec:vecs) (f:fs) = do hPrintf handle "%5s%c " (BS.unpack ident) cn- mapM printEntry [a, b, c]+ mapM_ printEntry [a, b, c] hPrintf handle " %9.5f\n" f printMatrix handle ident (n+1) vecs fs where [cn] = show n printEntry :: Double -> IO ()- printEntry f = hPrintf handle "%10.6f" f+ printEntry = hPrintf handle "%10.6f" Vector3 a b c = vec
Bio/PDB/EventParser/PDBParsingAbstractions.hs view
@@ -278,9 +278,9 @@ -- -- (3) input convertColumns :: [String -> ParsedField] -> [Int] -> String -> [ParsedField]-convertColumns convs cols s = map convert (zip convs content)+convertColumns convs cols s = zipWith convert convs content where- convert (conv, s) = conv s+ convert conv s = conv s content = splitByColumns s cols {-# INLINE findColumnErrors #-}
Bio/PDB/EventParser/ParseATOM.hs view
@@ -124,7 +124,7 @@ -- Result is a monad action returning a list of 'PDBEvent's. --{-# SPECIALIZE parseATOM :: Bool -> String -> Int -> IO [PDBEvent] #-} parseATOM :: (Monad m) => String -> Int -> m [PDBEvent]-parseATOM line line_no = return $ if errs == []+parseATOM line line_no = return $ if null errs then [result] else errs where@@ -234,7 +234,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseANISOU :: (Monad m) => String -> Int -> m [PDBEvent]-parseANISOU line line_no = return $ if errs == [] then result `seq` [result] else errs+parseANISOU line line_no = return $ if null errs then result `seq` [result] else errs where -- parse (fields, errs) = parseFields anisouFields line line_no
Bio/PDB/EventParser/ParseCAVEAT.hs view
@@ -41,7 +41,7 @@ -- parseCAVEAT :: (Monad m) => String -> Int -> m [PDBEvent] -- Result is a monad action returning a list of 'PDBEvent's.-parseCAVEAT line line_no = return $ if errs == []+parseCAVEAT line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseCISPEP.hs view
@@ -62,7 +62,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseCISPEP :: (Monad m) => String -> Int -> m [PDBEvent]-parseCISPEP line line_no = return $ if errs == []+parseCISPEP line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseCONECT.hs view
@@ -44,7 +44,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseCONECT :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent]-parseCONECT line line_no = return $ if errs == []+parseCONECT line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseCRYST1.hs view
@@ -48,9 +48,9 @@ -- Result is a monad action returning a list of 'PDBEvent's. {-# SPECIALIZE parseCRYST1 :: BS.ByteString -> Int -> IO [PDBEvent] #-} parseCRYST1 :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent]-parseCRYST1 line line_no = return $ if errs == []+parseCRYST1 line line_no = return $ if null errs then [result]- else errs--}+ else errs where -- parse (fields, errs) = parseFields crystFields line line_no
Bio/PDB/EventParser/ParseDBREF.hs view
@@ -82,7 +82,7 @@ -- Result is a monad action returning a list of 'PDBEvent's. {-# SPECIALIZE parseDBREF :: BS.ByteString -> Int -> IO [PDBEvent] #-} parseDBREF :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent]-parseDBREF line line_no = return $ if errs == []+parseDBREF line line_no = return $ if null errs then [result] else errs where@@ -200,7 +200,7 @@ -- Result is a monad action returning a list of 'PDBEvent's. {-# SPECIALIZE parseDBREF12 :: (BS.ByteString, BS.ByteString) -> Int -> IO [PDBEvent] #-} parseDBREF12 :: (Monad m) => (BS.ByteString, BS.ByteString) -> Int -> m [PDBEvent]-parseDBREF12 (!line1, !line2) !line_no = return $ if errs == []+parseDBREF12 (!line1, !line2) !line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseFORMUL.hs view
@@ -44,7 +44,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseFORMUL :: (Monad m) => String -> Int -> m [PDBEvent]-parseFORMUL line line_no = return $ if errs == []+parseFORMUL line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseHEADER.hs view
@@ -37,7 +37,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseHEADER :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent]-parseHEADER line line_no = return $ if errs == [] then [result] else errs+parseHEADER line line_no = return $ if null errs then [result] else errs where -- parse (fields, errs) = parseFields headerFields line line_no
Bio/PDB/EventParser/ParseHELIX.hs view
@@ -73,7 +73,7 @@ -- Result is a monad action returning a list of 'PDBEvent's. parseHELIX :: (Monad m) => String -> Int -> m [PDBEvent] parseHELIX line line_no = --return [Test $ BS.pack $ show $ ((length helixFields)::Int)]- return $ if errs == []+ return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseHET.hs view
@@ -48,7 +48,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseHET :: (Monad m) => String -> Int -> m [PDBEvent]-parseHET line line_no = return $ if errs == []+parseHET line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseHETNAM.hs view
@@ -42,7 +42,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseHETNAM :: (Monad m) => Bool -> String -> Int -> m [PDBEvent]-parseHETNAM isNameNotSynonym line line_no = return $ if errs == []+parseHETNAM isNameNotSynonym line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseHYDBND.hs view
@@ -77,7 +77,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseHYDBND :: (Monad m) => String -> Int -> m [PDBEvent]-parseHYDBND line line_no = return $ if errs == []+parseHYDBND line line_no = return $ if null errs then [result] else errs -- return $ [PDBParseError 0 0 $ BS.pack $ show $ Prelude.length fields] where
Bio/PDB/EventParser/ParseIntRecord.hs view
@@ -37,7 +37,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseIntRecord :: (Monad m) => (Int -> PDBEvent) -> String -> Int -> m [PDBEvent]-parseIntRecord cons line line_no = return $ if errs == []+parseIntRecord cons line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseJRNL.hs view
@@ -47,7 +47,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseJournalRef :: (Monad m) => Bool -> BS.ByteString -> Int -> m [PDBEvent]-parseJournalRef isFirst line line_no = return $ if errs == []+parseJournalRef isFirst line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseLINK.hs view
@@ -68,12 +68,12 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseLINK :: (Monad m) => String -> Int -> m [PDBEvent]-parseLINK line line_no = return $ if errs == []+parseLINK line line_no = return $ if null errs then [result] else errs where -- parse- errs = if fErrs == [] then fgErrs else fErrs+ errs = if null fErrs then fgErrs else fErrs (fields, fErrs) = parseFields linkFields line line_no [fRec, _, fAtName1, fAltLoc1, fResname1, _, fChain1, fResnum1, fInsCode1, _,
Bio/PDB/EventParser/ParseListRecord.hs view
@@ -53,7 +53,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseListRecord :: (Monad m) =>(Int -> [String] -> PDBEvent)-> Char-> String-> Int-> m [PDBEvent]-parseListRecord cons sep line line_no = return $ if errs == []+parseListRecord cons sep line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseMASTER.hs view
@@ -62,7 +62,7 @@ -- (2) input line number -- -- Result is a mionad action returning a list of 'PDBEvent's.-parseMASTER line line_no = return $ if errs == []+parseMASTER line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseMODRES.hs view
@@ -50,7 +50,7 @@ -- Result is a monad action returning a list of 'PDBEvent's. {-# SPECIALIZE parseMODRES :: BS.ByteString -> Int -> IO [PDBEvent] #-} parseMODRES :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent]-parseMODRES line line_no = return $ if errs == []+parseMODRES line line_no = return $ if null errs then [result] else errs where@@ -62,7 +62,7 @@ IFStr stdres = fStdRes IFStr comment = fComment - errs = if fErrs == [] then fgErrs else fErrs+ errs = if null fErrs then fgErrs else fErrs fgRes = fgResidue True "modified" 15 fModRes fChain fSeqNum fInsCode fgErrs = liftFgErrs line_no [fgRes] Right res = fgRes
Bio/PDB/EventParser/ParseMatrixRecord.hs view
@@ -52,7 +52,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseMatrixRecord :: (Monad m) =>(Int -> Bool -> Int -> [Vector3] -> [Double] -> PDBEvent)-> String-> Int-> m [PDBEvent]-parseMatrixRecord cons line line_no = return $ if errs == []+parseMatrixRecord cons line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseObsoleting.hs view
@@ -59,7 +59,7 @@ -- (3) input line number -- -- Result is a monad action returning a list of 'PDBEvent's.-parseObsoleting cons line line_no = return $ if errs == []+parseObsoleting cons line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseREMARK.hs view
@@ -43,7 +43,7 @@ -- Result is a monad action returning a list of 'PDBEvent's. parseREMARK :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent] parseREMARK line line_no = - if errs == []+ if null errs then (if (num == 1) && not (BS.all (==' ') text) && not ("REFERENCE" `BS.isPrefixOf` text)
Bio/PDB/EventParser/ParseREVDAT.hs view
@@ -75,7 +75,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseREVDAT :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent]-parseREVDAT line line_no = return $ if errs == []+parseREVDAT line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseSEQADV.hs view
@@ -59,7 +59,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseSEQADV :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent]-parseSEQADV line line_no = return $ if errs == []+parseSEQADV line line_no = return $ if null errs then [result] else errs where@@ -77,7 +77,7 @@ IFNone -> Nothing IFStr comment = fComment - errs = if fErrs == [] then fgErrs else fErrs+ errs = if null fErrs then fgErrs else fErrs fgRes = maybeFgResidue False "modified residue" 15 fResname fChain fSeqNum fInsCode fgErrs = liftFgErrs line_no [fgRes] Right res = fgRes
Bio/PDB/EventParser/ParseSEQRES.hs view
@@ -69,7 +69,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseSEQRES :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent]-parseSEQRES line line_no = return $ if errs == []+parseSEQRES line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseSHEET.hs view
@@ -100,7 +100,7 @@ -- Result is a monad action returning a list of 'PDBEvent's. parseSHEET :: (Monad m) => String -> Int -> m [PDBEvent] parseSHEET line line_no = --return [Test $ BS.pack $ show $ ((length helixFields)::Int)]- return $ if errs == []+ return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseSITE.hs view
@@ -94,12 +94,12 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseSITE :: (Monad m) => String -> Int -> m [PDBEvent]-parseSITE line line_no = return $ if errs == []+parseSITE line line_no = return $ if null errs then [result] else errs where -- parse- errs = if fErrs == [] then fgErrs else fErrs+ errs = if null fErrs then fgErrs else fErrs (fields, fErrs) = parseFields siteFields line line_no [fRec, _, fSerial, _, fSiteId, _, fNumRes, _, fResname1, _, fChain1, fResnum1, fInsCode1, _,
Bio/PDB/EventParser/ParseSLTBRG.hs view
@@ -65,7 +65,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseSLTBRG :: (Monad m) => String -> Int -> m [PDBEvent]-parseSLTBRG line line_no = return $ if errs == []+parseSLTBRG line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseSPLIT.hs view
@@ -49,7 +49,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseSPLIT :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent]-parseSPLIT line line_no = return $ if errs == []+parseSPLIT line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseSSBOND.hs view
@@ -63,7 +63,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseSSBOND :: (Monad m) => String -> Int -> m [PDBEvent]-parseSSBOND line line_no = return $ if errs == []+parseSSBOND line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseSpecListRecord.hs view
@@ -57,7 +57,7 @@ checkEntry :: [String] -> [PDBEvent] checkEntry [_, _] = [] checkEntry [ _] = []- checkEntry entry = [PDBParseError line_no 11 {- column where speclist begins -} $+ checkEntry entry = [PDBParseError line_no 11 {- column where speclist begins -} ("Cannot parse specification list fragment: " `BS.append` ( BS.pack . show $ entry))]
Bio/PDB/EventParser/ParseTER.hs view
@@ -46,7 +46,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseTER :: (Monad m) => String -> Int -> m [PDBEvent]-parseTER line line_no = return $ if errs == []+parseTER line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseTITLE.hs view
@@ -36,7 +36,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseTITLE :: (Monad m) => BS.ByteString -> Int -> m [PDBEvent]-parseTITLE line line_no = return $ if errs == []+parseTITLE line line_no = return $ if null errs then [result] else errs where
Bio/PDB/EventParser/ParseTVECT.hs view
@@ -44,7 +44,7 @@ -- -- Result is a monad action returning a list of 'PDBEvent's. parseTVECT :: (Monad m) => String -> Int -> m [PDBEvent]-parseTVECT line line_no = return $ if errs == []+parseTVECT line line_no = return $ if null errs then [result] else errs where
Bio/PDB/IO.hs view
@@ -4,7 +4,7 @@ import qualified Control.Exception(catch) import Control.Exception.Base(SomeException)-import System.IO hiding(writeFile)+import System.IO hiding(writeFile, FilePath) import Prelude hiding(String,writeFile) import Bio.PDB.EventParser.PDBParsingAbstractions import Bio.PDB.Structure.List as L@@ -25,26 +25,30 @@ -- Until I get a newer version of Control.DeepSeq: force x = x `deepseq` x -parse :: String -> IO (Maybe Bio.PDB.Structure.Structure)-parse filename = do input <- Bio.PDB.IO.OpenAnyFile.readFile $ BS.unpack filename- (do (structure, errs) <- return $ Bio.PDB.StructureBuilder.parse filename input- mapM_ (showError filename) (L.toList errs)- structure `deepseq` return $ Just $ structure- `Control.Exception.catch`- (exceptionHandler filename))+-- | Parse a .pdb file and return `Bio.PDB.Structure.Structure`.+parse :: FilePath -> IO (Maybe Bio.PDB.Structure.Structure)+parse filename = do input <- Bio.PDB.IO.OpenAnyFile.readFile filename+ do (structure, errs) <- return $ Bio.PDB.StructureBuilder.parse filename input+ mapM_ (showError filename) (L.toList errs)+ structure `deepseq` return $ Just structure+ `Control.Exception.catch`+ exceptionHandler filename -exceptionHandler :: String -> SomeException -> IO (Maybe a)-exceptionHandler filename e = do printError $ [filename, ":", BS.pack $ show e]+-- | Default exception handler that for `IO (Maybe a)` just prints nice error message to stderr, and returns Nothing+exceptionHandler :: FilePath -> SomeException -> IO (Maybe a)+exceptionHandler filename e = do printError [BS.pack filename, ":", BS.pack $ show e] return Nothing +-- | Prints a catenated list of ByteStrings to stderr. (Convenience function.) printError msg = BS.hPutStrLn System.IO.stderr $ BS.concat msg +-- | Show error message from `PDBParser`. showError filename (PDBParseError line_no col_no msg) =- printError $ [filename, ":", BS.pack $ show line_no, ":", BS.pack $ show col_no, "\t", msg]+ printError [BS.pack filename, ":", BS.pack $ show line_no, ":", BS.pack $ show col_no, "\t", msg] showError filename (PDBIgnoredLine line) =- printError $ [filename, ": IGNORED ", line]+ printError [BS.pack filename, ": IGNORED ", line] --- | Write structure to a .pdb file. (NOT YET IMPLEMENTED)-write :: Bio.PDB.Structure.Structure -> String -> IO ()-write structure fname = writeFile (BS.unpack fname) $ \h -> PDBSP.write h structure+-- | Write structure to a .pdb file.+write :: Bio.PDB.Structure.Structure -> FilePath -> IO ()+write structure fname = writeFile fname $ \h -> PDBSP.write h structure
Bio/PDB/IO/OpenAnyFile.hs view
@@ -11,6 +11,7 @@ import System.Directory (doesFileExist, getPermissions, Permissions(..)) import System.IO.Error (userError, IOError) import System.IO (withFile, IOMode(..))+import Control.Monad (void) -- if we have zlib: import qualified Codec.Compression.GZip as GZip import qualified Data.ByteString.Lazy as BSL@@ -21,7 +22,7 @@ -- if we have MMap: #ifdef HAVE_MMAP-import System.IO.Posix.MMap(unsafeMMapFile)+import System.IO.MMap (mmapFileByteString) #endif -- otherwise:@@ -35,8 +36,8 @@ throwNotFound fname readFile' fname = do content <- simpleRead fname- let r = (let codec = getCodec fname content- in BS.concat $ BSL.toChunks $ codec $ BSL.fromChunks [content])+ let r = let codec = getCodec fname content+ in BS.concat $ BSL.toChunks $ codec $ BSL.fromChunks [content] return r throwNotFound :: String -> IO a@@ -45,7 +46,7 @@ getCodec fname c | (".gz" `BS.isSuffixOf` BS.pack fname) || (".Z" `BS.isSuffixOf` BS.pack fname) = GZip.decompressWith (gzipParams c) --getCodec fname c | (".bz2" `BS.isSuffixOf` (BS.pack fname)) = BZip.decompressWith (bzipParams c) -- DOESN'T WORK!!!-getCodec fname c | otherwise = id+getCodec fname c = id gzipParams c = GZip.DecompressParams GZip.defaultWindowBits (fromIntegral (BS.length c * 5)) #ifndef OLD_ZLIB@@ -62,13 +63,12 @@ else return False #ifndef HAVE_MMAP-simpleRead fname = BS.readFile fname+simpleRead = BS.readFile #else-simpleRead fname = unsafeMMapFile fname `Exc.catch` \e -> do reportError (e :: IOError)- BS.readFile fname+simpleRead fname = mmapFileByteString fname Nothing `Exc.catch` \e -> do reportError (e :: IOError) -- cannot mmap+ BS.readFile fname where reportError e = do putStrLn $ concat [show e, "while trying to mmap('", fname, "')"] #endif -writeFile fname writer = do withFile fname WriteMode $ writer - return ()+writeFile fname writer = void $ withFile fname WriteMode writer
− Bio/PDB/InstantiateIterable.hs
@@ -1,68 +0,0 @@-{-# LANGUAGE TemplateHaskell, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, NoMonomorphismRestriction #-}-module Bio.PDB.InstantiateIterable(Iterable(..) ,- gen_iterable ,- self_iterable ,- trans_iterable) where--import qualified Bio.PDB.Structure.List as L-import Language.Haskell.TH.Syntax-import Control.Monad.Identity(runIdentity,foldM)-import Data.List(foldl')--class Iterable a b where- imapM :: (Monad m) => (b -> m b) -> a -> m a- imap :: (b -> b) -> a -> a- imap f e = runIdentity $ imapM (\b -> return $ f b) e- ifoldM :: (Monad m) => (c -> b -> m c) -> c -> a -> m c- ifoldr :: (b -> c -> c) -> c -> a -> c- ifoldl :: (c -> b -> c) -> c -> a -> c- ifoldl' :: (c -> b -> c) -> c -> a -> c- ilength :: b -> a -> Int -- NOTE: b is 'dummy' type argument to satisfy Iterable a b constraint---- | Generates a direct instance of iterable between $typA and $typB with--- given names of getter and setter, so that:--- $getter :: $typA -> $typB --- $setter :: $typB -> $typA -> $typA-gen_iterable typA typB getter setter = - [d| instance Iterable $(typA) $(typB) where- imapM f a =- do b' <- L.mapM f ( $(getter) a)- return $ $(setter) a b'- ifoldM f e a = do r <- L.foldM f e ( $(getter) a)- return r- ifoldr f e a = L.foldr f e ( $(getter) a)- ifoldl f e a = L.foldl f e ( $(getter) a)- ifoldl' f e a = L.foldl' f e ( $(getter) a) - ilength d a = L.length ( $(getter) a)- |]---- | Generates convenience function for iterating over a single object.-self_iterable typA = - [d| instance Iterable $(typA) $(typA) where- imapM f a = f a - ifoldM f e a = f e a- ifoldr f e a = f a e- ifoldl f e a = f e a - ifoldl' f e a = f e a- ilength d a = 1- |]---self_iterable typA = gen_iterable typA typA [e| id |] [e| L.singleton |]---- This works:--- ilength a = L.length ( $(getter) a)---- | Generates a transitive instance of `Iterable` between $typA and $typC,--- assuming existence of `Iterable` $typA $typB, and `Iterable` $typB $typC.-trans_iterable typA typB typC = - [d| instance Iterable $(typA) $(typC) where- imapM f a = (imapM :: (Monad m) => ( $(typB) -> m $(typB) ) -> $(typA) -> m $(typA) ) (imapM f) a - imap f a = (imap :: ( $(typB) -> $(typB) ) -> $(typA) -> $(typA) ) (imap f) a - ifoldM f e a = (ifoldM :: (Monad m) => (c -> $(typB) -> m c) -> c -> $(typA) -> m c ) (ifoldM f) e a - ifoldr f e a = (ifoldr :: ($(typB) -> c -> c) -> c -> $(typA) -> c ) (\bb cc -> ifoldr f cc bb) e a- ifoldl f e a = (ifoldl :: (c -> $(typB) -> c) -> c -> $(typA) -> c ) (ifoldl f) e a- ifoldl' f e a = (ifoldl' :: (c -> $(typB) -> c) -> c -> $(typA) -> c ) (ifoldl' f) e a- ilength _ a = (ifoldl' :: (c -> $(typB) -> c) -> c -> $(typA) -> c ) (\a b-> a + ilength (undefined :: $(typC)) b) 0 a- |]--- How to make this work:--- ilength a = (ifoldl' :: (Int -> $(typB) -> Int) -> Int -> $(typA) -> Int ) (\i b -> i+(ilength :: Iterable $(typB) $(typC) => $(typB) -> Int) b) 0 a-
Bio/PDB/Iterable.hs view
@@ -1,20 +1,23 @@ {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, UndecidableInstances, OverlappingInstances, TemplateHaskell, FlexibleContexts #-}+-- | Instances of Iterable class. module Bio.PDB.Iterable(Iterable(..)) where +import Data.Iterable+import Data.Iterable.Instantiate+import Data.Iterable.Instantiate.Vector+import Data.Vector import Bio.PDB.Structure.List as L import Bio.PDB.Structure import Control.Monad.Identity import Control.Monad(foldM) -import Bio.PDB.InstantiateIterable--$(gen_iterable [t| Structure |] [t| Model |] [e| models |] [e| (\s m -> s { models = m }) |] )+$(gen_vector_iterable [t| Structure |] [t| Model |] [e| models |] [e| (\s m -> s { models = m }) |] ) -$(gen_iterable [t| Model |] [t| Chain |] [e| chains |] [e| (\s m -> s { chains = m }) |] )+$(gen_vector_iterable [t| Model |] [t| Chain |] [e| chains |] [e| (\s m -> s { chains = m }) |] ) -$(gen_iterable [t| Chain |] [t| Residue |] [e| residues |] [e| (\s m -> s { residues = m }) |] )+$(gen_vector_iterable [t| Chain |] [t| Residue |] [e| residues |] [e| (\s m -> s { residues = m }) |] ) -$(gen_iterable [t| Residue |] [t| Atom |] [e| atoms |] [e| (\s m -> s { atoms = m }) |] )+$(gen_vector_iterable [t| Residue |] [t| Atom |] [e| atoms |] [e| (\s m -> s { atoms = m }) |] ) $(self_iterable [t| Structure |] ) $(self_iterable [t| Model |] )
Bio/PDB/Structure.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE BangPatterns, DisambiguateRecordFields #-}+{-# LANGUAGE DisambiguateRecordFields #-} module Bio.PDB.Structure(String, vdot, vnorm, vproj, vperpend, vperpends, vdihedral, (*|), (|*), Structure(..), Model(..), Chain(..), Residue(..), Atom(..))
Bio/PDB/Structure/Elements.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE OverloadedStrings, BangPatterns #-}+{-# LANGUAGE OverloadedStrings #-} module Bio.PDB.Structure.Elements(Element(..), -- Finding element for a given atom assignElement,
Bio/PDB/Structure/List.hs view
@@ -70,7 +70,7 @@ when (i < 0) $ fail "Negative STRef" let j = i + 1 l = M.length v- v' <- if (j > l)+ v' <- if j > l then do nV <- M.grow v j writeSTRef vs nV return nV
Bio/PDB/Structure/Vector.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE NoMonomorphismRestriction, BangPatterns #-}-module Bio.PDB.Structure.Vector(Vec3D(..),- unpackVec3D,+module Bio.PDB.Structure.Vector(Vector3(..),+ unpackVector3, vnormalise, vdot, (*|), (|*), vzip, vmap, vnorm, vproj, vperpend, vperpends, vdihedral) where@@ -10,54 +10,51 @@ import Data.List(foldl') import Test.QuickCheck --- ^ This module wraps 3D vector operations, and adds missing ones. Also hides a "Vector" class---- | Defines type alias for position and translation vectors in PDB structures.-type Vec3D = Vector3+-- ^ This module wraps 3D vector operations, and adds missing ones. -- | Unpacks an abstract 3D vector into a triple of Doubles.-unpackVec3D :: Vec3D -> (Double, Double, Double)-unpackVec3D (Vector3 x y z) = (x, y, z)+unpackVector3 :: Vector3 -> (Double, Double, Double)+unpackVector3 (Vector3 x y z) = (x, y, z) -- | Maps an operation that modifies a Double onto a 3D vector. {-# INLINE vmap #-}-vmap :: (Double -> Double) -> Vec3D -> Vec3D+vmap :: (Double -> Double) -> Vector3 -> Vector3 vmap = C.vmap -- | Maps an operation on a pair of Doubles onto a pair of 3D vectors -- coordinatewise.-vzip :: (Double -> Double -> Double) -> Vec3D -> Vec3D -> Vec3D+vzip :: (Double -> Double -> Double) -> Vector3 -> Vector3 -> Vector3 vzip = C.vzip -- | Normalises to a unit vector in the same direction as input. {-# INLINE vnormalise #-}-vnormalise :: Vec3D -> Vec3D+vnormalise :: Vector3 -> Vector3 vnormalise = C.vnormalise -- | Computes a dot product of two 3D vectors. {-# INLINE vdot #-}-vdot :: Vec3D -> Vec3D -> Double+vdot :: Vector3 -> Vector3 -> Double vdot = C.vdot {-# INLINE vnorm #-} -- | 2-norm of a vector (also called a magnitude or length.)-vnorm :: Vec3D -> Double+vnorm :: Vector3 -> Double vnorm = C.vmag {-# INLINE vdihedral #-} -- | Compute dihedral between three bond vectors using spherical angle formula.-vdihedral :: Vec3D -> Vec3D -> Vec3D -> Double-vdihedral !a !b !c = (atan2 (vnorm b * (a `vdot` (b `vcross` c)))- ((a `vcross` b) `vdot` (b `vcross` c)) )+vdihedral :: Vector3 -> Vector3 -> Vector3 -> Double+vdihedral !a !b !c = atan2 (vnorm b * (a `vdot` (b `vcross` c)))+ ((a `vcross` b) `vdot` (b `vcross` c)) -- | Scalar product. (`*` indicates side on which one can put a scalar.) {-# INLINE (*|) #-}-(*|) :: Double -> Vec3D -> Vec3D+(*|) :: Double -> Vector3 -> Vector3 (*|) = (C.*|) -- | Scalar product. (`*` indicates side on which one can put a scalar.) {-# INLINE (|*) #-}-(|*) :: Vec3D -> Double -> Vec3D+(|*) :: Vector3 -> Double -> Vector3 (|*) = (C.|*) {-# INLINE vproj #-}
Bio/PDB/StructureBuilder.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE BangPatterns, DisambiguateRecordFields, MultiParamTypeClasses, NamedFieldPuns, FlexibleContexts, OverloadedStrings, PatternGuards, RankNTypes #-}+{-# LANGUAGE BangPatterns, DisambiguateRecordFields, MultiParamTypeClasses, NamedFieldPuns, FlexibleContexts, OverloadedStrings, RankNTypes #-} {-# LANGUAGE RecordWildCards #-} -- for convenient debugging {-# OPTIONS_GHC -fspec-constr-count=2 #-} module Bio.PDB.StructureBuilder(parse)@@ -11,6 +11,7 @@ import Control.Monad.State.Strict as State import Control.Monad(when) import Data.STRef as STRef+import Data.Maybe(isNothing, isJust) import Bio.PDB.EventParser.PDBEvents(PDBEvent(..), RESID(..)) import qualified Bio.PDB.EventParser.PDBEventParser(parsePDBRecords)@@ -28,14 +29,14 @@ parsePDBRec :: String -> String -> (() -> PDBEvent -> ParsingMonad t ()) -> () -> ParsingMonad t () parsePDBRec = Bio.PDB.EventParser.PDBEventParser.parsePDBRecords ---parse :: (State.MonadState BState m) => String -> String -> m (Structure, [PDBEvent]) -- | Given filename, and contents, parses a whole PDB file, returning a monadic action -- | with a tuple of (Structure, [PDBEvent]), where the list of events contains all -- | parsing or construction errors.+--parse :: (State.MonadState BState m) => FilePath -> String -> m (Structure, [PDBEvent]) parse fname contents = ST.runST $ do initial <- initializeState (s, e) <- State.evalStateT parsing initial- return $! (s :: Structure, e :: L.List PDBEvent)- where parsing = do parsePDBRec fname contents (\() !ev -> parseStep ev) ()+ return (s :: Structure, e :: L.List PDBEvent)+ where parsing = do parsePDBRec (BS.pack fname) contents (\() !ev -> parseStep ev) () closeStructure s <- State.gets currentStructure e <- State.gets errors@@ -52,7 +53,7 @@ modelContents :: L.TempList s Chain, structureContents :: L.TempList s Model, errors :: L.TempList s PDBEvent,- line_no :: STRef.STRef s Int+ lineNo :: STRef.STRef s Int } -- | Initial state of the structure record builder.@@ -63,16 +64,16 @@ s <- L.initialNew 1 e <- L.initialNew 100 l <- STRef.newSTRef 1- return $ BState { currentResidue = Nothing,- currentModel = Nothing,- currentChain = Nothing,- currentStructure = Structure { models = L.empty },- residueContents = r,- chainContents = c,- modelContents = m,- structureContents = s,- errors = e,- line_no = l }+ return BState { currentResidue = Nothing,+ currentModel = Nothing,+ currentChain = Nothing,+ currentStructure = Structure { models = L.empty },+ residueContents = r,+ chainContents = c,+ modelContents = m,+ structureContents = s,+ errors = e,+ lineNo = l } -- | Checks that a residue with a given identification tuple is current, -- | or if not, then closes previous residue (if present), -- | and marks a new ,,current'' residue in a state of builder.@@ -109,8 +110,8 @@ where chainChanged Nothing = True chainChanged (Just (Chain { chainId = oldChain })) = oldChain /= name- createChain l state = state { currentChain = Just $! Chain { chainId = name,- residues = L.empty },+ createChain l state = state { currentChain = Just Chain { chainId = name,+ residues = L.empty }, chainContents = l } @@ -120,18 +121,18 @@ -- [Otherwise one needs to report an error!] checkModel :: ParsingMonad t () checkModel = do curModel <- State.gets currentModel- when (curModel == Nothing) $ openModel 1+ when (isNothing curModel) $ openModel 1 -- | Closes construction of a current residue and appends this residue to a current chain. (Monadic action.) --closeResidue :: State.State BState () closeResidue :: ParsingMonad t () closeResidue = do r <- State.gets currentResidue- when (r /= Nothing) $ do let Just res = r- rc <- State.gets residueContents- rf <- L.finalize rc- cc <- State.gets chainContents- cc' <- L.add cc $ res { Bio.PDB.Structure.atoms = rf }- State.modify clearResidue+ when (isJust r) $ do let Just res = r+ rc <- State.gets residueContents+ rf <- L.finalize rc+ cc <- State.gets chainContents+ cc' <- L.add cc $ res { Bio.PDB.Structure.atoms = rf }+ State.modify clearResidue where clearResidue st = st { currentResidue = Nothing } @@ -142,21 +143,21 @@ closeChain = do closeResidue c <- State.gets currentChain ac <- State.gets chainContents- when (c /= Nothing) $ do l <- State.gets chainContents- l' <- L.finalize l- let Just ch = c- ch' = ch { Bio.PDB.Structure.residues = l' }- m <- State.gets currentModel- when (m == Nothing) $ do mli <- State.gets structureContents- i <- L.tempLength mli- openModel i- addError ["Trying to close chain when currentChain is ",- BS.pack . show $ ch,- " and currentModel is ",- BS.pack . show $ m]- ml <- State.gets modelContents- ml' <- L.add ml ch'- State.modify clearChain+ when (isJust c) $ do l <- State.gets chainContents+ l' <- L.finalize l+ let Just ch = c+ ch' = ch { Bio.PDB.Structure.residues = l' }+ m <- State.gets currentModel+ when (isNothing m) $ do mli <- State.gets structureContents+ i <- L.tempLength mli+ openModel i+ addError ["Trying to close chain when currentChain is ",+ BS.pack . show $ ch,+ " and currentModel is ",+ BS.pack . show $ m]+ ml <- State.gets modelContents+ ml' <- L.add ml ch'+ State.modify clearChain where clearChain st = st { currentChain = Nothing } @@ -165,11 +166,12 @@ -- TODO: forgot about line/column number passing! addError :: [String] -> ParsingMonad t () addError msg = do e <- State.gets errors- lnref <- State.gets line_no+ lnref <- State.gets lineNo ln <- lift $ STRef.readSTRef lnref lift $ STRef.modifySTRef lnref (+1) L.add e $ anError ln- where anError ln = PDBParseError ln 0 $ BS.concat msg+ where+ anError ln = PDBParseError ln 0 $ BS.concat msg -- | Finalizes construction of current model closeModel :: ParsingMonad t ()@@ -199,14 +201,14 @@ structureContents = undefined } nextLine :: ParsingMonad t ()-nextLine = do lnref <- State.gets line_no+nextLine = do lnref <- State.gets lineNo lift $ STRef.modifySTRef lnref (+1) -- | Performs a match on a single PDBEvent and performs relevant change to a BState of structure builder. --parseStep :: (State.MonadState BState m) => PDBEvent -> m () parseStep pe@(PDBParseError l _ _) = do e <- State.gets errors L.add e pe - lnref <- State.gets line_no+ lnref <- State.gets lineNo lift $ STRef.writeSTRef lnref l parseStep (ATOM { no = atSer, -- :: !Int, atomtype = atType, -- :: !String,
Bio/PDB/Util/MissingInstances.hs view
@@ -1,128 +1,15 @@ {-# LANGUAGE CPP #-} --- | This module contains instances of `NFData` for Data.ByteString--- and `Params` before text-format 0.3.0.8.+-- | This module contains instances of `NFData` for Data.ByteString. module Bio.PDB.Util.MissingInstances() where import Prelude() import qualified Data.ByteString as BS import Control.DeepSeq -#ifdef DEFINE_PARAMS_INSTANCES-import Data.Text.Buildable-import Data.Text.Format.Types-import Data.Text.Lazy.Builder-import Data.Text.Format.Params(Params(..))-#endif-- #ifdef DEFINE_NFDATA_INSTANCE -- I use strict version of BS.ByteString so default implementation should do -- | Nothing needs to be done in NFData instance for stricty `BS.ByteString`. instance NFData BS.ByteString where #endif -#ifdef DEFINE_PARAMS_INSTANCES---- | Adds instances of Params for tuples of more than ten Buildables.-instance (Buildable a, Buildable b, Buildable c, Buildable d, Buildable e,- Buildable f, Buildable g, Buildable h, Buildable i, Buildable j,- Buildable k)- => Params (a,b,c,d,e,f,g,h,i,j,k) where- buildParams (a,b,c,d,e,f,g,h,i,j,k) =- [build a, build b, build c, build d, build e,- build f, build g, build h, build i, build j,- build k]--instance (Buildable a, Buildable b, Buildable c, Buildable d, Buildable e,- Buildable f, Buildable g, Buildable h, Buildable i, Buildable j,- Buildable k, Buildable l)- => Params (a,b,c,d,e,f,g,h,i,j,k,l) where- buildParams (a,b,c,d,e,f,g,h,i,j,k,l) =- [build a, build b, build c, build d, build e,- build f, build g, build h, build i, build j,- build k, build l]--instance (Buildable a, Buildable b, Buildable c, Buildable d, Buildable e,- Buildable f, Buildable g, Buildable h, Buildable i, Buildable j,- Buildable k, Buildable l, Buildable m)- => Params (a,b,c,d,e,f,g,h,i,j,k,l,m) where- buildParams (a,b,c,d,e,f,g,h,i,j,k,l,m) =- [build a, build b, build c, build d, build e,- build f, build g, build h, build i, build j,- build k, build l, build m]--instance (Buildable a, Buildable b, Buildable c, Buildable d, Buildable e,- Buildable f, Buildable g, Buildable h, Buildable i, Buildable j,- Buildable k, Buildable l, Buildable m, Buildable n)- => Params (a,b,c,d,e,f,g,h,i,j,k,l,m,n) where- buildParams (a,b,c,d,e,f,g,h,i,j,k,l,m,n) =- [build a, build b, build c, build d, build e,- build f, build g, build h, build i, build j,- build k, build l, build m, build n]--instance (Buildable a, Buildable b, Buildable c, Buildable d, Buildable e,- Buildable f, Buildable g, Buildable h, Buildable i, Buildable j,- Buildable k, Buildable l, Buildable m, Buildable n, Buildable o)- => Params (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) where- buildParams (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) =- [build a, build b, build c, build d, build e,- build f, build g, build h, build i, build j,- build k, build l, build m, build n, build o]--instance (Buildable a, Buildable b, Buildable c, Buildable d, Buildable e,- Buildable f, Buildable g, Buildable h, Buildable i, Buildable j,- Buildable k, Buildable l, Buildable m, Buildable n, Buildable o,- Buildable p)- => Params (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) where- buildParams (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) =- [build a, build b, build c, build d, build e,- build f, build g, build h, build i, build j,- build k, build l, build m, build n, build o,- build p]--instance (Buildable a, Buildable b, Buildable c, Buildable d, Buildable e,- Buildable f, Buildable g, Buildable h, Buildable i, Buildable j,- Buildable k, Buildable l, Buildable m, Buildable n, Buildable o,- Buildable p, Buildable r)- => Params (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r) where- buildParams (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r) =- [build a, build b, build c, build d, build e,- build f, build g, build h, build i, build j,- build k, build l, build m, build n, build o,- build p, build r]--instance (Buildable a, Buildable b, Buildable c, Buildable d, Buildable e,- Buildable f, Buildable g, Buildable h, Buildable i, Buildable j,- Buildable k, Buildable l, Buildable m, Buildable n, Buildable o,- Buildable p, Buildable r, Buildable s)- => Params (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s) where- buildParams (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s) =- [build a, build b, build c, build d, build e,- build f, build g, build h, build i, build j,- build k, build l, build m, build n, build o,- build p, build r, build s]--instance (Buildable a, Buildable b, Buildable c, Buildable d, Buildable e,- Buildable f, Buildable g, Buildable h, Buildable i, Buildable j,- Buildable k, Buildable l, Buildable m, Buildable n, Buildable o,- Buildable p, Buildable r, Buildable s, Buildable t)- => Params (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t) where- buildParams (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t) =- [build a, build b, build c, build d, build e,- build f, build g, build h, build i, build j,- build k, build l, build m, build n, build o,- build p, build r, build s, build t]--instance (Buildable a, Buildable b, Buildable c, Buildable d, Buildable e,- Buildable f, Buildable g, Buildable h, Buildable i, Buildable j,- Buildable k, Buildable l, Buildable m, Buildable n, Buildable o,- Buildable p, Buildable r, Buildable s, Buildable t, Buildable u)- => Params (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t,u) where- buildParams (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t,u) =- [build a, build b, build c, build d, build e,- build f, build g, build h, build i, build j,- build k, build l, build m, build n, build o,- build p, build r, build s, build t, build u]--#endif
+ INSTALL view
@@ -0,0 +1,32 @@+Please use either `cabal install` or `runhaskell Setup configure --user`+to install or configure the package. This is because `runhaskell Setup`+defaults to use global package database, and thus may give spurious error+messages, when the dependencies are installed in user's package database.++For a fresh GHC install on Ubuntu, you may first need to `apt-get install+zlib1g-dev` to get zlib header files.++Troubleshooting:+1. `runhaskell Setup configure` tells that dependencies are missing,+even though I have them installed!++Use `runhaskell Setup configure --user` or see Cabal FAQ:+http://www.haskell.org/cabal/FAQ.html#runghc-setup-complains-of-missing-packages++2. double-conversion dependency breaks the linking process with error:++This is known GHC bug that may appear in FreeBSD and Windows:+http://ghc.haskell.org/trac/ghc/ticket/5289++Workaround is to switch off the flag that makes printing faster:+Append `-f-have-double-conversion` to `cabal install` or `runhaskell Setup+configure` arguments.++3. [Windows] Cannot get `unix` dependency.++Please switch off using bytestring-mmap package by appending flag+`-f-have-mmap` to `cabal install` or `runhaskell Setup configure` arguments.++TODO: try to change *.cabal file so it is done automatically.++4.
+ README.md view
@@ -0,0 +1,13 @@+hPDB+====+Haskell PDB file format parser.++[](https://www.travis-ci.org/mgajda/hPDB)++Protein Data Bank file format is a most popular format for holding biomolecule data.++This is a very fast parser: below 7s for the largest entry in PDB - 1HTQ which is over 70MB - as compared with 11s of RASMOL 2.7.5, or 2m15s of BioPython with Python 2.6 interpreter.++It is aimed to not only deliver event-based interface, but also a high-level data structure for manipulating data in spirit of BioPython's PDB parser. ++Details on official releases are on [Hackage](http://hackage.haskell.org/package/hPDB).
Setup.hs view
@@ -1,4 +1,18 @@ #! /usr/bin/env runhaskell +module Main(main) where+ import Distribution.Simple-main = defaultMain+import System.Environment+import Control.Monad(when)+import Data.List(isPrefixOf)++-- Defaults to installing in --user package database.+isPkgDbOpts arg = ("--package-db" `isPrefixOf` arg ) || (arg `elem` ["--user", "--global"])+haveNotPkgDbOpts = not . any isPkgDbOpts++main = do args <- getArgs+ defaultMainArgs $ if (length args > 0 && (head args `elem` ["configure", "install"]) && haveNotPkgDbOpts args)+ then (head args:"--user":tail args)+ else args+
hPDB.cabal view
@@ -1,40 +1,46 @@ name: hPDB-version: 0.99-stability: beta+version: 0.999+synopsis: Protein Databank file format library homepage: https://github.com/mgajda/hpdb+stability: beta package-url: http://hackage.haskell.org/package/hPDB-synopsis: Parser, print and manipulate structures in PDB file format. description: Protein Data Bank file format is a most popular format for holding biomolecule data.-- This is a very fast parser (below 7s for the largest entry in PDB - 1HTQ which is over 70MB - as compared with 11s of RASMOL 2.7.5, or 2m15s of BioPython with Python 2.6 interpreter.)-- It is aimed to not only deliver event-based interface, but also a high-level data structure for manipulating data in spirit of BioPython's PDB parser. -+ .+ This is a very fast parser: below 7s for the largest entry in PDB - 1HTQ which is over 70MB - as compared with 11s of RASMOL 2.7.5, or 2m15s of BioPython with Python 2.6 interpreter.+ .+ It is aimed to not only deliver event-based interface, but also a high-level data structure for manipulating data in spirit of BioPython's PDB parser. category: Bioinformatics license: BSD3 license-file: LICENSE author: Michal J. Gajda-copyright: Copyright by Michal J. Gajda '2009-'2012+copyright: Copyright by Michal J. Gajda '2009-'2013 maintainer: mjgajda@googlemail.com bug-reports: mailto:mjgajda@googlemail.com build-type: Simple cabal-version: >=1.8-tested-with: GHC==7.4.1, GHC==7.0.3, GHC==7.4.2---Need to re-test: GHC==6.12.1, GHC==7.0.4, GHC==7.1.20101026 +tested-with: GHC==7.0.3, GHC==7.2.2, GHC==7.4.1, GHC==7.4.2, GHC==7.6.1, GHC==7.6.2+extra-source-files: README.md INSTALL AUTHORS +source-repository head+ type: git+ location: https://github.com/mgajda/hPDB+ flag have-mmap- description: Use bytestring-mmap to read input faster.+ description: Use mmap to read input faster. default: True flag have-sse2 description: Use -msse2 for faster code. default: True -flag old-text-format- description: Use text-format versions before 0.3.0.9 (and define Params instance for 11-tuple to 20-tuple yourself.)- Disable for (yet unreleased) versions after 0.3.0.8 when change was merged into upstream.+flag have-text-format+ description: Do not use text-format, since it may require double-conversion+ and thus linking of libstdc++ which may break compilation+ due to GHC bug #5289:+ .+ http://ghc.haskell.org/trac/ghc/ticket/5289 default: True flag old-bytestring@@ -58,17 +64,15 @@ Library ghc-options: -fspec-constr-count=4 -O3 - build-depends: base>=4.0, base <4.7, ghc-prim, directory, mtl, template-haskell, vector, AC-Vector, containers, deepseq, QuickCheck >= 2.5.0.0, text>=0.11.1.13+ build-depends: base>=4.0, base <4.7, ghc-prim, directory, mtl, template-haskell, vector, AC-Vector, containers, deepseq, QuickCheck >= 2.5.0.0, text>=0.11.1.13, iterable >= 1.0 if flag(have-mmap)- build-depends: bytestring-mmap+ build-depends: mmap cpp-options: -DHAVE_MMAP- if flag(have-sse2)- ghc-options: -fspec-constr-count=4 -O3 - if flag(old-text-format)- cpp-options: -DDEFINE_PARAMS_INSTANCES- build-depends: text-format <= 0.3.0.8- else- build-depends: text-format >= 0.3.0.9+ -- These optimization options change a lot for GHC >= 7.4.1+ ghc-options: -fspec-constr-count=4 -O3 + if flag(have-text-format)+ cpp-options: -DHAVE_TEXT_FORMAT+ build-depends: text-format >= 0.3.1.0 if flag(old-bytestring) cpp-options: -DDEFINE_NFDATA_INSTANCE build-depends: bytestring <= 0.9.2.1@@ -84,8 +88,8 @@ build-depends: zlib <= 0.5.3.3 else build-depends: zlib >= 0.5.4.0- other-extensions: ScopedTypeVariables OverloadedStrings BangPatterns NoMonomorphismRestriction EmptyDataDecls MagicHash- other-modules: Bio.PDB.EventParser.ParseATOM, Bio.PDB.EventParser.ParseCAVEAT, Bio.PDB.EventParser.ParseCISPEP, Bio.PDB.EventParser.ParseCONECT, Bio.PDB.EventParser.ParseCRYST1, Bio.PDB.EventParser.ParseDBREF, Bio.PDB.EventParser.ParseFORMUL, Bio.PDB.EventParser.ParseHEADER, Bio.PDB.EventParser.ParseHELIX, Bio.PDB.EventParser.ParseHET, Bio.PDB.EventParser.ParseHETNAM, Bio.PDB.EventParser.ParseHYDBND, Bio.PDB.EventParser.ParseIntRecord, Bio.PDB.EventParser.ParseJRNL, Bio.PDB.EventParser.ParseLINK, Bio.PDB.EventParser.ParseListRecord, Bio.PDB.EventParser.ParseMASTER, Bio.PDB.EventParser.ParseMatrixRecord, Bio.PDB.EventParser.ParseMODRES, Bio.PDB.EventParser.ParseObsoleting, Bio.PDB.EventParser.ParseREMARK, Bio.PDB.EventParser.ParseREVDAT, Bio.PDB.EventParser.ParseSEQADV, Bio.PDB.EventParser.ParseSEQRES, Bio.PDB.EventParser.ParseSHEET, Bio.PDB.EventParser.ParseSITE, Bio.PDB.EventParser.ParseSLTBRG, Bio.PDB.EventParser.ParseSpecListRecord, Bio.PDB.EventParser.ParseSPLIT, Bio.PDB.EventParser.ParseSSBOND, Bio.PDB.EventParser.ParseTER, Bio.PDB.EventParser.ParseTITLE, Bio.PDB.EventParser.ParseTVECT, Bio.PDB.EventParser.PDBParsingAbstractions, Bio.PDB.EventParser.FastParse, Bio.PDB.Util.MissingInstances, Bio.PDB.Common, Bio.PDB.InstantiateIterable, Bio.PDB.Iterable.Utils+ other-extensions: ScopedTypeVariables OverloadedStrings BangPatterns NoMonomorphismRestriction EmptyDataDecls MagicHash CPP PatternGuards NamedFieldPuns DisambiguateRecordFields TemplateHaskell MultiParamTypeClasses FlexibleInstances FlexibleContexts+ other-modules: Bio.PDB.EventParser.ParseATOM, Bio.PDB.EventParser.ParseCAVEAT, Bio.PDB.EventParser.ParseCISPEP, Bio.PDB.EventParser.ParseCONECT, Bio.PDB.EventParser.ParseCRYST1, Bio.PDB.EventParser.ParseDBREF, Bio.PDB.EventParser.ParseFORMUL, Bio.PDB.EventParser.ParseHEADER, Bio.PDB.EventParser.ParseHELIX, Bio.PDB.EventParser.ParseHET, Bio.PDB.EventParser.ParseHETNAM, Bio.PDB.EventParser.ParseHYDBND, Bio.PDB.EventParser.ParseIntRecord, Bio.PDB.EventParser.ParseJRNL, Bio.PDB.EventParser.ParseLINK, Bio.PDB.EventParser.ParseListRecord, Bio.PDB.EventParser.ParseMASTER, Bio.PDB.EventParser.ParseMatrixRecord, Bio.PDB.EventParser.ParseMODRES, Bio.PDB.EventParser.ParseObsoleting, Bio.PDB.EventParser.ParseREMARK, Bio.PDB.EventParser.ParseREVDAT, Bio.PDB.EventParser.ParseSEQADV, Bio.PDB.EventParser.ParseSEQRES, Bio.PDB.EventParser.ParseSHEET, Bio.PDB.EventParser.ParseSITE, Bio.PDB.EventParser.ParseSLTBRG, Bio.PDB.EventParser.ParseSpecListRecord, Bio.PDB.EventParser.ParseSPLIT, Bio.PDB.EventParser.ParseSSBOND, Bio.PDB.EventParser.ParseTER, Bio.PDB.EventParser.ParseTITLE, Bio.PDB.EventParser.ParseTVECT, Bio.PDB.EventParser.PDBParsingAbstractions, Bio.PDB.EventParser.FastParse, Bio.PDB.Util.MissingInstances, Bio.PDB.Common, Bio.PDB.Iterable.Utils exposed-modules: Bio.PDB.EventParser.PDBEvents, Bio.PDB.EventParser.PDBEventParser, Bio.PDB.EventParser.ExperimentalMethods, Bio.PDB.EventParser.HelixTypes, Bio.PDB.EventParser.StrandSense, Bio.PDB.Structure, Bio.PDB.StructureBuilder, Bio.PDB.Iterable, Bio.PDB.IO, Bio.PDB.Fasta, Bio.PDB, Bio.PDB.Structure.Vector, Bio.PDB.Structure.Elements, Bio.PDB.Structure.List, Bio.PDB.StructurePrinter, Bio.PDB.EventParser.PDBEventPrinter, Bio.PDB.IO.OpenAnyFile exposed: True