module Bio.PDB.EventParser.ParseCISPEP(parseCISPEP)
where
import Prelude hiding(String)
import qualified Data.ByteString.Char8 as BS
import Bio.PDB.EventParser.PDBEvents
import Bio.PDB.EventParser.PDBParsingAbstractions
cispepFields = [(6, mKeyword "record header" "CISPEP" ),
(7, mSpc 1 ),
(10, mInt "record serial number" ),
(11, mSpc 1 ),
(14, mStr "residue name in first peptide" ),
(15, mSpc 1 ),
(16, mChr "chain id" ),
(17, mSpc 1 ),
(21, mInt "residue sequence number" ),
(22, mChr "insertion code" ),
(25, mSpc 3 ),
(28, mStr "residue name in second peptide" ),
(29, mSpc 1 ),
(30, mChr "chain id" ),
(31, mSpc 1 ),
(35, mInt "residue sequence number" ),
(36, mChr "insertion code" ),
(43, pSpc ),
(46, dInt "model identifier" 1 ),
(53, pSpc ),
(59, pDouble "angle measurement" )]
parseCISPEP :: (Monad m) => String -> Int -> m [PDBEvent]
parseCISPEP line line_no = return $ if null errs
then [result]
else errs
where
errs = fErrs ++ fgErrs
(fields, fErrs) = parseFields cispepFields line line_no
[fRec, _, fSerial, _,
fResname1, _, fChain1, _, fResnum1, fInsCode1, _,
fResname2, _, fChain2, _, fResnum2, fInsCode2, _,
fModNum, _, fAngle] = fields
IFInt serial = fSerial
IFInt modnum = fModNum
angle = case fAngle of
IFDouble !f -> Just f
IFNone -> Nothing
fgRes1 = fgResidue False "residue 1" 14 fResname1 fChain1 fResnum1 fInsCode1
fgRes2 = fgResidue False "residue 2" 28 fResname2 fChain2 fResnum2 fInsCode2
fgErrs = liftFgErrs line_no [fgRes1, fgRes2]
[res1, res2] = rights [fgRes1, fgRes2]
result = CISPEP serial res1 res2 modnum angle