hPDB-0.99: Bio/PDB/EventParser/ParseSEQADV.hs
{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}
-- | Parsing a SEQADV record.
module Bio.PDB.EventParser.ParseSEQADV(parseSEQADV)
where
import qualified Data.ByteString.Char8 as BS
import Bio.PDB.EventParser.PDBEvents
import Bio.PDB.EventParser.PDBParsingAbstractions
--------------- {{{ SEQADV records
{--
COLUMNS DATA TYPE FIELD DEFINITION
-----------------------------------------------------------------
1 - 6 Record name "SEQADV"
8 - 11 IDcode idCode ID code of this entry.
13 - 15 Residue name resName Name of the PDB residue in conflict.
17 Character chainID PDB chain identifier.
19 - 22 Integer seqNum PDB sequence number.
23 AChar iCode PDB insertion code.
25 - 28 LString database
30 - 38 LString dbIdCode Sequence database accession number.
40 - 42 Residue name dbRes Sequence database residue name.
44 - 48 Integer dbSeq Sequence database sequence number.
50 - 70 LString conflict Conflict comment.
--}
titleFields = [(6, mKeyword "record header" "SEQADV" ),
(7, mSpc 1),
(11, mStr "PDB id" ),
(12, mSpc 1),
(15, mStr "residue name" ),
(16, mSpc 1),
(17, mChr "chain id" ),
(18, mSpc 1),
(22, dInt "sequence number" (-1)),
(23, mChr "insertion code" ),
(24, mSpc 1),
(28, mStr "database" ),
(29, mSpc 1),
(38, mStr "sequence database accession code" ),
(39, mSpc 1),
(42, mStr "sequence database residue name" ),
(43, mSpc 1),
(48, dInt "sequence database sequence number" (-1)),
(49, mSpc 1),
(70, mStr "conflict comment" )]
{-# SPECIALIZE parseSEQADV :: BS.ByteString -> Int -> IO [PDBEvent] #-}
-- | Parses a SEQADV record:
--
-- Arguments:
--
-- (1) input line
--
-- (2) input line number
--
-- 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 == []
then [result]
else errs
where
-- parse
(fields, fErrs) = parseFields titleFields line line_no
[fRec, _, fPdbid, _, fResname, _, fChain, _, fSeqNum, fInsCode, _, fDb,
_, fAccCode, _, fDbResname, _, fDbSeqNum, _, fComment] = fields
-- unpack fields
IFStr pdbid = fPdbid
IFStr db = fDb
IFStr acccode = fAccCode
IFStr dbresname = fDbResname
mDbseqnum = case fSeqNum of
IFInt seqnum -> Just seqnum
IFNone -> Nothing
IFStr comment = fComment
errs = if fErrs == [] then fgErrs else fErrs
fgRes = maybeFgResidue False "modified residue" 15 fResname fChain fSeqNum fInsCode
fgErrs = liftFgErrs line_no [fgRes]
Right res = fgRes
result = SEQADV pdbid res
db acccode dbresname mDbseqnum
comment
--------------- }}} SEQADV records