Skip to content

Commit

Permalink
Add OboEntry functionality into OboOntology
Browse files Browse the repository at this point in the history
omaus committed Jul 27, 2023
1 parent 184c20a commit 16a9a6e
Showing 3 changed files with 54 additions and 15 deletions.
13 changes: 13 additions & 0 deletions playground.fsx
Original file line number Diff line number Diff line change
@@ -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
54 changes: 40 additions & 14 deletions src/FsOboParser/OboOntology.fs
Original file line number Diff line number Diff line change
@@ -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<string>) =

let en = input.GetEnumerator()
let rec loop (en:System.Collections.Generic.IEnumerator<string>) 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<string>) =

let en = input.GetEnumerator()
let rec loop (en:System.Collections.Generic.IEnumerator<string>) 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) =
2 changes: 1 addition & 1 deletion src/FsOboParser/OboTypeDef.fs
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit 16a9a6e

Please sign in to comment.