cobot-io 0.1.2.5 → 0.1.2.6
raw patch · 3 files changed
+20/−16 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- ChangeLog.md +4/−0
- cobot-io.cabal +2/−2
- src/Bio/MAE.hs +14/−14
ChangeLog.md view
@@ -2,6 +2,10 @@ ## [Unreleased] +## [0.1.2.6] - 2019-12-12+### Fixed+- Fixes for instance of `StructureModels` for `Mae` when working with structures without explicit chain names.+ ## [0.1.2.5] - 2019-12-24 ### Fixed - Possibility to have spaces in Fasta sequences.
cobot-io.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 0e861a80d499c39e6ac8b1c1cb2b2fbcb63c09cd506f31744cbba112b69d71c5+-- hash: 0f03c19b37ba0793d464c62245414745d11715571fb56535d09dedf96fc5f683 name: cobot-io-version: 0.1.2.5+version: 0.1.2.6 synopsis: Biological data file formats and IO description: Please see the README on GitHub at <https://github.com/less-wrong/cobot-io#readme> category: Bio
src/Bio/MAE.hs view
@@ -18,13 +18,14 @@ Model (..), Residue (..), SecondaryStructure (..), StructureModels (..))+import Control.Monad (join) import Control.Monad.IO.Class (MonadIO, liftIO) import Data.Attoparsec.Text (parseOnly) import Data.Bifunctor (bimap, first) import Data.Function (on) import qualified Data.List as L (find, groupBy, sortOn) import Data.Map.Strict (Map)-import qualified Data.Map.Strict as M (fromList, lookup, member, (!))+import qualified Data.Map.Strict as M (fromList, lookup, (!)) import Data.Maybe (catMaybes, fromJust) import Data.Text (Text) import qualified Data.Text as T (head, init, last, null, pack,@@ -51,7 +52,7 @@ unsafeGetFromContentsMap m name i = unsafeFromMaeValue $ (m M.! name) !! i getFromContentsMap :: FromMaeValue a => Map Text [MaeValue] -> Text -> Int -> Maybe a- getFromContentsMap m name i = fromMaeValue $ (m M.! name) !! i+ getFromContentsMap m name i = join $ fromMaeValue . (!! i) <$> name `M.lookup` m blockToModel :: Block -> Model blockToModel Block{..} = Model (atomsTableToChains atomsTable) bonds@@ -94,19 +95,19 @@ atomsTableToChains :: Map Text [MaeValue] -> Vector Chain atomsTableToChains m = V.fromList $ fmap groupToChain groupedByChains where- groupedByChains = toGroupsOn (unsafeGetFromContents @Text "s_m_chain_name") [0 .. numberOfAtoms - 1]+ groupedByChains = toGroupsOn (getFromContents defaultChainName "s_m_chain_name") [0 .. numberOfAtoms - 1] + getFromContents :: FromMaeValue a => a -> Text -> Int -> a+ getFromContents def name ind = maybe def id $ getFromContentsMap m name ind+ unsafeGetFromContents :: FromMaeValue a => Text -> Int -> a unsafeGetFromContents = unsafeGetFromContentsMap m - getFromContents :: FromMaeValue a => Text -> Int -> Maybe a- getFromContents = getFromContentsMap m- groupToChain :: [Int] -> Chain groupToChain [] = error "Group that is result of List.groupBy can't be empty." groupToChain group@(h : _) = Chain name residues where- name = stripQuotes $ unsafeGetFromContents "s_m_chain_name" h+ name = stripQuotes $ getFromContents defaultChainName "s_m_chain_name" h groupedByResidues = toGroupsOn by group residues = V.fromList $ fmap groupToResidue groupedByResidues@@ -114,6 +115,9 @@ by :: Int -> (Int, Text) by i = (unsafeGetFromContents "i_m_residue_number" i, unsafeGetFromContents "s_m_pdb_residue_name" i) + defaultChainName :: Text+ defaultChainName = "A"+ groupToResidue :: [Int] -> Residue groupToResidue [] = error "Group that is result of List.groupBy can't be empty." groupToResidue group@(h : _) = Residue name atoms (V.fromList localBonds) secondary chemCompType@@ -140,16 +144,12 @@ (stripQuotes $ getFromContentsI "s_m_pdb_atom_name") (elIndToElement M.! getFromContentsI "i_m_atomic_number") coords- (getFromContentsIWithDef 0 "i_m_formal_charge")- (getFromContentsIWithDef 0 "r_m_pdb_tfactor")- (getFromContentsIWithDef 0 "r_m_pdb_occupancy")+ (getFromContents 0 "i_m_formal_charge" i)+ (getFromContents 0 "r_m_pdb_tfactor" i)+ (getFromContents 0 "r_m_pdb_occupancy" i) where getFromContentsI :: FromMaeValue a => Text -> a getFromContentsI = flip unsafeGetFromContents i-- getFromContentsIWithDef :: FromMaeValue a => a -> Text -> a- getFromContentsIWithDef def n | n `M.member` m = maybe def id $ getFromContents n i- | otherwise = def coords :: V3 Float coords = V3 (getFromContentsI "r_m_x_coord")