module Bio.PDB.EventParser.ParseHELIX(parseHELIX)
where
import Prelude hiding(String)
import qualified Data.ByteString.Char8 as BS
import Bio.PDB.EventParser.HelixTypes
import Bio.PDB.EventParser.PDBEvents
import Bio.PDB.EventParser.PDBParsingAbstractions
helixFields = [(6, mKeyword "record header" "HELIX " ),
(7, mSpc 1 ),
(10, mInt "serial number" ),
(11, mSpc 1 ),
(14, mStr "helix id" ),
(15, mSpc 1 ),
(18, mStr "initial residue name" ),
(19, mSpc 1 ),
(20, mChr "initial chain id" ),
(21, mSpc 1 ),
(25, mInt "initial residue serial number"),
(26, mChr "initial insertion code" ),
(27, mSpc 1 ),
(30, mStr "end residue name" ),
(31, mSpc 1 ),
(32, mChr "end chain id" ),
(33, mSpc 1 ),
(37, mInt "end residue serial number" ),
(38, mChr "end residue insertion code" ),
(40, mInt "helix class" ),
(70, mStr "comment" ),
(72, mSpc 2 ),
(76, mInt "length" )]
parseHELIX :: (Monad m) => String -> Int -> m [PDBEvent]
parseHELIX line line_no =
return $ if null errs
then [result]
else errs
where
(fields, fErrs) = parseFields helixFields line line_no
[fRec, _, fSerial, _, fHelixId, _,
fIniResName, _, fIniChain, _, fIniResId, fIniResIns, _,
fEndResName, _, fEndChain, _, fEndResId, fEndResIns,
fHelixClass, fComment, _, fLength] = fields
IFInt serial = fSerial
IFStr helixId = fHelixId
IFStr iniResName = fIniResName
IFChar iniChain = fIniChain
IFInt iniResId = fIniResId
IFChar iniResIns = fIniResIns
fgIniRes = fgResidue False "initial" line_no fIniResName fIniChain fIniResId fIniResIns
Right iniRes = fgIniRes
IFStr endResName = fEndResName
IFChar endChain = fEndChain
IFInt endResId = fEndResId
IFChar endResIns = fEndResIns
fgEndRes = fgResidue False "ending" line_no fEndResName fEndChain fEndResId fEndResIns
Right endRes = fgEndRes
errs = fErrs ++ liftFgErrs line_no [fgEndRes, fgIniRes]
IFInt helixClass = fHelixClass
IFStr comment = fComment
IFInt len = fLength
result = HELIX serial iniRes
endRes
(code2helix helixClass) comment len