Module: BioCReader

Defined in:
lib/simple_bioc/bioc_reader.rb

Class Method Summary collapse

Class Method Details

.read(path, options) ⇒ Object



7
8
9
10
11
12
13
14
# File 'lib/simple_bioc/bioc_reader.rb', line 7

def read(path, options) 
  collection = nil
  File.open(path) do |file|
    collection = read_from_file_or_string(file, options)
  end

  collection
end

.read_annotation(xml, annotation, options = {}) ⇒ Object



96
97
98
99
100
101
102
# File 'lib/simple_bioc/bioc_reader.rb', line 96

def read_annotation(xml, annotation, options = {}) 
  annotation.id = xml["id"]
  annotation.text = read_text(xml, "text")
  read_infon(xml, annotation)
  read_recursive(xml, annotation, "location")
  true
end

.read_collection(xml, collection, options = {}) ⇒ Object



55
56
57
58
59
60
61
# File 'lib/simple_bioc/bioc_reader.rb', line 55

def read_collection(xml, collection, options = {})
  collection.source = read_text(xml, "source")
  collection.date = read_text(xml, "date")
  collection.key = read_text(xml, "key")
  read_infon(xml, collection)
  read_recursive(xml, collection, "document", options)
end

.read_document(xml, document, options = {}) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
# File 'lib/simple_bioc/bioc_reader.rb', line 63

def read_document(xml, document, options = {})
  document.id = read_text(xml, "id")
  if options[:documents].kind_of?(Array) && !options[:documents].include?(document.id)
    return false
  end
  read_infon(xml, document)
  read_recursive(xml, document, "passage")
  read_recursive(xml, document, "relation")
  document.adjust_ref
  true
end

.read_from_file_or_string(file_or_string, options) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/simple_bioc/bioc_reader.rb', line 16

def read_from_file_or_string(file_or_string, options)
  collection = nil

  xml_doc  = Nokogiri::XML(file_or_string) do |config|
    config.noent.strict.noblanks
  end
  xml = xml_doc.at_xpath("//collection")
  if xml.nil?
    fail 'Wrong format'
  end
  collection = SimpleBioC::Collection.new
  read_collection(xml, collection, options)

  collection
end

.read_infon(xml, obj) ⇒ Object



42
43
44
# File 'lib/simple_bioc/bioc_reader.rb', line 42

def read_infon(xml, obj)
  xml.xpath("infon").each{ |i| obj.infons[i["key"]] = i.content}
end

.read_int(xml, name) ⇒ Object



37
38
39
40
# File 'lib/simple_bioc/bioc_reader.rb', line 37

def read_int(xml, name)
  val = read_text(xml, name) 
  val && val.to_i
end

.read_location(xml, location, options = {}) ⇒ Object



111
112
113
114
115
# File 'lib/simple_bioc/bioc_reader.rb', line 111

def read_location(xml, location, options = {}) 
  location.offset = xml["offset"]
  location.length = xml["length"]
  true
end

.read_node(xml, node, options = {}) ⇒ Object



117
118
119
120
121
# File 'lib/simple_bioc/bioc_reader.rb', line 117

def read_node(xml, node, options = {})
  node.refid = xml["refid"]
  node.role = xml["role"]
  true
end

.read_passage(xml, passage, options = {}) ⇒ Object



75
76
77
78
79
80
81
82
83
84
# File 'lib/simple_bioc/bioc_reader.rb', line 75

def read_passage(xml, passage, options = {})
  passage.text = read_text(xml, "text")
  passage.offset = read_int(xml, "offset")
  read_infon(xml, passage)
  read_recursive(xml, passage, "sentence")
  read_recursive(xml, passage, "annotation")
  read_recursive(xml, passage, "relation")
  passage.adjust_annotation_offsets
  true
end

.read_recursive(xml, obj, name, options = {}) ⇒ Object



46
47
48
49
50
51
52
53
# File 'lib/simple_bioc/bioc_reader.rb', line 46

def read_recursive(xml, obj, name, options = {})
  target_class = SimpleBioC.const_get(name.capitalize)
  xml.xpath(name).each do |node|
    instance = target_class.new(obj)
    ret = send(:"read_#{name}", node, instance, options)
    obj.instance_variable_get(:"@#{name}s")  << instance if ret
  end
end

.read_relation(xml, relation, options = {}) ⇒ Object



104
105
106
107
108
109
# File 'lib/simple_bioc/bioc_reader.rb', line 104

def read_relation(xml, relation, options = {}) 
  relation.id = xml["id"]
  read_infon(xml, relation)
  read_recursive(xml, relation, "node")
  true
end

.read_sentence(xml, sentence, options = {}) ⇒ Object



86
87
88
89
90
91
92
93
94
# File 'lib/simple_bioc/bioc_reader.rb', line 86

def read_sentence(xml, sentence, options = {})
  sentence.text = read_text(xml, "text")
  sentence.offset = read_int(xml, "offset")
  read_infon(xml, sentence)
  read_recursive(xml, sentence, "annotation")
  read_recursive(xml, sentence, "relation")
  sentence.adjust_annotation_offsets
  true
end

.read_text(xml, name) ⇒ Object



32
33
34
35
# File 'lib/simple_bioc/bioc_reader.rb', line 32

def read_text(xml, name)
  node = xml.at_xpath(name)
  node && node.content
end