Taxonomy 1.0.3 → 2.0.0
raw patch · 10 files changed
+1048/−952 lines, 10 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Bio.Taxonomy: compareSubTrees :: [Gr SimpleTaxon Double] -> (Int, Gr CompareTaxon Double)
- Bio.Taxonomy: drawTaxonomy :: Bool -> Gr SimpleTaxon Double -> String
- Bio.Taxonomy: drawTaxonomyComparison :: Bool -> (Int, Gr CompareTaxon Double) -> String
- Bio.Taxonomy: extractTaxonomySubTreebyLevel :: [Node] -> Gr SimpleTaxon Double -> Maybe Int -> Gr SimpleTaxon Double
- Bio.Taxonomy: extractTaxonomySubTreebyLevelNew :: [Node] -> Gr SimpleTaxon Double -> Maybe Int -> Gr SimpleTaxon Double
- Bio.Taxonomy: extractTaxonomySubTreebyRank :: [Node] -> Gr SimpleTaxon Double -> Maybe Rank -> Gr SimpleTaxon Double
- Bio.Taxonomy: getParentbyRank :: Node -> Gr SimpleTaxon Double -> Maybe Rank -> Maybe (Node, SimpleTaxon)
- Bio.Taxonomy: parseNCBISimpleTaxons :: String -> Either ParseError SimpleTaxon
- Bio.Taxonomy: parseNCBITaxCitations :: String -> Either ParseError [TaxCitation]
- Bio.Taxonomy: parseNCBITaxDelNodes :: String -> Either ParseError [TaxDelNode]
- Bio.Taxonomy: parseNCBITaxDivisions :: String -> Either ParseError [TaxDivision]
- Bio.Taxonomy: parseNCBITaxGenCodes :: String -> Either ParseError [TaxGenCode]
- Bio.Taxonomy: parseNCBITaxMergedNodes :: String -> Either ParseError [TaxMergedNode]
- Bio.Taxonomy: parseNCBITaxNames :: String -> Either ParseError [TaxName]
- Bio.Taxonomy: parseNCBITaxNodes :: String -> Either ParseError TaxNode
- Bio.Taxonomy: parseTaxonomy :: String -> Either ParseError (Gr SimpleTaxon Double)
- Bio.Taxonomy: readNCBISimpleTaxons :: String -> IO (Either ParseError [SimpleTaxon])
- Bio.Taxonomy: readNCBITaxCitations :: String -> IO (Either ParseError [TaxCitation])
- Bio.Taxonomy: readNCBITaxDelNodes :: String -> IO (Either ParseError [TaxDelNode])
- Bio.Taxonomy: readNCBITaxDivisions :: String -> IO (Either ParseError [TaxDivision])
- Bio.Taxonomy: readNCBITaxGenCodes :: String -> IO (Either ParseError [TaxGenCode])
- Bio.Taxonomy: readNCBITaxMergedNodes :: String -> IO (Either ParseError [TaxMergedNode])
- Bio.Taxonomy: readNCBITaxNames :: String -> IO (Either ParseError [TaxName])
- Bio.Taxonomy: readNCBITaxNodes :: String -> IO (Either ParseError [TaxNode])
- Bio.Taxonomy: readNCBITaxonomyDatabase :: String -> IO (Either [String] NCBITaxDump)
- Bio.Taxonomy: readNamedTaxonomy :: String -> IO (Either ParseError (Gr SimpleTaxon Double))
- Bio.Taxonomy: readTaxonomy :: String -> IO (Either ParseError (Gr SimpleTaxon Double))
- Bio.Taxonomy: safeNodePath :: Maybe Node -> Gr SimpleTaxon Double -> Maybe Node -> Either String Path
- Bio.Taxonomy: writeDotTree :: String -> Bool -> Gr SimpleTaxon Double -> IO ()
- Bio.Taxonomy: writeJsonTree :: String -> Gr SimpleTaxon Double -> IO ()
- Bio.Taxonomy: writeTree :: String -> String -> Bool -> Gr SimpleTaxon Double -> IO ()
- Bio.TaxonomyData: Class :: Rank
- Bio.TaxonomyData: Cohort :: Rank
- Bio.TaxonomyData: CompareTaxon :: Text -> Rank -> [Int] -> CompareTaxon
- Bio.TaxonomyData: Domain :: Rank
- Bio.TaxonomyData: Family :: Rank
- Bio.TaxonomyData: Form :: Rank
- Bio.TaxonomyData: Gene2Accession :: Int -> Int -> String -> String -> String -> String -> String -> String -> String -> String -> String -> String -> String -> String -> String -> Gene2Accession
- Bio.TaxonomyData: Genus :: Rank
- Bio.TaxonomyData: Infraclass :: Rank
- Bio.TaxonomyData: Infrakingdom :: Rank
- Bio.TaxonomyData: Infraorder :: Rank
- Bio.TaxonomyData: Infraphylum :: Rank
- Bio.TaxonomyData: Infraspecies :: Rank
- Bio.TaxonomyData: Kingdom :: Rank
- Bio.TaxonomyData: Legion :: Rank
- Bio.TaxonomyData: LineageTaxon :: Int -> String -> Rank -> LineageTaxon
- Bio.TaxonomyData: Magnorder :: Rank
- Bio.TaxonomyData: Microphylum :: Rank
- Bio.TaxonomyData: NCBITaxDump :: [TaxCitation] -> [TaxDelNode] -> [TaxDivision] -> [TaxGenCode] -> [TaxMergedNode] -> [TaxName] -> [TaxNode] -> NCBITaxDump
- Bio.TaxonomyData: Norank :: Rank
- Bio.TaxonomyData: Order :: Rank
- Bio.TaxonomyData: Parvclass :: Rank
- Bio.TaxonomyData: Parvorder :: Rank
- Bio.TaxonomyData: Phylum :: Rank
- Bio.TaxonomyData: Section :: Rank
- Bio.TaxonomyData: Series :: Rank
- Bio.TaxonomyData: SimpleGene2Accession :: Int -> String -> SimpleGene2Accession
- Bio.TaxonomyData: SimpleTaxon :: Int -> Text -> Int -> Rank -> SimpleTaxon
- Bio.TaxonomyData: Species :: Rank
- Bio.TaxonomyData: Speciesgroup :: Rank
- Bio.TaxonomyData: Speciessubgroup :: Rank
- Bio.TaxonomyData: Subclass :: Rank
- Bio.TaxonomyData: Subfamily :: Rank
- Bio.TaxonomyData: Subgenus :: Rank
- Bio.TaxonomyData: Subkingdom :: Rank
- Bio.TaxonomyData: Suborder :: Rank
- Bio.TaxonomyData: Subphylum :: Rank
- Bio.TaxonomyData: Subspecies :: Rank
- Bio.TaxonomyData: Subtribe :: Rank
- Bio.TaxonomyData: Superclass :: Rank
- Bio.TaxonomyData: Superfamily :: Rank
- Bio.TaxonomyData: Superkingdom :: Rank
- Bio.TaxonomyData: Superorder :: Rank
- Bio.TaxonomyData: Superphylum :: Rank
- Bio.TaxonomyData: Superspecies :: Rank
- Bio.TaxonomyData: Supertribe :: Rank
- Bio.TaxonomyData: TaxCitation :: Int -> Maybe String -> Maybe Int -> Maybe Int -> Maybe String -> Maybe String -> Maybe [Int] -> TaxCitation
- Bio.TaxonomyData: TaxDelNode :: Int -> TaxDelNode
- Bio.TaxonomyData: TaxDivision :: Int -> String -> String -> Maybe String -> TaxDivision
- Bio.TaxonomyData: TaxGenCode :: Int -> Maybe String -> String -> String -> String -> TaxGenCode
- Bio.TaxonomyData: TaxMergedNode :: Int -> Int -> TaxMergedNode
- Bio.TaxonomyData: TaxName :: Int -> Text -> Text -> Text -> TaxName
- Bio.TaxonomyData: TaxNode :: Int -> Int -> Rank -> Maybe String -> String -> Bool -> String -> Bool -> String -> Bool -> Bool -> Bool -> Maybe String -> TaxNode
- Bio.TaxonomyData: Taxon :: Int -> String -> Int -> Rank -> String -> TaxGenCode -> TaxGenCode -> String -> [LineageTaxon] -> String -> String -> String -> Taxon
- Bio.TaxonomyData: TaxonName :: String -> String -> TaxonName
- Bio.TaxonomyData: Tribe :: Rank
- Bio.TaxonomyData: Variety :: Rank
- Bio.TaxonomyData: [abbreviation] :: TaxGenCode -> Maybe String
- Bio.TaxonomyData: [assembly] :: Gene2Accession -> String
- Bio.TaxonomyData: [cde] :: TaxGenCode -> String
- Bio.TaxonomyData: [citId] :: TaxCitation -> Int
- Bio.TaxonomyData: [citKey] :: TaxCitation -> Maybe String
- Bio.TaxonomyData: [classCDE] :: TaxonName -> String
- Bio.TaxonomyData: [compareRank] :: CompareTaxon -> Rank
- Bio.TaxonomyData: [compareScientificName] :: CompareTaxon -> Text
- Bio.TaxonomyData: [createDate] :: Taxon -> String
- Bio.TaxonomyData: [delTaxId] :: TaxDelNode -> Int
- Bio.TaxonomyData: [dispName] :: TaxonName -> String
- Bio.TaxonomyData: [divisionCDE] :: TaxDivision -> String
- Bio.TaxonomyData: [divisionComments] :: TaxDivision -> Maybe String
- Bio.TaxonomyData: [divisionId] :: TaxDivision -> Int
- Bio.TaxonomyData: [division] :: Taxon -> String
- Bio.TaxonomyData: [divisonName] :: TaxDivision -> String
- Bio.TaxonomyData: [emblCode] :: TaxNode -> Maybe String
- Bio.TaxonomyData: [endPositionOnTheGenomicAccession] :: Gene2Accession -> String
- Bio.TaxonomyData: [genBankHiddenFlag] :: TaxNode -> Bool
- Bio.TaxonomyData: [geneCodeName] :: TaxGenCode -> String
- Bio.TaxonomyData: [geneID] :: Gene2Accession -> Int
- Bio.TaxonomyData: [geneticCodeId] :: TaxGenCode -> Int
- Bio.TaxonomyData: [geneticCode] :: Taxon -> TaxGenCode
- Bio.TaxonomyData: [genomicNucleotideAccessionVersion] :: Gene2Accession -> String
- Bio.TaxonomyData: [genomicNucleotideGi] :: Gene2Accession -> String
- Bio.TaxonomyData: [hiddenSubtreeRootFlag] :: TaxNode -> Bool
- Bio.TaxonomyData: [inTree] :: CompareTaxon -> [Int]
- Bio.TaxonomyData: [inheritedDivFlag] :: TaxNode -> Bool
- Bio.TaxonomyData: [inheritedGCFlag] :: TaxNode -> Bool
- Bio.TaxonomyData: [inheritedMGCFlag] :: TaxNode -> Bool
- Bio.TaxonomyData: [lineageEx] :: Taxon -> [LineageTaxon]
- Bio.TaxonomyData: [lineageRank] :: LineageTaxon -> Rank
- Bio.TaxonomyData: [lineageScienticName] :: LineageTaxon -> String
- Bio.TaxonomyData: [lineageTaxId] :: LineageTaxon -> Int
- Bio.TaxonomyData: [lineage] :: Taxon -> String
- Bio.TaxonomyData: [maturePeptideAccessionVersion] :: Gene2Accession -> String
- Bio.TaxonomyData: [maturePeptideGi] :: Gene2Accession -> String
- Bio.TaxonomyData: [medlineId] :: TaxCitation -> Maybe Int
- Bio.TaxonomyData: [mitoGeneticCode] :: Taxon -> TaxGenCode
- Bio.TaxonomyData: [mitochondrialGeneticCodeId] :: TaxNode -> String
- Bio.TaxonomyData: [nameClass] :: TaxName -> Text
- Bio.TaxonomyData: [nameTaxId] :: TaxName -> Int
- Bio.TaxonomyData: [nameTxt] :: TaxName -> Text
- Bio.TaxonomyData: [newTaxId] :: TaxMergedNode -> Int
- Bio.TaxonomyData: [nodeComments] :: TaxNode -> Maybe String
- Bio.TaxonomyData: [nodeDivisionId] :: TaxNode -> String
- Bio.TaxonomyData: [nodeGeneticCodeId] :: TaxNode -> String
- Bio.TaxonomyData: [oldTaxId] :: TaxMergedNode -> Int
- Bio.TaxonomyData: [orientation] :: Gene2Accession -> String
- Bio.TaxonomyData: [parentTaxId] :: TaxNode -> Int
- Bio.TaxonomyData: [proteinAccessionVersion] :: Gene2Accession -> String
- Bio.TaxonomyData: [proteinGi] :: Gene2Accession -> String
- Bio.TaxonomyData: [pubDate] :: Taxon -> String
- Bio.TaxonomyData: [pubmedId] :: TaxCitation -> Maybe Int
- Bio.TaxonomyData: [rank] :: TaxNode -> Rank
- Bio.TaxonomyData: [rnaNucleotideAccessionVersion] :: Gene2Accession -> String
- Bio.TaxonomyData: [rnaNucleotideGi] :: Gene2Accession -> String
- Bio.TaxonomyData: [simpleGenomicNucleotideAccessionVersion] :: SimpleGene2Accession -> String
- Bio.TaxonomyData: [simpleParentTaxId] :: SimpleTaxon -> Int
- Bio.TaxonomyData: [simpleRank] :: SimpleTaxon -> Rank
- Bio.TaxonomyData: [simpleScientificName] :: SimpleTaxon -> Text
- Bio.TaxonomyData: [simpleTaxIdEntry] :: SimpleGene2Accession -> Int
- Bio.TaxonomyData: [simpleTaxId] :: SimpleTaxon -> Int
- Bio.TaxonomyData: [startPositionOnTheGenomicAccession] :: Gene2Accession -> String
- Bio.TaxonomyData: [starts] :: TaxGenCode -> String
- Bio.TaxonomyData: [status] :: Gene2Accession -> String
- Bio.TaxonomyData: [taxCitations] :: NCBITaxDump -> [TaxCitation]
- Bio.TaxonomyData: [taxDelNodes] :: NCBITaxDump -> [TaxDelNode]
- Bio.TaxonomyData: [taxDivisions] :: NCBITaxDump -> [TaxDivision]
- Bio.TaxonomyData: [taxGenCodes] :: NCBITaxDump -> [TaxGenCode]
- Bio.TaxonomyData: [taxIdEntry] :: Gene2Accession -> Int
- Bio.TaxonomyData: [taxIdList] :: TaxCitation -> Maybe [Int]
- Bio.TaxonomyData: [taxId] :: TaxNode -> Int
- Bio.TaxonomyData: [taxMergedNodes] :: NCBITaxDump -> [TaxMergedNode]
- Bio.TaxonomyData: [taxNames] :: NCBITaxDump -> [TaxName]
- Bio.TaxonomyData: [taxNodes] :: NCBITaxDump -> [TaxNode]
- Bio.TaxonomyData: [taxonParentTaxId] :: Taxon -> Int
- Bio.TaxonomyData: [taxonRank] :: Taxon -> Rank
- Bio.TaxonomyData: [taxonScientificName] :: Taxon -> String
- Bio.TaxonomyData: [taxonTaxId] :: Taxon -> Int
- Bio.TaxonomyData: [text] :: TaxCitation -> Maybe String
- Bio.TaxonomyData: [uniqueName] :: TaxName -> Text
- Bio.TaxonomyData: [updateDate] :: Taxon -> String
- Bio.TaxonomyData: [url] :: TaxCitation -> Maybe String
- Bio.TaxonomyData: data CompareTaxon
- Bio.TaxonomyData: data Gene2Accession
- Bio.TaxonomyData: data LineageTaxon
- Bio.TaxonomyData: data NCBITaxDump
- Bio.TaxonomyData: data Rank
- Bio.TaxonomyData: data SimpleGene2Accession
- Bio.TaxonomyData: data SimpleTaxon
- Bio.TaxonomyData: data TaxCitation
- Bio.TaxonomyData: data TaxDelNode
- Bio.TaxonomyData: data TaxDivision
- Bio.TaxonomyData: data TaxGenCode
- Bio.TaxonomyData: data TaxMergedNode
- Bio.TaxonomyData: data TaxName
- Bio.TaxonomyData: data TaxNode
- Bio.TaxonomyData: data Taxon
- Bio.TaxonomyData: data TaxonName
- Bio.TaxonomyData: instance Data.Aeson.Types.ToJSON.ToJSON (Data.Graph.Inductive.Tree.Gr Bio.TaxonomyData.SimpleTaxon GHC.Types.Double)
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.CompareTaxon
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.Gene2Accession
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.LineageTaxon
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.NCBITaxDump
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.Rank
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.SimpleGene2Accession
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.SimpleTaxon
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.TaxCitation
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.TaxDelNode
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.TaxDivision
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.TaxGenCode
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.TaxMergedNode
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.TaxName
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.TaxNode
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.Taxon
- Bio.TaxonomyData: instance GHC.Classes.Eq Bio.TaxonomyData.TaxonName
- Bio.TaxonomyData: instance GHC.Classes.Ord Bio.TaxonomyData.Rank
- Bio.TaxonomyData: instance GHC.Enum.Bounded Bio.TaxonomyData.Rank
- Bio.TaxonomyData: instance GHC.Enum.Enum Bio.TaxonomyData.Rank
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.CompareTaxon
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.Gene2Accession
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.NCBITaxDump
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.Rank
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.SimpleGene2Accession
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.SimpleTaxon
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.TaxCitation
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.TaxDelNode
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.TaxDivision
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.TaxGenCode
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.TaxMergedNode
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.TaxName
- Bio.TaxonomyData: instance GHC.Read.Read Bio.TaxonomyData.TaxNode
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.CompareTaxon
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.Gene2Accession
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.LineageTaxon
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.NCBITaxDump
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.Rank
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.SimpleGene2Accession
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.SimpleTaxon
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.TaxCitation
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.TaxDelNode
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.TaxDivision
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.TaxGenCode
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.TaxMergedNode
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.TaxName
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.TaxNode
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.Taxon
- Bio.TaxonomyData: instance GHC.Show.Show Bio.TaxonomyData.TaxonName
- Bio.TaxonomyData: readsRank :: String -> [(Rank, String)]
- Bio.TaxonomyData: simpleTaxonJSONValue :: Gr SimpleTaxon Double -> Node -> Value
+ Biobase.Taxonomy.Import: parseNCBISimpleTaxons :: String -> Either ParseError SimpleTaxon
+ Biobase.Taxonomy.Import: parseNCBITaxCitations :: String -> Either ParseError [TaxCitation]
+ Biobase.Taxonomy.Import: parseNCBITaxDelNodes :: String -> Either ParseError [TaxDelNode]
+ Biobase.Taxonomy.Import: parseNCBITaxDivisions :: String -> Either ParseError [TaxDivision]
+ Biobase.Taxonomy.Import: parseNCBITaxGenCodes :: String -> Either ParseError [TaxGenCode]
+ Biobase.Taxonomy.Import: parseNCBITaxMergedNodes :: String -> Either ParseError [TaxMergedNode]
+ Biobase.Taxonomy.Import: parseNCBITaxNames :: String -> Either ParseError [TaxName]
+ Biobase.Taxonomy.Import: parseNCBITaxNodes :: String -> Either ParseError TaxNode
+ Biobase.Taxonomy.Import: parseTaxonomy :: String -> Either ParseError (Gr SimpleTaxon Double)
+ Biobase.Taxonomy.Import: readNCBISimpleTaxons :: String -> IO (Either ParseError [SimpleTaxon])
+ Biobase.Taxonomy.Import: readNCBITaxCitations :: String -> IO (Either ParseError [TaxCitation])
+ Biobase.Taxonomy.Import: readNCBITaxDelNodes :: String -> IO (Either ParseError [TaxDelNode])
+ Biobase.Taxonomy.Import: readNCBITaxDivisions :: String -> IO (Either ParseError [TaxDivision])
+ Biobase.Taxonomy.Import: readNCBITaxGenCodes :: String -> IO (Either ParseError [TaxGenCode])
+ Biobase.Taxonomy.Import: readNCBITaxMergedNodes :: String -> IO (Either ParseError [TaxMergedNode])
+ Biobase.Taxonomy.Import: readNCBITaxNames :: String -> IO (Either ParseError [TaxName])
+ Biobase.Taxonomy.Import: readNCBITaxNodes :: String -> IO (Either ParseError [TaxNode])
+ Biobase.Taxonomy.Import: readNCBITaxonomyDatabase :: String -> IO (Either [String] NCBITaxDump)
+ Biobase.Taxonomy.Import: readNamedTaxonomy :: String -> IO (Either ParseError (Gr SimpleTaxon Double))
+ Biobase.Taxonomy.Import: readTaxonomy :: String -> IO (Either ParseError (Gr SimpleTaxon Double))
+ Biobase.Taxonomy.Types: Class :: Rank
+ Biobase.Taxonomy.Types: Cohort :: Rank
+ Biobase.Taxonomy.Types: CompareTaxon :: Text -> Rank -> [Int] -> CompareTaxon
+ Biobase.Taxonomy.Types: Domain :: Rank
+ Biobase.Taxonomy.Types: Family :: Rank
+ Biobase.Taxonomy.Types: Form :: Rank
+ Biobase.Taxonomy.Types: Gene2Accession :: Int -> Int -> ByteString -> ByteString -> ByteString -> ByteString -> ByteString -> ByteString -> ByteString -> ByteString -> ByteString -> ByteString -> ByteString -> ByteString -> ByteString -> Gene2Accession
+ Biobase.Taxonomy.Types: Genus :: Rank
+ Biobase.Taxonomy.Types: Infraclass :: Rank
+ Biobase.Taxonomy.Types: Infrakingdom :: Rank
+ Biobase.Taxonomy.Types: Infraorder :: Rank
+ Biobase.Taxonomy.Types: Infraphylum :: Rank
+ Biobase.Taxonomy.Types: Infraspecies :: Rank
+ Biobase.Taxonomy.Types: Kingdom :: Rank
+ Biobase.Taxonomy.Types: Legion :: Rank
+ Biobase.Taxonomy.Types: Lineage :: Int -> ByteString -> Rank -> [LineageTaxon] -> Lineage
+ Biobase.Taxonomy.Types: LineageTaxon :: Int -> ByteString -> Rank -> LineageTaxon
+ Biobase.Taxonomy.Types: Magnorder :: Rank
+ Biobase.Taxonomy.Types: Microphylum :: Rank
+ Biobase.Taxonomy.Types: NCBITaxDump :: [TaxCitation] -> [TaxDelNode] -> [TaxDivision] -> [TaxGenCode] -> [TaxMergedNode] -> [TaxName] -> [TaxNode] -> NCBITaxDump
+ Biobase.Taxonomy.Types: Norank :: Rank
+ Biobase.Taxonomy.Types: Order :: Rank
+ Biobase.Taxonomy.Types: Parvclass :: Rank
+ Biobase.Taxonomy.Types: Parvorder :: Rank
+ Biobase.Taxonomy.Types: Phylum :: Rank
+ Biobase.Taxonomy.Types: Section :: Rank
+ Biobase.Taxonomy.Types: Series :: Rank
+ Biobase.Taxonomy.Types: SimpleGene2Accession :: Int -> ByteString -> SimpleGene2Accession
+ Biobase.Taxonomy.Types: SimpleTaxon :: Int -> Text -> Int -> Rank -> SimpleTaxon
+ Biobase.Taxonomy.Types: Species :: Rank
+ Biobase.Taxonomy.Types: Speciesgroup :: Rank
+ Biobase.Taxonomy.Types: Speciessubgroup :: Rank
+ Biobase.Taxonomy.Types: Subclass :: Rank
+ Biobase.Taxonomy.Types: Subfamily :: Rank
+ Biobase.Taxonomy.Types: Subgenus :: Rank
+ Biobase.Taxonomy.Types: Subkingdom :: Rank
+ Biobase.Taxonomy.Types: Suborder :: Rank
+ Biobase.Taxonomy.Types: Subphylum :: Rank
+ Biobase.Taxonomy.Types: Subspecies :: Rank
+ Biobase.Taxonomy.Types: Subtribe :: Rank
+ Biobase.Taxonomy.Types: Superclass :: Rank
+ Biobase.Taxonomy.Types: Superfamily :: Rank
+ Biobase.Taxonomy.Types: Superkingdom :: Rank
+ Biobase.Taxonomy.Types: Superorder :: Rank
+ Biobase.Taxonomy.Types: Superphylum :: Rank
+ Biobase.Taxonomy.Types: Superspecies :: Rank
+ Biobase.Taxonomy.Types: Supertribe :: Rank
+ Biobase.Taxonomy.Types: TaxCitation :: Int -> ByteString -> Maybe Int -> Maybe Int -> ByteString -> ByteString -> [Int] -> TaxCitation
+ Biobase.Taxonomy.Types: TaxDelNode :: Int -> TaxDelNode
+ Biobase.Taxonomy.Types: TaxDivision :: Int -> ByteString -> ByteString -> ByteString -> TaxDivision
+ Biobase.Taxonomy.Types: TaxGenCode :: Int -> ByteString -> ByteString -> ByteString -> ByteString -> TaxGenCode
+ Biobase.Taxonomy.Types: TaxMergedNode :: Int -> Int -> TaxMergedNode
+ Biobase.Taxonomy.Types: TaxName :: Int -> Text -> ByteString -> ByteString -> TaxName
+ Biobase.Taxonomy.Types: TaxNode :: Int -> Int -> Rank -> ByteString -> Int -> Bool -> Int -> Bool -> Int -> Bool -> Bool -> Bool -> ByteString -> TaxNode
+ Biobase.Taxonomy.Types: Taxon :: Int -> ByteString -> Int -> Rank -> ByteString -> TaxGenCode -> TaxGenCode -> ByteString -> [LineageTaxon] -> ByteString -> ByteString -> ByteString -> Taxon
+ Biobase.Taxonomy.Types: TaxonName :: ByteString -> ByteString -> TaxonName
+ Biobase.Taxonomy.Types: Tribe :: Rank
+ Biobase.Taxonomy.Types: Variety :: Rank
+ Biobase.Taxonomy.Types: [$sel:abbreviation:TaxGenCode] :: TaxGenCode -> ByteString
+ Biobase.Taxonomy.Types: [$sel:assembly:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:cde:TaxGenCode] :: TaxGenCode -> ByteString
+ Biobase.Taxonomy.Types: [$sel:citId:TaxCitation] :: TaxCitation -> Int
+ Biobase.Taxonomy.Types: [$sel:citKey:TaxCitation] :: TaxCitation -> ByteString
+ Biobase.Taxonomy.Types: [$sel:classCDE:TaxonName] :: TaxonName -> ByteString
+ Biobase.Taxonomy.Types: [$sel:compareRank:CompareTaxon] :: CompareTaxon -> Rank
+ Biobase.Taxonomy.Types: [$sel:compareScientificName:CompareTaxon] :: CompareTaxon -> Text
+ Biobase.Taxonomy.Types: [$sel:createDate:Taxon] :: Taxon -> ByteString
+ Biobase.Taxonomy.Types: [$sel:delTaxId:TaxDelNode] :: TaxDelNode -> Int
+ Biobase.Taxonomy.Types: [$sel:dispName:TaxonName] :: TaxonName -> ByteString
+ Biobase.Taxonomy.Types: [$sel:division:Taxon] :: Taxon -> ByteString
+ Biobase.Taxonomy.Types: [$sel:divisionCDE:TaxDivision] :: TaxDivision -> ByteString
+ Biobase.Taxonomy.Types: [$sel:divisionComments:TaxDivision] :: TaxDivision -> ByteString
+ Biobase.Taxonomy.Types: [$sel:divisionId:TaxDivision] :: TaxDivision -> Int
+ Biobase.Taxonomy.Types: [$sel:divisonName:TaxDivision] :: TaxDivision -> ByteString
+ Biobase.Taxonomy.Types: [$sel:emblCode:TaxNode] :: TaxNode -> ByteString
+ Biobase.Taxonomy.Types: [$sel:endPositionOnTheGenomicAccession:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:genBankHiddenFlag:TaxNode] :: TaxNode -> Bool
+ Biobase.Taxonomy.Types: [$sel:geneCodeName:TaxGenCode] :: TaxGenCode -> ByteString
+ Biobase.Taxonomy.Types: [$sel:geneID:Gene2Accession] :: Gene2Accession -> Int
+ Biobase.Taxonomy.Types: [$sel:geneticCode:Taxon] :: Taxon -> TaxGenCode
+ Biobase.Taxonomy.Types: [$sel:geneticCodeId:TaxGenCode] :: TaxGenCode -> Int
+ Biobase.Taxonomy.Types: [$sel:genomicNucleotideAccessionVersion:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:genomicNucleotideGi:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:hiddenSubtreeRootFlag:TaxNode] :: TaxNode -> Bool
+ Biobase.Taxonomy.Types: [$sel:inTree:CompareTaxon] :: CompareTaxon -> [Int]
+ Biobase.Taxonomy.Types: [$sel:inheritedDivFlag:TaxNode] :: TaxNode -> Bool
+ Biobase.Taxonomy.Types: [$sel:inheritedGCFlag:TaxNode] :: TaxNode -> Bool
+ Biobase.Taxonomy.Types: [$sel:inheritedMGCFlag:TaxNode] :: TaxNode -> Bool
+ Biobase.Taxonomy.Types: [$sel:lineage:Taxon] :: Taxon -> ByteString
+ Biobase.Taxonomy.Types: [$sel:lineageEx:Taxon] :: Taxon -> [LineageTaxon]
+ Biobase.Taxonomy.Types: [$sel:lineageRank:LineageTaxon] :: LineageTaxon -> Rank
+ Biobase.Taxonomy.Types: [$sel:lineageScienticName:LineageTaxon] :: LineageTaxon -> ByteString
+ Biobase.Taxonomy.Types: [$sel:lineageStartRank:Lineage] :: Lineage -> Rank
+ Biobase.Taxonomy.Types: [$sel:lineageStartScienticName:Lineage] :: Lineage -> ByteString
+ Biobase.Taxonomy.Types: [$sel:lineageStartTaxId:Lineage] :: Lineage -> Int
+ Biobase.Taxonomy.Types: [$sel:lineageTaxId:LineageTaxon] :: LineageTaxon -> Int
+ Biobase.Taxonomy.Types: [$sel:lineageTaxons:Lineage] :: Lineage -> [LineageTaxon]
+ Biobase.Taxonomy.Types: [$sel:maturePeptideAccessionVersion:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:maturePeptideGi:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:medlineId:TaxCitation] :: TaxCitation -> Maybe Int
+ Biobase.Taxonomy.Types: [$sel:mitoGeneticCode:Taxon] :: Taxon -> TaxGenCode
+ Biobase.Taxonomy.Types: [$sel:mitochondrialGeneticCodeId:TaxNode] :: TaxNode -> Int
+ Biobase.Taxonomy.Types: [$sel:nameClass:TaxName] :: TaxName -> ByteString
+ Biobase.Taxonomy.Types: [$sel:nameTaxId:TaxName] :: TaxName -> Int
+ Biobase.Taxonomy.Types: [$sel:nameTxt:TaxName] :: TaxName -> Text
+ Biobase.Taxonomy.Types: [$sel:newTaxId:TaxMergedNode] :: TaxMergedNode -> Int
+ Biobase.Taxonomy.Types: [$sel:nodeComments:TaxNode] :: TaxNode -> ByteString
+ Biobase.Taxonomy.Types: [$sel:nodeDivisionId:TaxNode] :: TaxNode -> Int
+ Biobase.Taxonomy.Types: [$sel:nodeGeneticCodeId:TaxNode] :: TaxNode -> Int
+ Biobase.Taxonomy.Types: [$sel:oldTaxId:TaxMergedNode] :: TaxMergedNode -> Int
+ Biobase.Taxonomy.Types: [$sel:orientation:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:parentTaxId:TaxNode] :: TaxNode -> Int
+ Biobase.Taxonomy.Types: [$sel:proteinAccessionVersion:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:proteinGi:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:pubDate:Taxon] :: Taxon -> ByteString
+ Biobase.Taxonomy.Types: [$sel:pubmedId:TaxCitation] :: TaxCitation -> Maybe Int
+ Biobase.Taxonomy.Types: [$sel:rank:TaxNode] :: TaxNode -> Rank
+ Biobase.Taxonomy.Types: [$sel:rnaNucleotideAccessionVersion:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:rnaNucleotideGi:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:simpleGenomicNucleotideAccessionVersion:SimpleGene2Accession] :: SimpleGene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:simpleParentTaxId:SimpleTaxon] :: SimpleTaxon -> Int
+ Biobase.Taxonomy.Types: [$sel:simpleRank:SimpleTaxon] :: SimpleTaxon -> Rank
+ Biobase.Taxonomy.Types: [$sel:simpleScientificName:SimpleTaxon] :: SimpleTaxon -> Text
+ Biobase.Taxonomy.Types: [$sel:simpleTaxId:SimpleTaxon] :: SimpleTaxon -> Int
+ Biobase.Taxonomy.Types: [$sel:simpleTaxIdEntry:SimpleGene2Accession] :: SimpleGene2Accession -> Int
+ Biobase.Taxonomy.Types: [$sel:startPositionOnTheGenomicAccession:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:starts:TaxGenCode] :: TaxGenCode -> ByteString
+ Biobase.Taxonomy.Types: [$sel:status:Gene2Accession] :: Gene2Accession -> ByteString
+ Biobase.Taxonomy.Types: [$sel:taxCitations:NCBITaxDump] :: NCBITaxDump -> [TaxCitation]
+ Biobase.Taxonomy.Types: [$sel:taxDelNodes:NCBITaxDump] :: NCBITaxDump -> [TaxDelNode]
+ Biobase.Taxonomy.Types: [$sel:taxDivisions:NCBITaxDump] :: NCBITaxDump -> [TaxDivision]
+ Biobase.Taxonomy.Types: [$sel:taxGenCodes:NCBITaxDump] :: NCBITaxDump -> [TaxGenCode]
+ Biobase.Taxonomy.Types: [$sel:taxId:TaxNode] :: TaxNode -> Int
+ Biobase.Taxonomy.Types: [$sel:taxIdEntry:Gene2Accession] :: Gene2Accession -> Int
+ Biobase.Taxonomy.Types: [$sel:taxIdList:TaxCitation] :: TaxCitation -> [Int]
+ Biobase.Taxonomy.Types: [$sel:taxMergedNodes:NCBITaxDump] :: NCBITaxDump -> [TaxMergedNode]
+ Biobase.Taxonomy.Types: [$sel:taxNames:NCBITaxDump] :: NCBITaxDump -> [TaxName]
+ Biobase.Taxonomy.Types: [$sel:taxNodes:NCBITaxDump] :: NCBITaxDump -> [TaxNode]
+ Biobase.Taxonomy.Types: [$sel:taxonParentTaxId:Taxon] :: Taxon -> Int
+ Biobase.Taxonomy.Types: [$sel:taxonRank:Taxon] :: Taxon -> Rank
+ Biobase.Taxonomy.Types: [$sel:taxonScientificName:Taxon] :: Taxon -> ByteString
+ Biobase.Taxonomy.Types: [$sel:taxonTaxId:Taxon] :: Taxon -> Int
+ Biobase.Taxonomy.Types: [$sel:text:TaxCitation] :: TaxCitation -> ByteString
+ Biobase.Taxonomy.Types: [$sel:uniqueName:TaxName] :: TaxName -> ByteString
+ Biobase.Taxonomy.Types: [$sel:updateDate:Taxon] :: Taxon -> ByteString
+ Biobase.Taxonomy.Types: [$sel:url:TaxCitation] :: TaxCitation -> ByteString
+ Biobase.Taxonomy.Types: data CompareTaxon
+ Biobase.Taxonomy.Types: data Gene2Accession
+ Biobase.Taxonomy.Types: data Lineage
+ Biobase.Taxonomy.Types: data LineageTaxon
+ Biobase.Taxonomy.Types: data NCBITaxDump
+ Biobase.Taxonomy.Types: data Rank
+ Biobase.Taxonomy.Types: data SimpleGene2Accession
+ Biobase.Taxonomy.Types: data SimpleTaxon
+ Biobase.Taxonomy.Types: data TaxCitation
+ Biobase.Taxonomy.Types: data TaxDelNode
+ Biobase.Taxonomy.Types: data TaxDivision
+ Biobase.Taxonomy.Types: data TaxGenCode
+ Biobase.Taxonomy.Types: data TaxMergedNode
+ Biobase.Taxonomy.Types: data TaxName
+ Biobase.Taxonomy.Types: data TaxNode
+ Biobase.Taxonomy.Types: data Taxon
+ Biobase.Taxonomy.Types: data TaxonName
+ Biobase.Taxonomy.Types: instance Data.Aeson.Types.ToJSON.ToJSON (Data.Graph.Inductive.Tree.Gr Biobase.Taxonomy.Types.SimpleTaxon GHC.Types.Double)
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.CompareTaxon
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.Gene2Accession
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.Lineage
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.LineageTaxon
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.NCBITaxDump
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.Rank
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.SimpleGene2Accession
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.SimpleTaxon
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.TaxCitation
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.TaxDelNode
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.TaxDivision
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.TaxGenCode
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.TaxMergedNode
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.TaxName
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.TaxNode
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.Taxon
+ Biobase.Taxonomy.Types: instance GHC.Classes.Eq Biobase.Taxonomy.Types.TaxonName
+ Biobase.Taxonomy.Types: instance GHC.Classes.Ord Biobase.Taxonomy.Types.Rank
+ Biobase.Taxonomy.Types: instance GHC.Enum.Bounded Biobase.Taxonomy.Types.Rank
+ Biobase.Taxonomy.Types: instance GHC.Enum.Enum Biobase.Taxonomy.Types.Rank
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.CompareTaxon
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.Gene2Accession
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.NCBITaxDump
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.Rank
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.SimpleGene2Accession
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.SimpleTaxon
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.TaxCitation
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.TaxDelNode
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.TaxDivision
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.TaxGenCode
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.TaxMergedNode
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.TaxName
+ Biobase.Taxonomy.Types: instance GHC.Read.Read Biobase.Taxonomy.Types.TaxNode
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.CompareTaxon
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.Gene2Accession
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.Lineage
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.LineageTaxon
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.NCBITaxDump
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.Rank
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.SimpleGene2Accession
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.SimpleTaxon
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.TaxCitation
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.TaxDelNode
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.TaxDivision
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.TaxGenCode
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.TaxMergedNode
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.TaxName
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.TaxNode
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.Taxon
+ Biobase.Taxonomy.Types: instance GHC.Show.Show Biobase.Taxonomy.Types.TaxonName
+ Biobase.Taxonomy.Types: readsRank :: String -> [(Rank, String)]
+ Biobase.Taxonomy.Types: simpleTaxonJSONValue :: Gr SimpleTaxon Double -> Node -> Value
+ Biobase.Taxonomy.Utils: compareSubTrees :: [Gr SimpleTaxon Double] -> (Int, Gr CompareTaxon Double)
+ Biobase.Taxonomy.Utils: extractTaxonomySubTreebyLevel :: [Node] -> Gr SimpleTaxon Double -> Maybe Int -> Gr SimpleTaxon Double
+ Biobase.Taxonomy.Utils: extractTaxonomySubTreebyLevelNew :: [Node] -> Gr SimpleTaxon Double -> Maybe Int -> Gr SimpleTaxon Double
+ Biobase.Taxonomy.Utils: extractTaxonomySubTreebyRank :: [Node] -> Gr SimpleTaxon Double -> Maybe Rank -> Gr SimpleTaxon Double
+ Biobase.Taxonomy.Utils: getParentbyRank :: Node -> Gr SimpleTaxon Double -> Maybe Rank -> Maybe (Node, SimpleTaxon)
+ Biobase.Taxonomy.Utils: safeNodePath :: Maybe Node -> Gr SimpleTaxon Double -> Maybe Node -> Either String Path
+ Biobase.Taxonomy.Visualization: drawTaxonomy :: Bool -> Gr SimpleTaxon Double -> String
+ Biobase.Taxonomy.Visualization: drawTaxonomyComparison :: Bool -> (Int, Gr CompareTaxon Double) -> String
+ Biobase.Taxonomy.Visualization: writeDotTree :: String -> Bool -> Gr SimpleTaxon Double -> IO ()
+ Biobase.Taxonomy.Visualization: writeJsonTree :: String -> Gr SimpleTaxon Double -> IO ()
+ Biobase.Taxonomy.Visualization: writeTree :: String -> String -> Bool -> Gr SimpleTaxon Double -> IO ()
Files
- Biobase/Taxonomy.hs +13/−0
- Biobase/Taxonomy/Import.hs +432/−0
- Biobase/Taxonomy/Types.hs +303/−0
- Biobase/Taxonomy/Utils.hs +142/−0
- Biobase/Taxonomy/Visualization.hs +100/−0
- ChangeLog.md +17/−0
- README.md +15/−0
- Taxonomy.cabal +26/−25
- src/Bio/Taxonomy.hs +0/−635
- src/Bio/TaxonomyData.hs +0/−292
+ Biobase/Taxonomy.hs view
@@ -0,0 +1,13 @@+-- | Functions for parsing, processing and visualization of taxonomy data.+--+module Biobase.Taxonomy ( -- * Datatypes+ -- Datatypes used to represent taxonomy data+ module Biobase.Taxonomy.Types,+ module Biobase.Taxonomy.Import,+ module Biobase.Taxonomy.Utils,+ module Biobase.Taxonomy.Visualization+ ) where+import Biobase.Taxonomy.Types+import Biobase.Taxonomy.Import+import Biobase.Taxonomy.Utils+import Biobase.Taxonomy.Visualization
+ Biobase/Taxonomy/Import.hs view
@@ -0,0 +1,432 @@+-- | Functions for parsing, processing and visualization of taxonomy data.+--+-- === Usage example:+-- * Read in taxonomy data+--+-- > eitherTaxtree <- readNamedTaxonomy "/path/to/NCBI_taxonomydump_directory"+--+-- * Process data+--+-- > let subtree = extractTaxonomySubTreebyLevel [562] (fromRight eitherTaxTree) (Just 4)+--+-- * Visualize result+--+-- tput "/path/to/dotdirectory" subtree+module Biobase.Taxonomy.Import ( -- * Datatypes+ -- Datatypes used to represent taxonomy data+ module Biobase.Taxonomy.Types,+ -- * Parsing+ -- Functions prefixed with "read" read from filepaths, functions with parse from Haskell Strings.+ readTaxonomy,+ readNamedTaxonomy,+ parseTaxonomy,+ parseNCBITaxCitations,+ readNCBITaxCitations,+ parseNCBITaxDelNodes,+ readNCBITaxDelNodes,+ parseNCBITaxDivisions,+ readNCBITaxDivisions,+ parseNCBITaxGenCodes,+ readNCBITaxGenCodes,+ parseNCBITaxMergedNodes,+ readNCBITaxMergedNodes,+ parseNCBITaxNames,+ readNCBITaxNames,+ parseNCBITaxNodes,+ readNCBITaxNodes,+ parseNCBISimpleTaxons,+ readNCBISimpleTaxons,+ readNCBITaxonomyDatabase+ ) where+import Prelude+import System.IO+import Biobase.Taxonomy.Types+import Text.Parsec.Prim (runP)+import Text.ParserCombinators.Parsec+import Control.Monad+import Data.List+import Data.Maybe+import qualified Data.Either.Unwrap as E+import Data.Graph.Inductive.Graph+import Data.Graph.Inductive.Tree+import qualified Data.ByteString.Char8 as B+import qualified Data.Text.Lazy as T+--------------------------------------------------------++---------------------------------------+-- Parsing functions++-- | NCBI taxonomy dump nodes and names in the input directory path are parsed and a SimpleTaxon tree with scientific names for each node is generated.+readNamedTaxonomy :: String -> IO (Either ParseError (Gr SimpleTaxon Double))+readNamedTaxonomy directoryPath = do+ nodeNames <- readNCBITaxNames (directoryPath ++ "names.dmp")+ if E.isLeft nodeNames+ then return (Left (E.fromLeft nodeNames))+ else do+ let rightNodeNames = E.fromRight nodeNames+ let filteredNodeNames = filter isScientificName rightNodeNames+ let namedTaxonomyGraph = genParserNamedTaxonomyGraph filteredNodeNames+ parseFromFileEncISO88591 namedTaxonomyGraph (directoryPath ++ "nodes.dmp")++isScientificName :: TaxName -> Bool+isScientificName name = nameClass name == scientificNameT+ where scientificNameT = B.pack "scientific name"++-- | NCBI taxonomy dump nodes and names in the input directory path are parsed and a SimpleTaxon tree is generated.+readTaxonomy :: String -> IO (Either ParseError (Gr SimpleTaxon Double))+readTaxonomy = parseFromFileEncISO88591 genParserTaxonomyGraph++-- | NCBI taxonomy dump nodes and names in the input directory path are parsed and a SimpleTaxon tree is generated.+parseTaxonomy :: String -> Either ParseError (Gr SimpleTaxon Double)+parseTaxonomy = parse genParserTaxonomyGraph "parseTaxonomy"++genParserTaxonomyGraph :: GenParser Char st (Gr SimpleTaxon Double)+genParserTaxonomyGraph = do+ nodesEdges <- many1 (try genParserGraphNodeEdge)+ optional eof+ let (nodesList,edgesList) = unzip nodesEdges+ --let taxedges = filter (\(a,b,_) -> a /= b) edgesList+ let taxedges = filter notLoopEdge edgesList+ --let taxnodes = concat nodesList+ --return (mkGraph taxnodes taxedges)+ let currentGraph = mkGraph nodesList taxedges+ return currentGraph+++notLoopEdge :: (Int,Int,a) -> Bool+notLoopEdge (a,b,_) = a /= b++--genParserNodeEdges :: [TaxName] -> GenParser Char st [(Int,SimpleTaxon),(Int,Int,Double)]+--genParserNodeEdges = do+-- nodesEdges <- (many1 (try genParserGraphNodeEdge))+-- optional eof+-- return (nodesList,edgesList)+++ --let taxedges = filter notLoopEdge edgesList+ --let taxnamednodes = map (setNodeScientificName filteredNodeNames) nodesList+ --let currentGraph = mkGraph taxnamednodes taxedges+ --return currentGraph++genParserNamedTaxonomyGraph :: [TaxName] -> GenParser Char st (Gr SimpleTaxon Double)+genParserNamedTaxonomyGraph filteredNodeNames = do+ nodesEdges <- (many1 (try genParserGraphNodeEdge))+ optional eof+ let (nodesList,edgesList) = unzip nodesEdges+ let taxedges = filter notLoopEdge edgesList+ let taxnamednodes = map (setNodeScientificName filteredNodeNames) nodesList+ let currentGraph = mkGraph taxnamednodes taxedges+ return currentGraph++setNodeScientificName :: [TaxName] -> (t, SimpleTaxon) -> (t, SimpleTaxon)+setNodeScientificName inputTaxNames (inputNode,inputTaxon) = outputNode+ where maybeRetrievedName = find (isTaxNameIdSimpleTaxid inputTaxon) inputTaxNames+ retrievedName = maybe (T.pack "no name") nameTxt maybeRetrievedName+ outputNode = (inputNode,inputTaxon{simpleScientificName = retrievedName})++isTaxNameIdSimpleTaxid :: SimpleTaxon -> TaxName -> Bool+isTaxNameIdSimpleTaxid inputTaxon inputTaxName = nameTaxId inputTaxName == simpleTaxId inputTaxon+++genParserGraphNodeEdge :: GenParser Char st ((Int,SimpleTaxon),(Int,Int,Double))+genParserGraphNodeEdge = do+ _simpleTaxId <- many1 digit+ string "\t|\t"+ _simpleParentTaxId <- many1 digit+ string "\t|\t"+ _simpleRank <- many1 (noneOf "\t")+ many1 (noneOf "\n")+ char '\n'+ let _simpleTaxIdInt = readInt _simpleTaxId+ let _simpleParentTaxIdInt = readInt _simpleParentTaxId+ return ((_simpleTaxIdInt,SimpleTaxon _simpleTaxIdInt T.empty _simpleParentTaxIdInt (readRank _simpleRank)),(_simpleTaxIdInt,_simpleParentTaxIdInt,1 :: Double))++-- | parse NCBITaxCitations from input string+parseNCBITaxCitations :: String -> Either ParseError [TaxCitation]+parseNCBITaxCitations = parse genParserNCBITaxCitations "parseTaxCitations"++-- | parse NCBITaxCitations from input filePath+readNCBITaxCitations :: String -> IO (Either ParseError [TaxCitation])+readNCBITaxCitations = parseFromFileEncISO88591 genParserNCBITaxCitations++-- | parse NCBITaxDelNodes from input string+parseNCBITaxDelNodes :: String -> Either ParseError [TaxDelNode]+parseNCBITaxDelNodes = parse genParserNCBITaxDelNodes "parseTaxDelNodes"++-- | parse NCBITaxDelNodes from input filePath+readNCBITaxDelNodes :: String -> IO (Either ParseError [TaxDelNode])+readNCBITaxDelNodes = parseFromFile genParserNCBITaxDelNodes++-- | parse NCBITaxDivisons from input string+parseNCBITaxDivisions :: String -> Either ParseError [TaxDivision]+parseNCBITaxDivisions = parse genParserNCBITaxDivisons "parseTaxDivisons"++-- | parse NCBITaxDivisons from input filePath+readNCBITaxDivisions :: String -> IO (Either ParseError [TaxDivision])+readNCBITaxDivisions = parseFromFile genParserNCBITaxDivisons++-- | parse NCBITaxGenCodes from input string+parseNCBITaxGenCodes :: String -> Either ParseError [TaxGenCode]+parseNCBITaxGenCodes = parse genParserNCBITaxGenCodes "parseTaxGenCodes"++-- | parse NCBITaxGenCodes from input filePath+readNCBITaxGenCodes :: String -> IO (Either ParseError [TaxGenCode])+readNCBITaxGenCodes = parseFromFile genParserNCBITaxGenCodes++-- | parse NCBITaxMergedNodes from input string+parseNCBITaxMergedNodes :: String -> Either ParseError [TaxMergedNode]+parseNCBITaxMergedNodes = parse genParserNCBITaxMergedNodes "parseTaxMergedNodes"++-- | parse NCBITaxMergedNodes from input filePath+readNCBITaxMergedNodes :: String -> IO (Either ParseError [TaxMergedNode])+readNCBITaxMergedNodes = parseFromFile genParserNCBITaxMergedNodes++-- | parse NCBITaxNames from input string+parseNCBITaxNames :: String -> Either ParseError [TaxName]+parseNCBITaxNames = parse genParserNCBITaxNames "parseTaxNames"++-- | parse NCBITaxNames from input filePath+readNCBITaxNames :: String -> IO (Either ParseError [TaxName])+readNCBITaxNames = parseFromFile genParserNCBITaxNames++-- | parse NCBITaxNames from input string+parseNCBITaxNodes :: String -> Either ParseError TaxNode+parseNCBITaxNodes = parse genParserNCBITaxNode "parseTaxNode"++-- | parse NCBITaxCitations from input filePath+readNCBITaxNodes :: String -> IO (Either ParseError [TaxNode])+readNCBITaxNodes = parseFromFile genParserNCBITaxNodes++-- | parse NCBISimpleTaxNames from input string+parseNCBISimpleTaxons :: String -> Either ParseError SimpleTaxon+parseNCBISimpleTaxons = parse genParserNCBISimpleTaxon "parseSimpleTaxon"++-- | parse NCBITaxCitations from input filePath+readNCBISimpleTaxons :: String -> IO (Either ParseError [SimpleTaxon])+readNCBISimpleTaxons = parseFromFile genParserNCBISimpleTaxons++-- | Parse the input as NCBITax datatype+readNCBITaxonomyDatabase :: String -> IO (Either [String] NCBITaxDump)+readNCBITaxonomyDatabase folder = do+ citations <- readNCBITaxCitations (folder ++ "citations.dmp")+ let citationsError = extractParseError citations+ taxdelNodes <- readNCBITaxDelNodes (folder ++ "delnodes.dmp")+ let delNodesError = extractParseError taxdelNodes+ divisons <- readNCBITaxDivisions (folder ++ "division.dmp")+ let divisonsError = extractParseError divisons+ genCodes <- readNCBITaxGenCodes (folder ++ "gencode.dmp")+ let genCodesError = extractParseError genCodes+ mergedNodes <- readNCBITaxMergedNodes (folder ++ "merged.dmp")+ let mergedNodesError = extractParseError mergedNodes+ names <- readNCBITaxNames (folder ++ "names.dmp")+ let namesError = extractParseError names+ taxnodes <- readNCBITaxNodes (folder ++ "nodes.dmp")+ let nodesError = extractParseError taxnodes+ let parseErrors = [citationsError, delNodesError, divisonsError, genCodesError, mergedNodesError, namesError, nodesError]+ return (checkParsing parseErrors citations taxdelNodes divisons genCodes mergedNodes names taxnodes)++genParserNCBITaxCitations :: GenParser Char st [TaxCitation]+genParserNCBITaxCitations = many1 genParserNCBITaxCitation++genParserNCBITaxDelNodes :: GenParser Char st [TaxDelNode]+genParserNCBITaxDelNodes = many1 genParserNCBITaxDelNode++genParserNCBITaxDivisons :: GenParser Char st [TaxDivision]+genParserNCBITaxDivisons = many1 genParserNCBITaxDivision++genParserNCBITaxGenCodes :: GenParser Char st [TaxGenCode]+genParserNCBITaxGenCodes = many1 genParserNCBITaxGenCode+++genParserNCBITaxMergedNodes :: GenParser Char st [TaxMergedNode]+genParserNCBITaxMergedNodes = many1 genParserNCBITaxMergedNode+++genParserNCBITaxNames :: GenParser Char st [TaxName]+genParserNCBITaxNames = many1 genParserNCBITaxName++genParserNCBITaxNodes :: GenParser Char st [TaxNode]+genParserNCBITaxNodes = many1 genParserNCBITaxNode++genParserNCBISimpleTaxons :: GenParser Char st [SimpleTaxon]+genParserNCBISimpleTaxons = many1 genParserNCBISimpleTaxon+++genParserNCBITaxCitation :: GenParser Char st TaxCitation+genParserNCBITaxCitation = do+ _citId <- many1 digit+ string "\t|\t"+ _citKey <- many (noneOf "\t")+ string "\t|\t"+ _pubmedId <- optionMaybe (many1 digit)+ string "\t|\t"+ _medlineId <- optionMaybe (many1 digit)+ tab+ char '|'+ _url <- genParserTaxURL+ char '|'+ tab+ _text <- (many (noneOf "\t"))+ string "\t|\t"+ _taxIdList <- (many genParserTaxIdList)+ string "\t|\n"+ return $ TaxCitation (readInt _citId) (B.pack _citKey) (liftM readInt _pubmedId) (liftM readInt _medlineId) _url (B.pack _text) _taxIdList++genParserNCBITaxDelNode :: GenParser Char st TaxDelNode+genParserNCBITaxDelNode = do+ taxdelNode <- many1 digit+ space+ char '|'+ char '\n'+ return $ TaxDelNode (readInt taxdelNode)++genParserNCBITaxDivision :: GenParser Char st TaxDivision+genParserNCBITaxDivision = do+ _divisionId <- many1 digit+ string "\t|\t"+ _divisionCDE <- many1 upper+ string "\t|\t"+ _divisionName <- many1 (noneOf "\t")+ string "\t|\t"+ _comments <- many1 (noneOf "\t")+ string "\t|\n"+ return $ TaxDivision (readInt _divisionId) (B.pack _divisionCDE) (B.pack _divisionName) (B.pack _comments)++genParserNCBITaxGenCode :: GenParser Char st TaxGenCode+genParserNCBITaxGenCode = do+ _geneticCodeId <- many1 digit+ string "\t|\t"+ _abbreviation <- (many1 (noneOf "\t"))+ string "\t|\t"+ _genCodeName <- many1 (noneOf "\t")+ string "\t|\t"+ _cde <- many1 (noneOf "\t")+ string "\t|\t"+ _starts <- many1 (noneOf "\t")+ string "\t|\n"+ return $ TaxGenCode (readInt _geneticCodeId) (B.pack _abbreviation) (B.pack _genCodeName) (B.pack _cde) (B.pack _starts)++genParserNCBITaxMergedNode :: GenParser Char st TaxMergedNode+genParserNCBITaxMergedNode = do+ _oldTaxId <- many1 digit+ string "\t|\t"+ _newTaxId <- many1 digit+ string "\t|\n"+ return $ TaxMergedNode (readInt _oldTaxId) (readInt _newTaxId)++genParserNCBITaxName :: GenParser Char st TaxName+genParserNCBITaxName = do+ _taxId <- many1 digit+ string "\t|\t"+ _nameTxt <- many1 (noneOf "\t\n")+ string "\t|\t"+ _uniqueName <- many (noneOf "\t\n")+ string "\t|\t"+ _nameClass <- many1 (noneOf "\t\n")+ tab+ char '|'+ newline+ return $! TaxName (readInt _taxId) (T.pack _nameTxt) (B.pack _uniqueName) (B.pack _nameClass)++genParserNCBISimpleTaxon :: GenParser Char st SimpleTaxon+genParserNCBISimpleTaxon = do+ _simpleTaxId <- many1 digit+ string "\t|\t"+ _simpleParentTaxId <- many1 digit+ string "\t|\t"+ _simpleRank <- many1 (noneOf "\t")+ many1 (noneOf "\n")+ char '\n'+ return $! SimpleTaxon (readInt _simpleTaxId) T.empty (readInt _simpleParentTaxId) (readRank _simpleRank)++genParserNCBITaxNode :: GenParser Char st TaxNode+genParserNCBITaxNode = do+ _taxId <- many1 digit+ string "\t|\t"+ _parentTaxId <- many1 digit+ string "\t|\t"+ _rank <- many1 (noneOf "\t")+ string "\t|\t"+ _emblCode <- (many (noneOf "\t"))+ string "\t|\t"+ _divisionId <- many1 digit+ string "\t|\t"+ _inheritedDivFlag <- many1 digit+ string "\t|\t"+ _geneticCodeId <- many1 digit+ string "\t|\t"+ _inheritedGCFlag <- many1 digit+ string "\t|\t"+ _mitochondrialGeneticCodeId <- many1 digit+ string "\t|\t"+ _inheritedMGCFlag <- many1 digit+ string "\t|\t"+ _genBankHiddenFlag <- many1 digit+ string "\t|\t"+ _hiddenSubtreeRootFlag <- many1 digit+ string "\t|\t"+ _comments <- many (noneOf "\t")+ tab+ char '|'+ char '\n'+ return $ TaxNode (readInt _taxId) (readInt _parentTaxId) (readRank _rank) (B.pack _emblCode) (read _divisionId :: Int) (readBool _inheritedDivFlag) (read _geneticCodeId ::Int) (readBool _inheritedGCFlag) (read _mitochondrialGeneticCodeId ::Int) (readBool _inheritedMGCFlag) (readBool _genBankHiddenFlag) (readBool _hiddenSubtreeRootFlag) (B.pack _comments)++---------------------------------------+-- Auxiliary functions+readInt :: String -> Int+readInt = read++readBool :: String -> Bool+readBool "0" = False+readBool "1" = True+readBool _ = False++readRank :: String -> Rank+readRank a = read a :: Rank++genParserTaxIdList :: GenParser Char st Int+genParserTaxIdList = do+ optional (char ' ')+ _taxId <- many1 digit+ optional (char ' ')+ return (readInt _taxId)++genParserTaxURL :: GenParser Char st B.ByteString+genParserTaxURL = do+ tab+ url1 <- many (noneOf "\t")+ tab+ url2 <- many (noneOf "|")+ return (B.pack (url1 ++ url2))+ --return (concatenateURLParts url1 url2)++concatenateURLParts :: Maybe String -> Maybe String -> Maybe String+concatenateURLParts url1 url2+ | isJust url1 && isJust url2 = maybeStringConcat url1 url2+ | isJust url1 && isNothing url2 = url1+ | otherwise = Nothing++maybeStringConcat :: Maybe String -> Maybe String -> Maybe String+maybeStringConcat = liftM2 (++)++readEncodedFile :: TextEncoding -> FilePath -> IO String+readEncodedFile encoding name = do+ handle <- openFile name ReadMode+ hSetEncoding handle encoding+ hGetContents handle++parseFromFileEncISO88591 :: Parser a -> String -> IO (Either ParseError a)+parseFromFileEncISO88591 parser fname = do+ input <- readEncodedFile latin1 fname+ return (runP parser () fname input)++-- | check a list of parsing results for presence of Left aka Parse error+checkParsing :: [String] -> Either ParseError [TaxCitation] -> Either ParseError [TaxDelNode] -> Either ParseError [TaxDivision] -> Either ParseError [TaxGenCode] -> Either ParseError [TaxMergedNode] -> Either ParseError [TaxName] -> Either ParseError [TaxNode]-> Either [String] NCBITaxDump+checkParsing parseErrors citations taxdelNodes divisons genCodes mergedNodes names taxnodes+ | join parseErrors == "" = Right (NCBITaxDump (E.fromRight citations) (E.fromRight taxdelNodes) (E.fromRight divisons) (E.fromRight genCodes) (E.fromRight mergedNodes) (E.fromRight names) (E.fromRight taxnodes))+ | otherwise = Left parseErrors++extractParseError :: Either ParseError a -> String+extractParseError _parse+ | E.isLeft _parse = show (E.fromLeft _parse)+ | otherwise = ""
+ Biobase/Taxonomy/Types.hs view
@@ -0,0 +1,303 @@+-- | This module contains data structures for+-- taxonomy data++{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE DuplicateRecordFields #-}++module Biobase.Taxonomy.Types where+import Prelude+import qualified Data.ByteString.Char8 as B+import qualified Data.Aeson as A+import qualified Data.Vector as V+--import Data.Graph.Inductive+import Data.Graph.Inductive.Graph+import Data.Graph.Inductive.Tree+import qualified Data.Text as T+import qualified Data.Text.Lazy as TL+--import qualified Data.Text.Encoding++-- | SimpleTaxon only contains the most relevant fields of a taxonomy entry.+-- For all annotaded fields use the Taxon datatype and its associated functions+data SimpleTaxon = SimpleTaxon+ {+ -- node id in GenBank+ simpleTaxId :: Int,+ simpleScientificName :: TL.Text,+ -- parent node id in GenBank taxonomy database+ simpleParentTaxId :: Int,+ -- rank of this node (superkingdom, kingdom, ...)+ simpleRank :: Rank+ }+ deriving (Show, Read, Eq)++-- | Datastructure for tree comparisons+data CompareTaxon = CompareTaxon+ {+ compareScientificName :: TL.Text,+ compareRank :: Rank,+ -- number indicating in which trees,+ inTree :: [Int]+ }+ deriving (Show, Read, Eq)++-- | Data structure for Entrez taxonomy fetch result+data Taxon = Taxon+ { taxonTaxId :: Int+ , taxonScientificName :: B.ByteString+ , taxonParentTaxId :: Int+ , taxonRank :: Rank+ , division :: B.ByteString+ , geneticCode :: TaxGenCode+ , mitoGeneticCode :: TaxGenCode+ , lineage :: B.ByteString+ , lineageEx :: [LineageTaxon]+ , createDate :: B.ByteString+ , updateDate :: B.ByteString+ , pubDate :: B.ByteString+ } deriving (Show, Eq)+++data TaxonName = TaxonName+ { classCDE :: B.ByteString+ , dispName :: B.ByteString+ } deriving (Show, Eq)++-- | Lineage Taxons denote all parent Taxonomy nodes of a node retrieved by Entrez fetch+data Lineage = Lineage+ { lineageStartTaxId :: Int+ , lineageStartScienticName :: B.ByteString+ , lineageStartRank :: Rank+ , lineageTaxons :: [LineageTaxon]+ }+ deriving (Show, Eq)+++-- | Lineage Taxons denote all parent Taxonomy nodes of a node retrieved by Entrez fetch+data LineageTaxon = LineageTaxon+ { lineageTaxId :: Int+ , lineageScienticName :: B.ByteString+ , lineageRank :: Rank}+ deriving (Show, Eq)++-- | NCBI Taxonomy database dump hierachichal data structure+-- as defined in ftp://ftp.ncbi.nih.gov/pub/taxonomy/taxdump_readme.txt+data NCBITaxDump = NCBITaxDump+ {+ taxCitations :: [TaxCitation],+ taxDelNodes :: [TaxDelNode],+ taxDivisions :: [TaxDivision],+ taxGenCodes :: [TaxGenCode],+ taxMergedNodes :: [TaxMergedNode],+ taxNames :: [TaxName],+ taxNodes :: [TaxNode]+ }+ deriving (Show, Read, Eq)++-- | Datastructure for entries of Taxonomy database dump citations file+data TaxCitation = TaxCitation+ {+ -- the unique id of citation+ citId :: Int,+ -- citation key+ citKey :: B.ByteString,+ -- unique id in PubMed database (0 if not in PubMed)+ pubmedId :: Maybe Int,+ -- unique id in MedLine database (0 if not in MedLine)+ medlineId :: Maybe Int,+ -- URL associated with citation+ url :: B.ByteString,+ -- any text (usually article name and authors)+ -- The following characters are escaped in this text by a backslash:+ -- newline (appear as "\n"),+ -- tab character ("\t"),+ -- double quotes ('\"'),+ -- backslash character ("\\").+ text :: B.ByteString,+ -- list of node ids separated by a single space+ taxIdList :: [Int]+ }+ deriving (Show, Read, Eq)++-- | Datastructure for entries of Taxonomy database dump deleted nodes file+data TaxDelNode = TaxDelNode+ {+ -- deleted node id+ delTaxId :: Int+ }+ deriving (Show, Read, Eq)++-- | Datastructure for entries of Taxonomy database dump division file+data TaxDivision = TaxDivision+ {+ -- taxonomy database division id+ divisionId :: Int,+ -- GenBank division code (three characters)+ divisionCDE :: B.ByteString,+ -- e.g. BCT, PLN, VRT, MAM, PRI...+ divisonName :: B.ByteString,+ divisionComments :: B.ByteString+ }+ deriving (Show, Read, Eq)++-- | Datastructure for entries of Taxonomy database dump gencode file+data TaxGenCode = TaxGenCode+ {+ -- GenBank genetic code id+ geneticCodeId :: Int,+ -- genetic code name abbreviation+ abbreviation :: B.ByteString,+ -- genetic code name+ geneCodeName :: B.ByteString,+ -- translation table for this genetic code+ cde :: B.ByteString,+ -- start codons for this genetic code+ starts :: B.ByteString+ }+ deriving (Show, Read, Eq)++-- | Datastructure for entries of Taxonomy database dump mergednodes file+data TaxMergedNode = TaxMergedNode+ {+ -- id of nodes which has been merged+ oldTaxId :: Int,+ -- id of nodes which is result of merging+ newTaxId :: Int+ }+ deriving (Show, Read, Eq)++-- | Datastructure for entries of Taxonomy database dump names file+data TaxName = TaxName+ {+ -- the id of node associated with this name+ nameTaxId :: Int,+ -- name itself+ nameTxt :: TL.Text,+ -- the unique variant of this name if name not unique+ uniqueName :: B.ByteString,+ -- (synonym, common name, ...)+ nameClass :: B.ByteString+ }+ deriving (Show, Read, Eq)++-- | Taxonomic ranks: NCBI uses the uncommon Speciessubgroup+data Rank = Norank | Form | Variety | Infraspecies | Subspecies | Speciessubgroup | Species | Speciesgroup | Superspecies | Series | Section | Subgenus | Genus | Subtribe | Tribe | Supertribe | Subfamily | Family | Superfamily | Parvorder | Infraorder | Suborder | Order | Superorder | Magnorder | Cohort | Legion | Parvclass | Infraclass | Subclass | Class | Superclass | Microphylum | Infraphylum | Subphylum | Phylum | Superphylum | Infrakingdom | Subkingdom | Kingdom | Superkingdom | Domain deriving (Eq, Ord, Show, Bounded, Enum)++readsRank :: String -> [(Rank, String)]+instance Read Rank where+ readsPrec _ = readsRank++readsRank input -- = [(Domain x)| x <- reads input ]+ | input == "domain" = [(Domain,"")]+ | input == "superkingdom" = [(Superkingdom,"")]+ | input == "kingdom" = [(Kingdom,"")]+ | input == "subkingdom" = [(Subkingdom,"")]+ | input == "infrakingdom" = [(Infrakingdom,"")]+ | input == "superphylum" = [(Superphylum,"")]+ | input == "phylum" = [(Phylum,"")]+ | input == "subphylum" = [(Subphylum,"")]+ | input == "infraphylum" = [(Infraphylum,"")]+ | input == "microphylum" = [(Microphylum,"")]+ | input == "superclass" = [(Superclass,"")]+ | input == "class" = [(Class,"")]+ | input == "subclass" = [(Subclass,"")]+ | input == "infraclass" = [(Infraclass,"")]+ | input == "parvclass " = [(Parvclass ,"")]+ | input == "legion" = [(Legion,"")]+ | input == "cohort" = [(Cohort,"")]+ | input == "magnorder " = [(Magnorder ,"")]+ | input == "superorder" = [(Superorder,"")]+ | input == "order" = [(Order,"")]+ | input == "suborder" = [(Suborder,"")]+ | input == "infraorder" = [(Infraorder,"")]+ | input == "parvorder" = [(Parvorder,"")]+ | input == "superfamily" = [(Superfamily,"")]+ | input == "family" = [(Family,"")]+ | input == "subfamily" = [(Subfamily,"")]+ | input == "supertribe" = [(Supertribe,"")]+ | input == "tribe" = [(Tribe,"")]+ | input == "subtribe" = [(Subtribe,"")]+ | input == "genus" = [(Genus,"")]+ | input == "subgenus" = [(Subgenus,"")]+ | input == "section" = [(Section,"")]+ | input == "series" = [(Series,"")]+ | input == "superspecies" = [(Superspecies,"")]+ | input == "species group" = [(Speciesgroup,"")]+ | input == "species" = [(Species,"")]+ | input == "species subgroup" = [(Speciessubgroup,"")]+ | input == "subspecies" = [(Subspecies,"")]+ | input == "infraspecies" = [(Infraspecies,"")]+ | input == "varietas" = [(Variety,"")]+ | input == "forma" = [(Form,"")]+ | input == "no rank" = [(Norank,"")]+ | otherwise = [(Norank,"")]++-- | Datastructure for entries of Taxonomy database dump nodes file+data TaxNode = TaxNode+ {+ -- node id in GenBank+ taxId :: Int,+ -- parent node id in GenBank taxonomy database+ parentTaxId :: Int,+ -- rank of this node (superkingdom, kingdom, ...)+ rank :: Rank,+ -- locus-name prefix; not unique+ emblCode :: B.ByteString,+ -- see division.dmp file+ nodeDivisionId :: Int,+ -- 1 if node inherits division from parent+ inheritedDivFlag :: Bool,+ -- see gencode.dmp file+ nodeGeneticCodeId :: Int,+ -- 1 if node inherits genetic code from parent+ inheritedGCFlag :: Bool,+ -- see gencode.dmp file+ mitochondrialGeneticCodeId :: Int,+ -- 1 if node inherits mitochondrial gencode from parent+ inheritedMGCFlag :: Bool,+ -- 1 if name is suppressed in GenBank entry lineage+ genBankHiddenFlag :: Bool,+ -- 1 if this subtree has no sequence data yet+ hiddenSubtreeRootFlag :: Bool,+ -- free-text comments and citations+ nodeComments :: B.ByteString+ }+ deriving (Show, Read, Eq)++-- | Simple Gene2Accession table+data SimpleGene2Accession = SimpleGene2Accession+ { simpleTaxIdEntry :: Int,+ simpleGenomicNucleotideAccessionVersion :: B.ByteString+ } deriving (Show, Eq, Read)++-- | Datastructure for Gene2Accession table+data Gene2Accession = Gene2Accession+ { taxIdEntry :: Int,+ geneID :: Int,+ status :: B.ByteString,+ rnaNucleotideAccessionVersion :: B.ByteString,+ rnaNucleotideGi :: B.ByteString,+ proteinAccessionVersion :: B.ByteString,+ proteinGi :: B.ByteString,+ genomicNucleotideAccessionVersion :: B.ByteString,+ genomicNucleotideGi :: B.ByteString,+ startPositionOnTheGenomicAccession :: B.ByteString,+ endPositionOnTheGenomicAccession :: B.ByteString,+ orientation :: B.ByteString,+ assembly :: B.ByteString,+ maturePeptideAccessionVersion :: B.ByteString,+ maturePeptideGi :: B.ByteString+ } deriving (Show, Eq, Read)++instance A.ToJSON (Gr SimpleTaxon Double) where+ toJSON inputGraph = simpleTaxonJSONValue inputGraph 1++simpleTaxonJSONValue :: Gr SimpleTaxon Double -> Node -> A.Value+simpleTaxonJSONValue inputGraph node = jsonValue+ where jsonValue = A.object [currentScientificName,T.pack "children" A..= children]+ childNodes = suc inputGraph node+ currentLabel = lab inputGraph node+ currentScientificName = T.pack "name" A..= maybe (T.pack "notFound") (TL.toStrict . simpleScientificName) currentLabel+ children = A.Array (V.fromList (map (simpleTaxonJSONValue inputGraph) childNodes))+ --jsonValue = A.object [currentScientificName,currentId,currentRank,(T.pack "children") A..= children]+ --currentId = (T.pack "id") A..= (maybe (T.pack "notFound") (\a -> T.pack (show (simpleTaxId a))) currentLabel)+ --currentRank = (T.pack "rank") A..= (maybe (T.pack "notFound") (\a -> T.pack (show (simpleRank a))) currentLabel)
+ Biobase/Taxonomy/Utils.hs view
@@ -0,0 +1,142 @@+-- | Functions for processing of taxonomy data.+--+module Biobase.Taxonomy.Utils ( -- * Datatypes+ -- Datatypes used to represent taxonomy data+ module Biobase.Taxonomy.Types,+ -- * Processing+ compareSubTrees,+ extractTaxonomySubTreebyLevel,+ extractTaxonomySubTreebyLevelNew,+ extractTaxonomySubTreebyRank,+ safeNodePath,+ getParentbyRank,+ ) where+import Prelude+import Biobase.Taxonomy.Types+import Data.List+import qualified Data.Vector as V+import Data.Maybe+import Data.Graph.Inductive.Graph+import Data.Graph.Inductive.Query.SP (sp)+import Data.Graph.Inductive.Query.BFS (level)+import Data.Graph.Inductive.Tree+import Data.Graph.Inductive.Basic++---------------------------------------+-- Processing functions++-- | Extract a subtree correpsonding to input node paths to root. Only nodes in level number distance to root are included. Used in Ids2TreeCompare tool.+compareSubTrees :: [Gr SimpleTaxon Double] -> (Int,Gr CompareTaxon Double)+compareSubTrees graphs = (length graphs,resultGraph)+ where treesLabNodes = map labNodes graphs+ treesLabEdges = map labEdges graphs+ mergedNodes = nub (concat treesLabNodes)+ mergedEdges = nub (concat treesLabEdges)+ --annotate node in which of the compared trees they are present+ comparedNodes = annotateTaxonsDifference treesLabNodes mergedNodes+ resultGraph = mkGraph comparedNodes mergedEdges :: Gr CompareTaxon Double++annotateTaxonsDifference :: [[LNode SimpleTaxon]] -> [LNode SimpleTaxon] -> [LNode CompareTaxon]+annotateTaxonsDifference treesNodes mergedtreeNodes = comparedNodes+ where comparedNodes = map (annotateTaxonDifference indexedTreesNodes) mergedtreeNodes+ indexedTreesNodes = zip [0..(length treesNodes)] treesNodes+++annotateTaxonDifference :: [(Int,[LNode SimpleTaxon])] -> LNode SimpleTaxon -> LNode CompareTaxon+annotateTaxonDifference indexedTreesNodes mergedtreeNode = comparedNode+ where comparedNode = (simpleTaxId (snd mergedtreeNode),CompareTaxon (simpleScientificName (snd mergedtreeNode)) (simpleRank (snd mergedtreeNode)) currentInTree)+ currentInTree = concatMap (\(i,treeNodes) -> [i | mergedtreeNode `elem` treeNodes]) indexedTreesNodes++-- | Extract a subtree corresponding to input node paths to root. Only nodes in level number distance to root are included. Used in Ids2Tree tool.+extractTaxonomySubTreebyLevel :: [Node] -> Gr SimpleTaxon Double -> Maybe Int -> Gr SimpleTaxon Double+extractTaxonomySubTreebyLevel inputNodes graph levelNumber = taxonomySubTree+ where paths = nub (concatMap (getPath (1 :: Node) graph) inputNodes)+ contexts = map (context graph) paths+ lnodes = map labNode' contexts+ ledges = nub (concatMap (out graph . fst) lnodes)+ unfilteredTaxonomySubTree = mkGraph lnodes ledges :: Gr SimpleTaxon Double+ filteredLNodes = filterNodesByLevel levelNumber lnodes unfilteredTaxonomySubTree+ filteredledges = nub (concatMap (out graph . fst) filteredLNodes)+ taxonomySubTree = mkGraph filteredLNodes filteredledges :: Gr SimpleTaxon Double++-- | Extract a subtree corresponding to input node paths to root. Only nodes in level number distance to root are included. Used in Ids2Tree tool.+extractTaxonomySubTreebyLevelNew :: [Node] -> Gr SimpleTaxon Double -> Maybe Int -> Gr SimpleTaxon Double+extractTaxonomySubTreebyLevelNew inputNodes graph levelNumber = taxonomySubTree+ where inputNodeVector = V.fromList inputNodes+ paths = V.concatMap (getVectorPath (1 :: Node) graph) inputNodeVector+ contexts = V.map (context graph) paths+ vlnodes = V.map labNode' contexts+ ledges = concatMap (out graph . fst) lnodes+ lnodes = V.toList vlnodes+ --ledges = V.toList vledges+ unfilteredTaxonomySubTree = mkGraph lnodes ledges :: Gr SimpleTaxon Double+ filteredLNodes = filterNodesByLevel levelNumber lnodes unfilteredTaxonomySubTree+ --filteredLNodesVector = V.fromList filteredLNodes+ filteredledges = concatMap (out graph . fst) filteredLNodes+ --filteredledges = V.toList filteredledgesVector+ taxonomySubTree = mkGraph filteredLNodes filteredledges :: Gr SimpleTaxon Double++-- | Extract a subtree corresponding to input node paths to root. If a Rank is provided, all node that are less or equal are omitted+extractTaxonomySubTreebyRank :: [Node] -> Gr SimpleTaxon Double -> Maybe Rank -> Gr SimpleTaxon Double+extractTaxonomySubTreebyRank inputNodes graph highestRank = taxonomySubTree+ where paths = nub (concatMap (getPath (1 :: Node) graph) inputNodes)+ contexts = map (context graph) paths+ lnodes = map labNode' contexts+ filteredLNodes = filterNodesByRank highestRank lnodes+ filteredledges = nub (concatMap (out graph . fst) filteredLNodes)+ taxonomySubTree = mkGraph filteredLNodes filteredledges :: Gr SimpleTaxon Double++getVectorPath :: Node -> Gr SimpleTaxon Double -> Node -> V.Vector Node+getVectorPath root graph node = maybe V.empty V.fromList (sp node root graph)++getPath :: Node -> Gr SimpleTaxon Double -> Node -> Path+getPath root graph node = maybe [] id (sp node root graph)++-- | Extract parent node with specified Rank+getParentbyRank :: Node -> Gr SimpleTaxon Double -> Maybe Rank -> Maybe (Node, SimpleTaxon)+getParentbyRank inputNode graph requestedRank = filteredLNode+ where path = maybe [] id (sp (inputNode :: Node) (1 :: Node) graph)+ nodeContext = map (context graph) path+ lnode = map labNode' nodeContext+ filteredLNode = findNodeByRank requestedRank lnode++-- | Filter nodes by distance from root+filterNodesByLevel :: Maybe Int -> [(Node, SimpleTaxon)] -> Gr SimpleTaxon Double -> [(Node, SimpleTaxon)]+filterNodesByLevel levelNumber inputNodes graph+ | isJust levelNumber = filteredNodes+ | otherwise = inputNodes+ --distances of all nodes to root+ where nodedistances = level (1::Node) (undir graph)+ sortedNodeDistances = sortBy sortByNodeID nodedistances+ sortedInputNodes = sortBy sortByNodeID inputNodes+ zippedNodeDistancesInputNodes = zip sortedNodeDistances sortedInputNodes+ zippedFilteredNodes = filter (\((_,distance),(_,_)) -> distance <= fromJust levelNumber) zippedNodeDistancesInputNodes+ filteredNodes = map snd zippedFilteredNodes++sortByNodeID :: (Node,a) -> (Node,a) -> Ordering+sortByNodeID (n1, _) (n2, _)+ | n1 < n2 = GT+ | n1 > n2 = LT+ | n1 == n2 = EQ+ | otherwise = EQ++-- | Find only taxons of a specific rank in a list of input taxons+findNodeByRank :: Maybe Rank -> [(t, SimpleTaxon)] -> Maybe (t, SimpleTaxon)+findNodeByRank requestedRank inputNodes+ | isJust requestedRank = filteredNodes+ | otherwise = Nothing+ where filteredNodes = find (\(_,t) -> simpleRank t == fromJust requestedRank) inputNodes++-- | Filter a list of input taxons for a minimal provided rank+filterNodesByRank :: Maybe Rank -> [(t, SimpleTaxon)] -> [(t, SimpleTaxon)]+filterNodesByRank highestRank inputNodes+ | isJust highestRank = filteredNodes+ | otherwise = inputNodes+ where filteredNodes = filter (\(_,t) -> simpleRank t >= fromJust highestRank) inputNodes ++ noRankNodes+ noRankNodes = filter (\(_,t) -> simpleRank t == Norank) inputNodes++-- | Returns path between 2 maybe nodes. Used in TreeDistance tool.+safeNodePath :: Maybe Node -> Gr SimpleTaxon Double -> Maybe Node -> Either String Path+safeNodePath nodeid1 graphOutput nodeid2+ | isJust nodeid1 && isJust nodeid2 = Right (maybe [] id (sp (fromJust nodeid1) (fromJust nodeid2) (undir graphOutput)))+ | otherwise = Left "Both taxonomy ids must be provided for distance computation"
+ Biobase/Taxonomy/Visualization.hs view
@@ -0,0 +1,100 @@+-- | Functions for visualization of taxonomy data.+module Biobase.Taxonomy.Visualization ( -- * Datatypes+ -- Datatypes used to represent taxonomy data+ module Biobase.Taxonomy.Types,+ -- * Visualization+ drawTaxonomyComparison,+ drawTaxonomy,+ writeTree,+ writeDotTree,+ writeJsonTree+ ) where+import Prelude+import Biobase.Taxonomy.Types+import Data.Graph.Inductive.Tree+import Data.Graph.Inductive.Basic+import qualified Data.GraphViz as GV+import qualified Data.GraphViz.Printing as GVP+import qualified Data.GraphViz.Attributes.Colors as GVAC+import qualified Data.GraphViz.Attributes.Complete as GVA+import qualified Data.ByteString.Lazy.Char8 as L+import qualified Data.Aeson as AE+import qualified Data.Text.Lazy as T++---------------------------------------+-- Visualisation functions++-- | Draw graph in dot format. Used in Ids2Tree tool.+drawTaxonomy :: Bool -> Gr SimpleTaxon Double -> String+drawTaxonomy withRank inputGraph = do+ let nodeFormating = if withRank then nodeFormatWithRank else nodeFormatWithoutRank+ let params = GV.nonClusteredParams {GV.isDirected = True+ , GV.globalAttributes = [GV.GraphAttrs [GVA.Size (GVA.GSize (20 :: Double) (Just (20 :: Double)) False)]]+ , GV.isDotCluster = const True+ --, GV.fmtNode = \ (_,l) -> [GV.textLabel (TL.pack (show (simpleRank l) ++ "\n" ++ T.unpack (simpleScientificName l)))]+ , GV.fmtNode = nodeFormating+ , GV.fmtEdge = const []+ }+ let dotFormat = GV.graphToDot params inputGraph+ let dottext = GVP.renderDot $ GVP.toDot dotFormat+ T.unpack dottext++nodeFormatWithRank :: (t, SimpleTaxon) -> [GVA.Attribute]+nodeFormatWithRank (_,l) = [GV.textLabel (T.concat [T.pack (show (simpleRank l)), T.pack ("\n") , simpleScientificName l])]++nodeFormatWithoutRank :: (t, SimpleTaxon) -> [GVA.Attribute]+nodeFormatWithoutRank (_,l) = [GV.textLabel (simpleScientificName l)]++-- | Draw tree comparison graph in dot format. Used in Ids2TreeCompare tool.+drawTaxonomyComparison :: Bool -> (Int,Gr CompareTaxon Double) -> String+drawTaxonomyComparison withRank (treeNumber,inputGraph) = do+ let cList = makeColorList treeNumber+ let nodeFormating = if withRank then (compareNodeFormatWithRank cList) else (compareNodeFormatWithoutRank cList)+ let params = GV.nonClusteredParams {GV.isDirected = True+ , GV.globalAttributes = []+ , GV.isDotCluster = const True+ --, GV.fmtNode = \ (_,l) -> [GV.textLabel (TL.pack (show (compareRank l) ++ "\n" ++ B.unpack (compareScientificName l))), GV.style GV.wedged, GVA.Color (selectColors (inTree l) cList)]+ , GV.fmtNode = nodeFormating+ , GV.fmtEdge = const []+ }+ let dotFormat = GV.graphToDot params (grev inputGraph)+ let dottext = GVP.renderDot $ GVP.toDot dotFormat+ T.unpack dottext++compareNodeFormatWithRank :: [GVA.Color] -> (t, CompareTaxon) -> [GVA.Attribute]+compareNodeFormatWithRank cList (_,l) = [GV.textLabel (T.concat [T.pack (show (compareRank l) ++ "\n"),compareScientificName l]), GV.style GV.wedged, GVA.Color (selectColors (inTree l) cList)]++compareNodeFormatWithoutRank :: [GVA.Color] -> (t, CompareTaxon) -> [GVA.Attribute]+compareNodeFormatWithoutRank cList (_,l) = [GV.textLabel (compareScientificName l), GV.style GV.wedged, GVA.Color (selectColors (inTree l) cList)]++-- | Colors from color list are selected according to in which of the compared trees the node is contained.+selectColors :: [Int] -> [GVA.Color] -> GVAC.ColorList+selectColors inTrees currentColorList = GVAC.toColorList (map (\i -> currentColorList !! i) inTrees)++-- | A color list is sampled from the spectrum according to how many trees are compared.+makeColorList :: Int -> [GVA.Color]+makeColorList treeNumber = cList+ where cList = map (\i -> GVAC.HSV ((fromIntegral i/fromIntegral neededColors) * 0.708) 0.5 1.0) [0..neededColors]+ neededColors = treeNumber - 1++-- | Write tree representation either as dot or json to provided file path+writeTree :: String -> String -> Bool -> Gr SimpleTaxon Double -> IO ()+writeTree requestedFormat outputDirectoryPath withRank inputGraph = do+ case requestedFormat of+ "dot" -> writeDotTree outputDirectoryPath withRank inputGraph+ "json"-> writeJsonTree outputDirectoryPath inputGraph+ _ -> writeDotTree outputDirectoryPath withRank inputGraph++-- | Write tree representation as dot to provided file path.+-- Graphviz tools like dot can be applied to the written .dot file to generate e.g. svg-format images.+writeDotTree :: String -> Bool -> Gr SimpleTaxon Double -> IO ()+writeDotTree outputDirectoryPath withRank inputGraph = do+ let diagram = drawTaxonomy withRank (grev inputGraph)+ writeFile (outputDirectoryPath ++ "taxonomy.dot") diagram++-- | Write tree representation as json to provided file path.+-- You can visualize the result for example with 3Djs.+writeJsonTree :: String -> Gr SimpleTaxon Double -> IO ()+writeJsonTree outputDirectoryPath inputGraph = do+ let jsonOutput = AE.encode (grev inputGraph)+ L.writeFile (outputDirectoryPath ++ "taxonomy.json") jsonOutput
+ ChangeLog.md view
@@ -0,0 +1,17 @@+-*-change-log-*-++2.0.0 [Florian Eggenhofer](mailto:egg@cs.uni-freiburg.de) 18. November 2019++ * Changed to Biobase repository layout+ * Added new Lineage datatype+ * Using bytestring instead of string++1.0.3 [Florian Eggenhofer](mailto:egg@cs.uni-freiburg.de) 10. August 2017++ * Compatibility with newest versions of fgl+ * Improved travis file++1.0.2 [Florian Eggenhofer](mailto:egg@cs.uni-freiburg.de) 23. October 2016++ * Changed datastructures for cutting the tree from list to vectors+ * Improved travis file
+ README.md view
@@ -0,0 +1,15 @@+Taxonomy [](https://hackage.haskell.org/package/Taxonomy) [](https://travis-ci.org/eggzilla/Taxonomy)+=============++Haskell cabal Taxonomy libary contains tools, parsers, datastructures and visualisation+for the NCBI (National Center for Biotechnology Information) Taxonomy datasources.++It can utilize information from the Entrez REST interface (via [EntrezHTTP](https://github.com/eggzilla/EntrezHTTP),+as well as from the files of the Taxonomy database dump.++Input data is parsed into a FGL based datastructure, which enables a wealth of processing+steps like node distances, retrieval of parent nodes or extraction of+subtrees.++Trees can be visualised via dot-format (graphviz) or+via json-format (d3js).
Taxonomy.cabal view
@@ -1,52 +1,53 @@ name: Taxonomy-version: 1.0.3+version: 2.0.0 synopsis: Libary for parsing, processing and vizualization of taxonomy data description: Haskell cabal Taxonomy libary contains tools, parsers, datastructures and visualisation for the NCBI (National Center for Biotechnology Information) Taxonomy datasources. . It can utilize information from the <http://www.ncbi.nlm.nih.gov/taxonomy Entrez> REST interface via <https://github.com/eggzilla/EntrezHTTP EntrezHTTP>,- as well as from the files of the Taxonomy database <ftp://ftp.ncbi.nih.gov/pub/taxonomy/ dump>.+ as well as from the files of the Taxonomy database <ftp://ftp.ncbi.nih.gov/pub/taxonomy/ dump>. . Input data is parsed into a FGL based datastructure, which enables a wealth of processing- steps like node distances, retrieval of parent nodes or extraction of- subtrees.+ steps like node distances, retrieval of parent nodes or extraction of+ subtrees. . Trees can be visualised via dot-format (<http://graphviz.org/ graphviz>) .- <<http://www.tbi.univie.ac.at/~egg/taxonomy.svg dot>> + <<http://www.tbi.univie.ac.at/~egg/taxonomy.svg dot>> . or via json-format (<http://d3js.org/d3js>).- .- The <https://hackage.haskell.org/package/TaxonomyTools TaxonomyTools> package contains tools based on this package.- + .+ The <https://hackage.haskell.org/package/TaxonomyTools TaxonomyTools> package contains tools based on this package.+ license: GPL-3 license-file: LICENSE author: Florian Eggenhofer-maintainer: florian.eggenhofer@univie.ac.at--- copyright: +maintainer: egg@informatik.uni-freiburg.de+-- copyright: category: Bioinformatics build-type: Simple-cabal-version: >=1.8-Tested-With: GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.1+cabal-version: >=1.10.0+Tested-With: GHC == 8.4.4, GHC == 8.6.5+Extra-Source-Files:+ README.md ChangeLog.md++ source-repository head type: git location: https://github.com/eggzilla/Taxonomy source-repository this type: git- location: https://github.com/eggzilla/Taxonomy/tree/v1.0.3- tag: v1.0.3+ location: https://github.com/eggzilla/Taxonomy/tree/v2.0.0+ tag: v2.0.0 -library- -- Modules exported by the library.- exposed-modules: Bio.TaxonomyData, Bio.Taxonomy - - -- compiler-options:+Library ghc-options: -Wall -fno-warn-unused-do-bind-- -- Other library packages from which modules are imported.+ default-language: Haskell2010 build-depends: base >=4.5 && <5, parsec, either-unwrap, fgl>=5.5.4.0, text, graphviz>=2999.12.0.4, bytestring, aeson, vector-- -- Directories containing source files.- hs-source-dirs: src- + Hs-source-dirs: .+ Exposed-modules: Biobase.Taxonomy.Types+ Biobase.Taxonomy.Import+ Biobase.Taxonomy.Visualization+ Biobase.Taxonomy.Utils+ Biobase.Taxonomy
− src/Bio/Taxonomy.hs
@@ -1,635 +0,0 @@--- | Functions for parsing, processing and visualization of taxonomy data.------ === Usage example:--- * Read in taxonomy data------ > eitherTaxtree <- readNamedTaxonomy "/path/to/NCBI_taxonomydump_directory"------ * Process data------ > let subtree = extractTaxonomySubTreebyLevel [562] (fromRight eitherTaxTree) (Just 4)------ * Visualize result------ tput "/path/to/dotdirectory" subtree-module Bio.Taxonomy ( -- * Datatypes- -- Datatypes used to represent taxonomy data- module Bio.TaxonomyData,- -- * Parsing- -- Functions prefixed with "read" read from filepaths, functions with parse from Haskell Strings. - readTaxonomy,- readNamedTaxonomy, - parseTaxonomy,- parseNCBITaxCitations,- readNCBITaxCitations,- parseNCBITaxDelNodes,- readNCBITaxDelNodes,- parseNCBITaxDivisions,- readNCBITaxDivisions,- parseNCBITaxGenCodes,- readNCBITaxGenCodes,- parseNCBITaxMergedNodes,- readNCBITaxMergedNodes,- parseNCBITaxNames,- readNCBITaxNames,- parseNCBITaxNodes,- readNCBITaxNodes,- parseNCBISimpleTaxons,- readNCBISimpleTaxons,- readNCBITaxonomyDatabase,- -- * Processing- compareSubTrees, - extractTaxonomySubTreebyLevel,- extractTaxonomySubTreebyLevelNew, - extractTaxonomySubTreebyRank,- safeNodePath,- getParentbyRank,- -- * Visualization- drawTaxonomyComparison,- drawTaxonomy,- writeTree,- writeDotTree,- writeJsonTree- ) where-import Prelude -import System.IO -import Bio.TaxonomyData-import Text.Parsec.Prim (runP)-import Text.ParserCombinators.Parsec-import Control.Monad-import Data.List-import qualified Data.Vector as V-import Data.Maybe -import qualified Data.Either.Unwrap as E-import Data.Graph.Inductive.Graph-import Data.Graph.Inductive.Query.SP (sp)-import Data.Graph.Inductive.Query.BFS (level)-import Data.Graph.Inductive.Tree-import Data.Graph.Inductive.Basic-import qualified Data.GraphViz as GV-import qualified Data.GraphViz.Printing as GVP-import qualified Data.GraphViz.Attributes.Colors as GVAC-import qualified Data.GraphViz.Attributes.Complete as GVA-import qualified Data.ByteString.Lazy.Char8 as L-import qualified Data.Aeson as AE-import qualified Data.Text.Lazy as T----------------------------------------------------------------------------------------------------- Parsing functions---- | NCBI taxonomy dump nodes and names in the input directory path are parsed and a SimpleTaxon tree with scientific names for each node is generated. -readNamedTaxonomy :: String -> IO (Either ParseError (Gr SimpleTaxon Double)) -readNamedTaxonomy directoryPath = do- nodeNames <- readNCBITaxNames (directoryPath ++ "names.dmp")- if E.isLeft nodeNames- then return (Left (E.fromLeft nodeNames))- else do- let rightNodeNames = V.fromList (E.fromRight nodeNames)- let filteredNodeNames = V.filter isScientificName rightNodeNames- parseFromFileEncISO88591 (genParserNamedTaxonomyGraph filteredNodeNames) (directoryPath ++ "nodes.dmp")--isScientificName :: TaxName -> Bool-isScientificName name = nameClass name == scientificNameT- where scientificNameT = T.pack "scientific name"---- | NCBI taxonomy dump nodes and names in the input directory path are parsed and a SimpleTaxon tree is generated. -readTaxonomy :: String -> IO (Either ParseError (Gr SimpleTaxon Double)) -readTaxonomy = parseFromFileEncISO88591 genParserTaxonomyGraph ---- | NCBI taxonomy dump nodes and names in the input directory path are parsed and a SimpleTaxon tree is generated.-parseTaxonomy :: String -> Either ParseError (Gr SimpleTaxon Double)-parseTaxonomy = parse genParserTaxonomyGraph "parseTaxonomy"--genParserTaxonomyGraph :: GenParser Char st (Gr SimpleTaxon Double)-genParserTaxonomyGraph = do- nodesEdges <- many1 (try genParserGraphNodeEdge)- optional eof- let (nodesList,edgesList) = unzip nodesEdges- --let taxedges = filter (\(a,b,_) -> a /= b) edgesList- let taxedges = filter notLoopEdge edgesList- --let taxnodes = concat nodesList- --return (mkGraph taxnodes taxedges)- return $! mkGraph nodesList taxedges-- -notLoopEdge :: (Int,Int,a) -> Bool-notLoopEdge (a,b,_) = a /= b- -genParserNamedTaxonomyGraph :: V.Vector TaxName -> GenParser Char st (Gr SimpleTaxon Double)-genParserNamedTaxonomyGraph filteredNodeNames = do- nodesEdges <- (many1 (try genParserGraphNodeEdge))- optional eof- let (nodesList,edgesList) = V.unzip (V.fromList nodesEdges)- let taxedges = V.filter notLoopEdge edgesList- let taxnamednodes = V.map (setNodeScientificName filteredNodeNames) nodesList- return $! mkGraph (V.toList taxnamednodes) (V.toList taxedges)--setNodeScientificName :: V.Vector TaxName -> (t, SimpleTaxon) -> (t, SimpleTaxon)-setNodeScientificName inputTaxNames (inputNode,inputTaxon) = outputNode- where maybeRetrievedName = V.find (isTaxNameIdSimpleTaxid inputTaxon) inputTaxNames- retrievedName = maybe (T.pack "no name") nameTxt maybeRetrievedName- outputNode = (inputNode,inputTaxon{simpleScientificName = retrievedName})--isTaxNameIdSimpleTaxid :: SimpleTaxon -> TaxName -> Bool-isTaxNameIdSimpleTaxid inputTaxon inputTaxName = nameTaxId inputTaxName == simpleTaxId inputTaxon-- -genParserGraphNodeEdge :: GenParser Char st ((Int,SimpleTaxon),(Int,Int,Double))-genParserGraphNodeEdge = do- _simpleTaxId <- many1 digit- string "\t|\t"- _simpleParentTaxId <- many1 digit- string "\t|\t"- _simpleRank <- many1 (noneOf "\t")- many1 (noneOf "\n")- char '\n'- let _simpleTaxIdInt = readInt _simpleTaxId- let _simpleParentTaxIdInt = readInt _simpleParentTaxId- return ((_simpleTaxIdInt,SimpleTaxon _simpleTaxIdInt T.empty _simpleParentTaxIdInt (readRank _simpleRank)),(_simpleTaxIdInt,_simpleParentTaxIdInt,1 :: Double))- --- | parse NCBITaxCitations from input string-parseNCBITaxCitations :: String -> Either ParseError [TaxCitation]-parseNCBITaxCitations = parse genParserNCBITaxCitations "parseTaxCitations"---- | parse NCBITaxCitations from input filePath -readNCBITaxCitations :: String -> IO (Either ParseError [TaxCitation]) -readNCBITaxCitations = parseFromFileEncISO88591 genParserNCBITaxCitations---- | parse NCBITaxDelNodes from input string-parseNCBITaxDelNodes :: String -> Either ParseError [TaxDelNode]-parseNCBITaxDelNodes = parse genParserNCBITaxDelNodes "parseTaxDelNodes"---- | parse NCBITaxDelNodes from input filePath -readNCBITaxDelNodes :: String -> IO (Either ParseError [TaxDelNode]) -readNCBITaxDelNodes = parseFromFile genParserNCBITaxDelNodes---- | parse NCBITaxDivisons from input string-parseNCBITaxDivisions :: String -> Either ParseError [TaxDivision]-parseNCBITaxDivisions = parse genParserNCBITaxDivisons "parseTaxDivisons"---- | parse NCBITaxDivisons from input filePath -readNCBITaxDivisions :: String -> IO (Either ParseError [TaxDivision]) -readNCBITaxDivisions = parseFromFile genParserNCBITaxDivisons---- | parse NCBITaxGenCodes from input string-parseNCBITaxGenCodes :: String -> Either ParseError [TaxGenCode]-parseNCBITaxGenCodes = parse genParserNCBITaxGenCodes "parseTaxGenCodes"---- | parse NCBITaxGenCodes from input filePath -readNCBITaxGenCodes :: String -> IO (Either ParseError [TaxGenCode]) -readNCBITaxGenCodes = parseFromFile genParserNCBITaxGenCodes---- | parse NCBITaxMergedNodes from input string-parseNCBITaxMergedNodes :: String -> Either ParseError [TaxMergedNode]-parseNCBITaxMergedNodes = parse genParserNCBITaxMergedNodes "parseTaxMergedNodes"---- | parse NCBITaxMergedNodes from input filePath -readNCBITaxMergedNodes :: String -> IO (Either ParseError [TaxMergedNode]) -readNCBITaxMergedNodes = parseFromFile genParserNCBITaxMergedNodes---- | parse NCBITaxNames from input string-parseNCBITaxNames :: String -> Either ParseError [TaxName]-parseNCBITaxNames = parse genParserNCBITaxNames "parseTaxNames"---- | parse NCBITaxNames from input filePath -readNCBITaxNames :: String -> IO (Either ParseError [TaxName]) -readNCBITaxNames = parseFromFile genParserNCBITaxNames---- | parse NCBITaxNames from input string-parseNCBITaxNodes :: String -> Either ParseError TaxNode-parseNCBITaxNodes = parse genParserNCBITaxNode "parseTaxNode"---- | parse NCBITaxCitations from input filePath -readNCBITaxNodes :: String -> IO (Either ParseError [TaxNode]) -readNCBITaxNodes = parseFromFile genParserNCBITaxNodes ---- | parse NCBISimpleTaxNames from input string-parseNCBISimpleTaxons :: String -> Either ParseError SimpleTaxon-parseNCBISimpleTaxons = parse genParserNCBISimpleTaxon "parseSimpleTaxon" ---- | parse NCBITaxCitations from input filePath -readNCBISimpleTaxons :: String -> IO (Either ParseError [SimpleTaxon]) -readNCBISimpleTaxons = parseFromFile genParserNCBISimpleTaxons---- | Parse the input as NCBITax datatype-readNCBITaxonomyDatabase :: String -> IO (Either [String] NCBITaxDump)-readNCBITaxonomyDatabase folder = do- citations <- readNCBITaxCitations (folder ++ "citations.dmp")- let citationsError = extractParseError citations- taxdelNodes <- readNCBITaxDelNodes (folder ++ "delnodes.dmp")- let delNodesError = extractParseError taxdelNodes- divisons <- readNCBITaxDivisions (folder ++ "division.dmp")- let divisonsError = extractParseError divisons- genCodes <- readNCBITaxGenCodes (folder ++ "gencode.dmp")- let genCodesError = extractParseError genCodes- mergedNodes <- readNCBITaxMergedNodes (folder ++ "merged.dmp")- let mergedNodesError = extractParseError mergedNodes- names <- readNCBITaxNames (folder ++ "names.dmp")- let namesError = extractParseError names- taxnodes <- readNCBITaxNodes (folder ++ "nodes.dmp") - let nodesError = extractParseError taxnodes- let parseErrors = [citationsError, delNodesError, divisonsError, genCodesError, mergedNodesError, namesError, nodesError]- return (checkParsing parseErrors citations taxdelNodes divisons genCodes mergedNodes names taxnodes)--genParserNCBITaxCitations :: GenParser Char st [TaxCitation]-genParserNCBITaxCitations = many1 genParserNCBITaxCitation--genParserNCBITaxDelNodes :: GenParser Char st [TaxDelNode]-genParserNCBITaxDelNodes = many1 genParserNCBITaxDelNode- -genParserNCBITaxDivisons :: GenParser Char st [TaxDivision]-genParserNCBITaxDivisons = many1 genParserNCBITaxDivision--genParserNCBITaxGenCodes :: GenParser Char st [TaxGenCode]-genParserNCBITaxGenCodes = many1 genParserNCBITaxGenCode---genParserNCBITaxMergedNodes :: GenParser Char st [TaxMergedNode]-genParserNCBITaxMergedNodes = many1 genParserNCBITaxMergedNode---genParserNCBITaxNames :: GenParser Char st [TaxName]-genParserNCBITaxNames = many1 genParserNCBITaxName--genParserNCBITaxNodes :: GenParser Char st [TaxNode]-genParserNCBITaxNodes = many1 genParserNCBITaxNode--genParserNCBISimpleTaxons :: GenParser Char st [SimpleTaxon]-genParserNCBISimpleTaxons = many1 genParserNCBISimpleTaxon- --genParserNCBITaxCitation :: GenParser Char st TaxCitation-genParserNCBITaxCitation = do- _citId <- many1 digit- string "\t|\t"- _citKey <- optionMaybe (many1 (noneOf "\t"))- string "\t|\t"- _pubmedId <- optionMaybe (many1 digit)- string "\t|\t"- _medlineId <- optionMaybe (many1 digit)- tab- char '|' - _url <- genParserTaxURL- char '|'- tab- _text <- optionMaybe (many1 (noneOf "\t"))- string "\t|\t"- _taxIdList <- optionMaybe (many1 genParserTaxIdList)- string "\t|\n"- return $ TaxCitation (readInt _citId) _citKey (liftM readInt _pubmedId) (liftM readInt _medlineId) _url _text _taxIdList--genParserNCBITaxDelNode :: GenParser Char st TaxDelNode-genParserNCBITaxDelNode = do- taxdelNode <- many1 digit- space- char '|'- char '\n'- return $ TaxDelNode (readInt taxdelNode)- -genParserNCBITaxDivision :: GenParser Char st TaxDivision-genParserNCBITaxDivision = do- _divisionId <- many1 digit- string "\t|\t"- _divisionCDE <- many1 upper- string "\t|\t"- _divisionName <- many1 (noneOf "\t")- string "\t|\t"- _comments <- optionMaybe (many1 (noneOf "\t"))- string "\t|\n"- return $ TaxDivision (readInt _divisionId) _divisionCDE _divisionName _comments --genParserNCBITaxGenCode :: GenParser Char st TaxGenCode-genParserNCBITaxGenCode = do- _geneticCodeId <- many1 digit - string "\t|\t"- _abbreviation <- optionMaybe (many1 (noneOf "\t"))- string "\t|\t"- _genCodeName <- many1 (noneOf "\t")- string "\t|\t"- _cde <- many1 (noneOf "\t")- string "\t|\t"- _starts <- many1 (noneOf "\t")- string "\t|\n"- return $ TaxGenCode (readInt _geneticCodeId) _abbreviation _genCodeName _cde _starts--genParserNCBITaxMergedNode :: GenParser Char st TaxMergedNode-genParserNCBITaxMergedNode = do- _oldTaxId <- many1 digit- string "\t|\t"- _newTaxId <- many1 digit- string "\t|\n"- return $ TaxMergedNode (readInt _oldTaxId) (readInt _newTaxId)--genParserNCBITaxName :: GenParser Char st TaxName-genParserNCBITaxName = do- _taxId <- many1 digit- string "\t|\t"- _nameTxt <- many1 (noneOf "\t\n")- string "\t|\t"- _uniqueName <- optionMaybe (many1 (noneOf "\t\n"))- string "\t|\t"- _nameClass <- many1 (noneOf "\t\n")- tab- char '|'- newline- return $! TaxName (readInt _taxId) (T.pack _nameTxt) (maybe T.empty T.pack _uniqueName) (T.pack _nameClass)--genParserNCBISimpleTaxon :: GenParser Char st SimpleTaxon-genParserNCBISimpleTaxon = do- _simpleTaxId <- many1 digit- string "\t|\t"- _simpleParentTaxId <- many1 digit- string "\t|\t"- _simpleRank <- many1 (noneOf "\t")- many1 (noneOf "\n")- char '\n'- return $! SimpleTaxon (readInt _simpleTaxId) T.empty (readInt _simpleParentTaxId) (readRank _simpleRank) --genParserNCBITaxNode :: GenParser Char st TaxNode-genParserNCBITaxNode = do- _taxId <- many1 digit- string "\t|\t"- _parentTaxId <- many1 digit- string "\t|\t"- _rank <- many1 (noneOf "\t")- string "\t|\t"- _emblCode <- optionMaybe (many1 (noneOf "\t"))- string "\t|\t"- _divisionId <- many1 digit- string "\t|\t"- _inheritedDivFlag <- many1 digit- string "\t|\t"- _geneticCodeId <- many1 digit- string "\t|\t"- _inheritedGCFlag <- many1 digit- string "\t|\t"- _mitochondrialGeneticCodeId <- many1 digit- string "\t|\t"- _inheritedMGCFlag <- many1 digit- string "\t|\t"- _genBankHiddenFlag <- many1 digit- string "\t|\t"- _hiddenSubtreeRootFlag <- many1 digit - string "\t|\t"- _comments <- optionMaybe (many1 (noneOf "\t"))- tab- char '|'- char '\n'- return $ TaxNode (readInt _taxId) (readInt _parentTaxId) (readRank _rank) _emblCode _divisionId (readBool _inheritedDivFlag) _geneticCodeId (readBool _inheritedGCFlag) _mitochondrialGeneticCodeId (readBool _inheritedMGCFlag) (readBool _genBankHiddenFlag) (readBool _hiddenSubtreeRootFlag) _comments-------------------------------------------- Processing functions---- | Extract a subtree correpsonding to input node paths to root. Only nodes in level number distance to root are included. Used in Ids2TreeCompare tool.-compareSubTrees :: [Gr SimpleTaxon Double] -> (Int,Gr CompareTaxon Double)-compareSubTrees graphs = (length graphs,resultGraph)- where treesLabNodes = map labNodes graphs- treesLabEdges = map labEdges graphs- mergedNodes = nub (concat treesLabNodes)- mergedEdges = nub (concat treesLabEdges)- --annotate node in which of the compared trees they are present- comparedNodes = annotateTaxonsDifference treesLabNodes mergedNodes- resultGraph = mkGraph comparedNodes mergedEdges :: Gr CompareTaxon Double--annotateTaxonsDifference :: [[LNode SimpleTaxon]] -> [LNode SimpleTaxon] -> [LNode CompareTaxon]-annotateTaxonsDifference treesNodes mergedtreeNodes = comparedNodes- where comparedNodes = map (annotateTaxonDifference indexedTreesNodes) mergedtreeNodes- indexedTreesNodes = zip [0..(length treesNodes)] treesNodes- --annotateTaxonDifference :: [(Int,[LNode SimpleTaxon])] -> LNode SimpleTaxon -> LNode CompareTaxon-annotateTaxonDifference indexedTreesNodes mergedtreeNode = comparedNode- where comparedNode = (simpleTaxId (snd mergedtreeNode),CompareTaxon (simpleScientificName (snd mergedtreeNode)) (simpleRank (snd mergedtreeNode)) currentInTree)- currentInTree = concatMap (\(i,treeNodes) -> [i | mergedtreeNode `elem` treeNodes]) indexedTreesNodes- --- | Extract a subtree corresponding to input node paths to root. Only nodes in level number distance to root are included. Used in Ids2Tree tool.-extractTaxonomySubTreebyLevel :: [Node] -> Gr SimpleTaxon Double -> Maybe Int -> Gr SimpleTaxon Double-extractTaxonomySubTreebyLevel inputNodes graph levelNumber = taxonomySubTree- where paths = nub (concatMap (getPath (1 :: Node) graph) inputNodes)- contexts = map (context graph) paths- lnodes = map labNode' contexts- ledges = nub (concatMap (out graph . fst) lnodes)- unfilteredTaxonomySubTree = mkGraph lnodes ledges :: Gr SimpleTaxon Double- filteredLNodes = filterNodesByLevel levelNumber lnodes unfilteredTaxonomySubTree- filteredledges = nub (concatMap (out graph . fst) filteredLNodes)- taxonomySubTree = mkGraph filteredLNodes filteredledges :: Gr SimpleTaxon Double ---- | Extract a subtree corresponding to input node paths to root. Only nodes in level number distance to root are included. Used in Ids2Tree tool.-extractTaxonomySubTreebyLevelNew :: [Node] -> Gr SimpleTaxon Double -> Maybe Int -> Gr SimpleTaxon Double-extractTaxonomySubTreebyLevelNew inputNodes graph levelNumber = taxonomySubTree- where inputNodeVector = V.fromList inputNodes- paths = V.concatMap (getVectorPath (1 :: Node) graph) inputNodeVector- contexts = V.map (context graph) paths- vlnodes = V.map labNode' contexts- ledges = concatMap (out graph . fst) lnodes- lnodes = V.toList vlnodes- --ledges = V.toList vledges- unfilteredTaxonomySubTree = mkGraph lnodes ledges :: Gr SimpleTaxon Double- filteredLNodes = filterNodesByLevel levelNumber lnodes unfilteredTaxonomySubTree- --filteredLNodesVector = V.fromList filteredLNodes- filteredledges = concatMap (out graph . fst) filteredLNodes- --filteredledges = V.toList filteredledgesVector- taxonomySubTree = mkGraph filteredLNodes filteredledges :: Gr SimpleTaxon Double - --- | Extract a subtree corresponding to input node paths to root. If a Rank is provided, all node that are less or equal are omitted-extractTaxonomySubTreebyRank :: [Node] -> Gr SimpleTaxon Double -> Maybe Rank -> Gr SimpleTaxon Double-extractTaxonomySubTreebyRank inputNodes graph highestRank = taxonomySubTree- where paths = nub (concatMap (getPath (1 :: Node) graph) inputNodes)- contexts = map (context graph) paths- lnodes = map labNode' contexts- filteredLNodes = filterNodesByRank highestRank lnodes- filteredledges = nub (concatMap (out graph . fst) filteredLNodes)- taxonomySubTree = mkGraph filteredLNodes filteredledges :: Gr SimpleTaxon Double--getVectorPath :: Node -> Gr SimpleTaxon Double -> Node -> V.Vector Node-getVectorPath root graph node = maybe V.empty V.fromList (sp node root graph)--getPath :: Node -> Gr SimpleTaxon Double -> Node -> Path-getPath root graph node = maybe [] id (sp node root graph)- --- | Extract parent node with specified Rank-getParentbyRank :: Node -> Gr SimpleTaxon Double -> Maybe Rank -> Maybe (Node, SimpleTaxon)-getParentbyRank inputNode graph requestedRank = filteredLNode- where path = maybe [] id (sp (inputNode :: Node) (1 :: Node) graph)- nodeContext = map (context graph) path- lnode = map labNode' nodeContext- filteredLNode = findNodeByRank requestedRank lnode---- | Filter nodes by distance from root -filterNodesByLevel :: Maybe Int -> [(Node, SimpleTaxon)] -> Gr SimpleTaxon Double -> [(Node, SimpleTaxon)]-filterNodesByLevel levelNumber inputNodes graph- | isJust levelNumber = filteredNodes- | otherwise = inputNodes- --distances of all nodes to root- where nodedistances = level (1::Node) (undir graph)- sortedNodeDistances = sortBy sortByNodeID nodedistances- sortedInputNodes = sortBy sortByNodeID inputNodes- zippedNodeDistancesInputNodes = zip sortedNodeDistances sortedInputNodes- zippedFilteredNodes = filter (\((_,distance),(_,_)) -> distance <= fromJust levelNumber) zippedNodeDistancesInputNodes- filteredNodes = map snd zippedFilteredNodes--sortByNodeID :: (Node,a) -> (Node,a) -> Ordering-sortByNodeID (n1, _) (n2, _)- | n1 < n2 = GT- | n1 > n2 = LT- | n1 == n2 = EQ- | otherwise = EQ---- | Find only taxons of a specific rank in a list of input taxons -findNodeByRank :: Maybe Rank -> [(t, SimpleTaxon)] -> Maybe (t, SimpleTaxon)-findNodeByRank requestedRank inputNodes- | isJust requestedRank = filteredNodes- | otherwise = Nothing- where filteredNodes = find (\(_,t) -> simpleRank t == fromJust requestedRank) inputNodes---- | Filter a list of input taxons for a minimal provided rank-filterNodesByRank :: Maybe Rank -> [(t, SimpleTaxon)] -> [(t, SimpleTaxon)]-filterNodesByRank highestRank inputNodes- | isJust highestRank = filteredNodes- | otherwise = inputNodes- where filteredNodes = filter (\(_,t) -> simpleRank t >= fromJust highestRank) inputNodes ++ noRankNodes- noRankNodes = filter (\(_,t) -> simpleRank t == Norank) inputNodes---- | Returns path between 2 maybe nodes. Used in TreeDistance tool.-safeNodePath :: Maybe Node -> Gr SimpleTaxon Double -> Maybe Node -> Either String Path-safeNodePath nodeid1 graphOutput nodeid2- | isJust nodeid1 && isJust nodeid2 = Right (maybe [] id (sp (fromJust nodeid1) (fromJust nodeid2) (undir graphOutput)))- | otherwise = Left "Both taxonomy ids must be provided for distance computation"-------------------------------------------- Visualisation functions---- | Draw graph in dot format. Used in Ids2Tree tool.-drawTaxonomy :: Bool -> Gr SimpleTaxon Double -> String-drawTaxonomy withRank inputGraph = do- let nodeFormating = if withRank then nodeFormatWithRank else nodeFormatWithoutRank- let params = GV.nonClusteredParams {GV.isDirected = True- , GV.globalAttributes = [GV.GraphAttrs [GVA.Size (GVA.GSize (20 :: Double) (Just (20 :: Double)) False)]]- , GV.isDotCluster = const True- --, GV.fmtNode = \ (_,l) -> [GV.textLabel (TL.pack (show (simpleRank l) ++ "\n" ++ T.unpack (simpleScientificName l)))]- , GV.fmtNode = nodeFormating- , GV.fmtEdge = const []- }- let dotFormat = GV.graphToDot params inputGraph- let dottext = GVP.renderDot $ GVP.toDot dotFormat- T.unpack dottext--nodeFormatWithRank :: (t, SimpleTaxon) -> [GVA.Attribute]-nodeFormatWithRank (_,l) = [GV.textLabel (T.concat [T.pack (show (simpleRank l)), T.pack ("\n") , simpleScientificName l])]--nodeFormatWithoutRank :: (t, SimpleTaxon) -> [GVA.Attribute]-nodeFormatWithoutRank (_,l) = [GV.textLabel (simpleScientificName l)]- --- | Draw tree comparison graph in dot format. Used in Ids2TreeCompare tool.-drawTaxonomyComparison :: Bool -> (Int,Gr CompareTaxon Double) -> String-drawTaxonomyComparison withRank (treeNumber,inputGraph) = do- let cList = makeColorList treeNumber- let nodeFormating = if withRank then (compareNodeFormatWithRank cList) else (compareNodeFormatWithoutRank cList)- let params = GV.nonClusteredParams {GV.isDirected = True- , GV.globalAttributes = []- , GV.isDotCluster = const True- --, GV.fmtNode = \ (_,l) -> [GV.textLabel (TL.pack (show (compareRank l) ++ "\n" ++ B.unpack (compareScientificName l))), GV.style GV.wedged, GVA.Color (selectColors (inTree l) cList)]- , GV.fmtNode = nodeFormating- , GV.fmtEdge = const []- }- let dotFormat = GV.graphToDot params (grev inputGraph)- let dottext = GVP.renderDot $ GVP.toDot dotFormat- T.unpack dottext--compareNodeFormatWithRank :: [GVA.Color] -> (t, CompareTaxon) -> [GVA.Attribute]-compareNodeFormatWithRank cList (_,l) = [GV.textLabel (T.concat [T.pack (show (compareRank l) ++ "\n"),compareScientificName l]), GV.style GV.wedged, GVA.Color (selectColors (inTree l) cList)]--compareNodeFormatWithoutRank :: [GVA.Color] -> (t, CompareTaxon) -> [GVA.Attribute]-compareNodeFormatWithoutRank cList (_,l) = [GV.textLabel (compareScientificName l), GV.style GV.wedged, GVA.Color (selectColors (inTree l) cList)]- --- | Colors from color list are selected according to in which of the compared trees the node is contained.-selectColors :: [Int] -> [GVA.Color] -> GVAC.ColorList-selectColors inTrees currentColorList = GVAC.toColorList (map (\i -> currentColorList !! i) inTrees)---- | A color list is sampled from the spectrum according to how many trees are compared.-makeColorList :: Int -> [GVA.Color]-makeColorList treeNumber = cList- where cList = map (\i -> GVAC.HSV ((fromIntegral i/fromIntegral neededColors) * 0.708) 0.5 1.0) [0..neededColors]- neededColors = treeNumber - 1---- | Write tree representation either as dot or json to provided file path-writeTree :: String -> String -> Bool -> Gr SimpleTaxon Double -> IO ()-writeTree requestedFormat outputDirectoryPath withRank inputGraph = do- case requestedFormat of- "dot" -> writeDotTree outputDirectoryPath withRank inputGraph- "json"-> writeJsonTree outputDirectoryPath inputGraph- _ -> writeDotTree outputDirectoryPath withRank inputGraph ---- | Write tree representation as dot to provided file path.--- Graphviz tools like dot can be applied to the written .dot file to generate e.g. svg-format images.-writeDotTree :: String -> Bool -> Gr SimpleTaxon Double -> IO ()-writeDotTree outputDirectoryPath withRank inputGraph = do- let diagram = drawTaxonomy withRank (grev inputGraph)- writeFile (outputDirectoryPath ++ "taxonomy.dot") diagram---- | Write tree representation as json to provided file path.--- You can visualize the result for example with 3Djs.-writeJsonTree :: String -> Gr SimpleTaxon Double -> IO ()-writeJsonTree outputDirectoryPath inputGraph = do- let jsonOutput = AE.encode (grev inputGraph)- L.writeFile (outputDirectoryPath ++ "taxonomy.json") jsonOutput-------------------------------------------- Auxiliary functions-readInt :: String -> Int-readInt = read--readBool :: String -> Bool-readBool "0" = False-readBool "1" = True-readBool _ = False --readRank :: String -> Rank-readRank a = read a :: Rank--genParserTaxIdList :: GenParser Char st Int-genParserTaxIdList = do- optional (char ' ')- _taxId <- many1 digit- optional (char ' ')- return (readInt _taxId)--genParserTaxURL :: GenParser Char st (Maybe String)-genParserTaxURL = do- tab - url1 <- optionMaybe (many1 (noneOf "\t"))- tab- url2 <- optionMaybe (many1 (noneOf "|"))- return (concatenateURLParts url1 url2)--concatenateURLParts :: Maybe String -> Maybe String -> Maybe String-concatenateURLParts url1 url2 - | isJust url1 && isJust url2 = maybeStringConcat url1 url2- | isJust url1 && isNothing url2 = url1- | otherwise = Nothing --maybeStringConcat :: Maybe String -> Maybe String -> Maybe String-maybeStringConcat = liftM2 (++)--readEncodedFile :: TextEncoding -> FilePath -> IO String -readEncodedFile encoding name = do - handle <- openFile name ReadMode- hSetEncoding handle encoding- hGetContents handle--parseFromFileEncISO88591 :: Parser a -> String -> IO (Either ParseError a)-parseFromFileEncISO88591 parser fname = do - input <- readEncodedFile latin1 fname- return (runP parser () fname input)---- | check a list of parsing results for presence of Left aka Parse error-checkParsing :: [String] -> Either ParseError [TaxCitation] -> Either ParseError [TaxDelNode] -> Either ParseError [TaxDivision] -> Either ParseError [TaxGenCode] -> Either ParseError [TaxMergedNode] -> Either ParseError [TaxName] -> Either ParseError [TaxNode]-> Either [String] NCBITaxDump-checkParsing parseErrors citations taxdelNodes divisons genCodes mergedNodes names taxnodes- | join parseErrors == "" = Right (NCBITaxDump (E.fromRight citations) (E.fromRight taxdelNodes) (E.fromRight divisons) (E.fromRight genCodes) (E.fromRight mergedNodes) (E.fromRight names) (E.fromRight taxnodes))- | otherwise = Left parseErrors--extractParseError :: Either ParseError a -> String-extractParseError _parse- | E.isLeft _parse = show (E.fromLeft _parse)- | otherwise = ""
− src/Bio/TaxonomyData.hs
@@ -1,292 +0,0 @@--- | This module contains data structures for--- taxonomy data--{-# LANGUAGE FlexibleInstances #-}--module Bio.TaxonomyData where-import Prelude---import qualified Data.ByteString as B-import qualified Data.Aeson as A-import qualified Data.Vector as V---import Data.Graph.Inductive-import Data.Graph.Inductive.Graph-import Data.Graph.Inductive.Tree-import qualified Data.Text as T-import qualified Data.Text.Lazy as TL ---import qualified Data.Text.Encoding---- | SimpleTaxon only contains the most relevant fields of a taxonomy entry.--- For all annotaded fields use the Taxon datatype and its associated functions-data SimpleTaxon = SimpleTaxon- {- -- node id in GenBank- simpleTaxId :: Int,- simpleScientificName :: TL.Text,- -- parent node id in GenBank taxonomy database - simpleParentTaxId :: Int,- -- rank of this node (superkingdom, kingdom, ...) - simpleRank :: Rank- }- deriving (Show, Read, Eq)---- | Datastructure for tree comparisons-data CompareTaxon = CompareTaxon- {- compareScientificName :: TL.Text,- compareRank :: Rank,- -- number indicating in which trees, - inTree :: [Int]- }- deriving (Show, Read, Eq)---- | Data structure for Entrez taxonomy fetch result-data Taxon = Taxon- { taxonTaxId :: Int- , taxonScientificName :: String- , taxonParentTaxId :: Int- , taxonRank :: Rank- , division :: String- , geneticCode :: TaxGenCode- , mitoGeneticCode :: TaxGenCode- , lineage :: String- , lineageEx :: [LineageTaxon]- , createDate :: String- , updateDate :: String- , pubDate :: String- } deriving (Show, Eq)---data TaxonName = TaxonName- { classCDE :: String- , dispName :: String- } deriving (Show, Eq)---- | Lineage Taxons denote all parent Taxonomy nodes of a node retrieved by Entrez fetch-data LineageTaxon = LineageTaxon- { lineageTaxId :: Int- , lineageScienticName :: String- , lineageRank :: Rank}- deriving (Show, Eq)- --- | NCBI Taxonomy database dump hierachichal data structure--- as defined in ftp://ftp.ncbi.nih.gov/pub/taxonomy/taxdump_readme.txt-data NCBITaxDump = NCBITaxDump- {- taxCitations :: [TaxCitation],- taxDelNodes :: [TaxDelNode],- taxDivisions :: [TaxDivision],- taxGenCodes :: [TaxGenCode],- taxMergedNodes :: [TaxMergedNode],- taxNames :: [TaxName],- taxNodes :: [TaxNode]- }- deriving (Show, Read, Eq)---- | Datastructure for entries of Taxonomy database dump citations file-data TaxCitation = TaxCitation- {- -- the unique id of citation- citId :: Int,- -- citation key- citKey :: Maybe String,- -- unique id in PubMed database (0 if not in PubMed)- pubmedId :: Maybe Int,- -- unique id in MedLine database (0 if not in MedLine)- medlineId :: Maybe Int,- -- URL associated with citation- url :: Maybe String,- -- any text (usually article name and authors)- -- The following characters are escaped in this text by a backslash:- -- newline (appear as "\n"),- -- tab character ("\t"),- -- double quotes ('\"'),- -- backslash character ("\\").- text :: Maybe String,- -- list of node ids separated by a single space- taxIdList :: Maybe [Int]- }- deriving (Show, Read, Eq)---- | Datastructure for entries of Taxonomy database dump deleted nodes file-data TaxDelNode = TaxDelNode- {- -- deleted node id- delTaxId :: Int- }- deriving (Show, Read, Eq)---- | Datastructure for entries of Taxonomy database dump division file-data TaxDivision = TaxDivision- {- -- taxonomy database division id- divisionId :: Int,- -- GenBank division code (three characters)- divisionCDE :: String,- -- e.g. BCT, PLN, VRT, MAM, PRI...- divisonName :: String,- divisionComments :: Maybe String- }- deriving (Show, Read, Eq)---- | Datastructure for entries of Taxonomy database dump gencode file-data TaxGenCode = TaxGenCode- {- -- GenBank genetic code id- geneticCodeId :: Int,- -- genetic code name abbreviation- abbreviation :: Maybe String,- -- genetic code name- geneCodeName :: String,- -- translation table for this genetic code- cde :: String,- -- start codons for this genetic code- starts :: String- }- deriving (Show, Read, Eq)---- | Datastructure for entries of Taxonomy database dump mergednodes file-data TaxMergedNode = TaxMergedNode- {- -- id of nodes which has been merged- oldTaxId :: Int,- -- id of nodes which is result of merging- newTaxId :: Int- }- deriving (Show, Read, Eq)---- | Datastructure for entries of Taxonomy database dump names file-data TaxName = TaxName- {- -- the id of node associated with this name- nameTaxId :: Int,- -- name itself- nameTxt :: TL.Text,- -- the unique variant of this name if name not unique- uniqueName :: TL.Text,- -- (synonym, common name, ...)- nameClass :: TL.Text- }- deriving (Show, Read, Eq)---- | Taxonomic ranks: NCBI uses the uncommon Speciessubgroup -data Rank = Norank | Form | Variety | Infraspecies | Subspecies | Speciessubgroup | Species | Speciesgroup | Superspecies | Series | Section | Subgenus | Genus | Subtribe | Tribe | Supertribe | Subfamily | Family | Superfamily | Parvorder | Infraorder | Suborder | Order | Superorder | Magnorder | Cohort | Legion | Parvclass | Infraclass | Subclass | Class | Superclass | Microphylum | Infraphylum | Subphylum | Phylum | Superphylum | Infrakingdom | Subkingdom | Kingdom | Superkingdom | Domain deriving (Eq, Ord, Show, Bounded, Enum)--readsRank :: String -> [(Rank, String)]-instance Read Rank where- readsPrec _ = readsRank --readsRank input -- = [(Domain x)| x <- reads input ]- | input == "domain" = [(Domain,"")]- | input == "superkingdom" = [(Superkingdom,"")]- | input == "kingdom" = [(Kingdom,"")]- | input == "subkingdom" = [(Subkingdom,"")]- | input == "infrakingdom" = [(Infrakingdom,"")]- | input == "superphylum" = [(Superphylum,"")]- | input == "phylum" = [(Phylum,"")]- | input == "subphylum" = [(Subphylum,"")]- | input == "infraphylum" = [(Infraphylum,"")]- | input == "microphylum" = [(Microphylum,"")]- | input == "superclass" = [(Superclass,"")]- | input == "class" = [(Class,"")]- | input == "subclass" = [(Subclass,"")]- | input == "infraclass" = [(Infraclass,"")]- | input == "parvclass " = [(Parvclass ,"")] - | input == "legion" = [(Legion,"")] - | input == "cohort" = [(Cohort,"")] - | input == "magnorder " = [(Magnorder ,"")] - | input == "superorder" = [(Superorder,"")] - | input == "order" = [(Order,"")]- | input == "suborder" = [(Suborder,"")]- | input == "infraorder" = [(Infraorder,"")] - | input == "parvorder" = [(Parvorder,"")] - | input == "superfamily" = [(Superfamily,"")]- | input == "family" = [(Family,"")]- | input == "subfamily" = [(Subfamily,"")]- | input == "supertribe" = [(Supertribe,"")]- | input == "tribe" = [(Tribe,"")] - | input == "subtribe" = [(Subtribe,"")] - | input == "genus" = [(Genus,"")]- | input == "subgenus" = [(Subgenus,"")] - | input == "section" = [(Section,"")] - | input == "series" = [(Series,"")] - | input == "superspecies" = [(Superspecies,"")] - | input == "species group" = [(Speciesgroup,"")]- | input == "species" = [(Species,"")]- | input == "species subgroup" = [(Speciessubgroup,"")]- | input == "subspecies" = [(Subspecies,"")] - | input == "infraspecies" = [(Infraspecies,"")]- | input == "varietas" = [(Variety,"")]- | input == "forma" = [(Form,"")]- | input == "no rank" = [(Norank,"")]- | otherwise = [(Norank,"")] ---- | Datastructure for entries of Taxonomy database dump nodes file-data TaxNode = TaxNode- {- -- node id in GenBank- taxId :: Int,- -- parent node id in GenBank taxonomy database- parentTaxId :: Int,- -- rank of this node (superkingdom, kingdom, ...) - rank :: Rank,- -- locus-name prefix; not unique- emblCode :: Maybe String,- -- see division.dmp file- nodeDivisionId :: String,- -- 1 if node inherits division from parent- inheritedDivFlag :: Bool,- -- see gencode.dmp file- nodeGeneticCodeId :: String,- -- 1 if node inherits genetic code from parent- inheritedGCFlag :: Bool,- -- see gencode.dmp file - mitochondrialGeneticCodeId :: String,- -- 1 if node inherits mitochondrial gencode from parent- inheritedMGCFlag :: Bool,- -- 1 if name is suppressed in GenBank entry lineage- genBankHiddenFlag :: Bool,- -- 1 if this subtree has no sequence data yet- hiddenSubtreeRootFlag :: Bool,- -- free-text comments and citations- nodeComments :: Maybe String- }- deriving (Show, Read, Eq)---- | Simple Gene2Accession table -data SimpleGene2Accession = SimpleGene2Accession- { simpleTaxIdEntry :: Int,- simpleGenomicNucleotideAccessionVersion :: String- } deriving (Show, Eq, Read) ---- | Datastructure for Gene2Accession table-data Gene2Accession = Gene2Accession- { taxIdEntry :: Int,- geneID :: Int,- status :: String,- rnaNucleotideAccessionVersion :: String,- rnaNucleotideGi :: String,- proteinAccessionVersion :: String,- proteinGi :: String,- genomicNucleotideAccessionVersion :: String,- genomicNucleotideGi :: String,- startPositionOnTheGenomicAccession :: String,- endPositionOnTheGenomicAccession :: String,- orientation :: String,- assembly :: String,- maturePeptideAccessionVersion :: String,- maturePeptideGi :: String- } deriving (Show, Eq, Read) --instance A.ToJSON (Gr SimpleTaxon Double) where- toJSON inputGraph = simpleTaxonJSONValue inputGraph 1--simpleTaxonJSONValue :: Gr SimpleTaxon Double -> Node -> A.Value-simpleTaxonJSONValue inputGraph node = jsonValue- where jsonValue = A.object [currentScientificName,T.pack "children" A..= children]- childNodes = suc inputGraph node- currentLabel = lab inputGraph node- currentScientificName = T.pack "name" A..= maybe (T.pack "notFound") (TL.toStrict . simpleScientificName) currentLabel- children = A.Array (V.fromList (map (simpleTaxonJSONValue inputGraph) childNodes))- --jsonValue = A.object [currentScientificName,currentId,currentRank,(T.pack "children") A..= children]- --currentId = (T.pack "id") A..= (maybe (T.pack "notFound") (\a -> T.pack (show (simpleTaxId a))) currentLabel)- --currentRank = (T.pack "rank") A..= (maybe (T.pack "notFound") (\a -> T.pack (show (simpleRank a))) currentLabel)