hPDB-0.99: Bio/PDB/EventParser/ParseTVECT.hs
{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}
-- | Parses TVECT records.
module Bio.PDB.EventParser.ParseTVECT(parseTVECT)
where
import Prelude hiding(String)
import qualified Data.ByteString.Char8 as BS
import Bio.PDB.EventParser.PDBEvents
import Bio.PDB.EventParser.PDBParsingAbstractions
--------------- {{{ TVECT records
{--
As described on:
http://deposit.rcsb.org/adit/docs/pdb_atom_format.html#TVECT
[This record is not in official PDB file format description v3.20!]
COLUMNS DATA TYPE CONTENTS
--------------------------------------------------------------------------------
1 - 6 Record name "TVECT "
8 - 10 Integer Serial number
11 - 20 Real(10.5) t[1]
21 - 30 Real(10.5) t[2]
31 - 40 Real(10.5) t[3]
41 - 70 String Text comment
--}
titleFields = [( 6, mKeyword "record header" "TVECT "),
( 7, mSpc 1 ),
(10, dInt "serial number" 0 ),
(20, mDouble "t[n][1]" ),
(30, mDouble "t[n][2]" ),
(40, mDouble "t[n][3]" ),
(70, pStr "comment" )]
-- | Parses a TVECT record.
--
-- Arguments:
--
-- (1) input line
--
-- (2) input line number
--
-- 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 == []
then [result]
else errs
where
-- parse
(fields, errs) = parseFields titleFields line line_no
[fRec, _, fSerial, ft1, ft2, ft3, fComment] = fields
-- unpack fields
IFInt serial = fSerial
IFDouble t1 = ft1
IFDouble t2 = ft2
IFDouble t3 = ft3
result = TVECT serial $ Vector3 t1 t2 t3
-- NOTE: consecutive "TVECT" records should be merged into a single multiline entry with SUCH method
--mergeTVECTRecords :: [PDBEvent] -> m [PDBEvent]
--------------- }}} TVECT records