From 16a9a6ec97c21b1abe0f6e754888aa6090099464 Mon Sep 17 00:00:00 2001 From: omaus Date: Thu, 27 Jul 2023 19:24:11 +0200 Subject: [PATCH] Add OboEntry functionality into OboOntology --- playground.fsx | 13 ++++++++ src/FsOboParser/OboOntology.fs | 54 +++++++++++++++++++++++++--------- src/FsOboParser/OboTypeDef.fs | 2 +- 3 files changed, 54 insertions(+), 15 deletions(-) diff --git a/playground.fsx b/playground.fsx index 935ef80..b9c29d3 100644 --- a/playground.fsx +++ b/playground.fsx @@ -12,6 +12,19 @@ let testPath = Path.Combine(__SOURCE_DIRECTORY__, "./../../nfdi4plants/arc-vali let testOntology = OboOntology.fromFile true testPath +let testTerms = [ + OboTerm.Create("test:000", Name = "test0") + OboTerm.Create("test:001", Name = "test1a", IsA = ["test:000"]) + OboTerm.Create("test:002", Name = "test2", IsA = ["test:001"]) + OboTerm.Create("test:003", Name = "test1b", IsA = ["test:000"]) +] + +let testOntology = OboOntology.create testTerms [] + +testOntology.GetChildOntologyAnnotations(testTerms.Head.Id) +testOntology.GetChildOntologyAnnotations(testTerms.Head.Id, Depth = 1) +testOntology.GetChildOntologyAnnotations(testTerms.Head.Id, Depth = 2) + //let fileLines = File.ReadAllLines testPath //OboTerm.fromLines true ((fileLines |> Seq.ofArray).GetEnumerator()) 0 diff --git a/src/FsOboParser/OboOntology.fs b/src/FsOboParser/OboOntology.fs index 43b0b49..895282f 100644 --- a/src/FsOboParser/OboOntology.fs +++ b/src/FsOboParser/OboOntology.fs @@ -9,6 +9,35 @@ open ISADotNet open System +/// Functions for working with OboEntries. +module OboEntries = + + /// Reads a collection of strings and parses them into a list of OboEntries. + let fromLines verbose (input : seq) = + + let en = input.GetEnumerator() + let rec loop (en:System.Collections.Generic.IEnumerator) entries lineNumber = + + match en.MoveNext() with + | true -> + match (en.Current |> trimComment) with + | "[Term]" -> + let lineNumber, parsedTerm = (OboTerm.fromLines verbose en lineNumber "" "" false [] "" "" [] [] [] [] [] [] [] [] false [] [] [] false "" "") + loop en (Term parsedTerm :: entries) lineNumber + | "[Typedef]" -> + let lineNumber, parsedTypeDef = (OboTypeDef.fromLines verbose en lineNumber "" "" "" "" [] [] false false false false false false false) + loop en (TypeDef parsedTypeDef :: entries) lineNumber + | _ -> loop en entries (lineNumber + 1) + | false -> entries + + loop en [] 1 + + /// Reads an OBO file and returns a list of OboEntries. + let fromFile verbose filepath = + IO.File.ReadAllLines filepath + |> fromLines verbose + + /// Ontology containing OBO Terms and OBO Type Defs (OBO 1.2). type OboOntology = @@ -26,22 +55,19 @@ type OboOntology = /// Reads an OBO Ontology containing term and type def stanzas from lines. static member fromLines verbose (input : seq) = - let en = input.GetEnumerator() - let rec loop (en:System.Collections.Generic.IEnumerator) terms typedefs lineNumber = + let rec loop terms typedefs entries = + match entries with + | h :: t -> + match h with + | Term term -> loop (term :: terms) typedefs t + | TypeDef typedef -> loop terms (typedef :: typedefs) t + | [] -> terms, typedefs - match en.MoveNext() with - | true -> - match (en.Current |> trimComment) with - | "[Term]" -> - let lineNumber,parsedTerm = (OboTerm.fromLines verbose en lineNumber "" "" false [] "" "" [] [] [] [] [] [] [] [] false [] [] [] false "" "") - loop en (parsedTerm :: terms) typedefs lineNumber - | "[Typedef]" -> - let lineNumber,parsedTypeDef = (OboTypeDef.fromLines verbose en lineNumber "" "" "" "" [] [] false false false false false false false) - loop en terms (parsedTypeDef :: typedefs) lineNumber - | _ -> loop en terms typedefs (lineNumber + 1) - | false -> OboOntology.create (List.rev terms) (List.rev typedefs) + let terms,typedefs = + OboEntries.fromLines verbose input + |> loop [] [] - loop en [] [] 1 + OboOntology.create (List.rev terms) (List.rev typedefs) /// Reads an OBO Ontology containing term and type def stanzas from a file with the given path. static member fromFile verbose (path : string) = diff --git a/src/FsOboParser/OboTypeDef.fs b/src/FsOboParser/OboTypeDef.fs index e709524..a1eb21b 100644 --- a/src/FsOboParser/OboTypeDef.fs +++ b/src/FsOboParser/OboTypeDef.fs @@ -5,7 +5,7 @@ open DBXref open System -/// Models the relationship between OBO Terms +/// Models the relationship between OBO Terms. type OboTypeDef = { ///The unique id of the current term.