Class: Vendor::SqedToTaxonworks::Result

Inherits:
Object
  • Object
show all
Defined in:
lib/vendor/sqed_to_taxonworks.rb

Overview

Stores and handles metadata linking a TW depiction to the Sqed library.

Constant Summary collapse

SMALL_WIDTH =
100
LARGE_WIDTH =
400
TEXT_MAP =
{
  annotated_specimen: :buffered_collecting_event,
  collecting_event_labels: :buffered_collecting_event,
  curator_metadata: :buffered_other_labels,
  determination_labels: :buffered_determinations,
  identifier: :buffered_other_labels,
  image_registration: nil,
  other_labels: :buffered_other_labels,
  labels: :buffered_collecting_event,
  nothing: nil,
  specimen: nil,
  stage: :buffered_collecting_event,
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(depiction_id: nil, namespace_id: nil) ⇒ Result

Returns a new instance of Result.



41
42
43
44
# File 'lib/vendor/sqed_to_taxonworks.rb', line 41

def initialize(depiction_id: nil, namespace_id: nil)
  @depiction_id = depiction_id
  @namespace_id = namespace_id
end

Instance Attribute Details

#depictionObject

Returns the value of attribute depiction.



23
24
25
# File 'lib/vendor/sqed_to_taxonworks.rb', line 23

def depiction
  @depiction
end

#depiction_idObject

Returns the value of attribute depiction_id.



25
26
27
# File 'lib/vendor/sqed_to_taxonworks.rb', line 25

def depiction_id
  @depiction_id
end

#height_ratioObject

Returns the value of attribute height_ratio.



39
40
41
# File 'lib/vendor/sqed_to_taxonworks.rb', line 39

def height_ratio
  @height_ratio
end

#namespace_idObject

Returns the value of attribute namespace_id.



27
28
29
# File 'lib/vendor/sqed_to_taxonworks.rb', line 27

def namespace_id
  @namespace_id
end

#original_imageObject

Returns the value of attribute original_image.



37
38
39
# File 'lib/vendor/sqed_to_taxonworks.rb', line 37

def original_image
  @original_image
end

#sqedObject

Returns the value of attribute sqed.



31
32
33
# File 'lib/vendor/sqed_to_taxonworks.rb', line 31

def sqed
  @sqed
end

#sqed_depictionObject

Returns the value of attribute sqed_depiction.



29
30
31
# File 'lib/vendor/sqed_to_taxonworks.rb', line 29

def sqed_depiction
  @sqed_depiction
end

#sqed_resulta sqed result, false

Minimize use of this if possible, depend on the cached values when possible.

Returns:

  • (a sqed result, false)


35
36
37
# File 'lib/vendor/sqed_to_taxonworks.rb', line 35

def sqed_result
  @sqed_result
end

#width_ratioObject

Returns the value of attribute width_ratio.



39
40
41
# File 'lib/vendor/sqed_to_taxonworks.rb', line 39

def width_ratio
  @width_ratio
end

Instance Method Details

#boundaries_cached?Boolean

Returns:

  • (Boolean)


127
128
129
# File 'lib/vendor/sqed_to_taxonworks.rb', line 127

def boundaries_cached?
  !sqed_depiction.result_boundary_coordinates.nil?
end

#cache_allObject

TODO: should be set_cached



148
149
150
151
152
# File 'lib/vendor/sqed_to_taxonworks.rb', line 148

def cache_all
  cache_ocr
  cache_boundaries
  sqed_depiction.touch
end

#cache_boundariesObject



135
136
137
138
139
140
141
# File 'lib/vendor/sqed_to_taxonworks.rb', line 135

def cache_boundaries
  begin
    sqed_depiction.update_column(:result_boundary_coordinates, sqed.boundaries.coordinates)
  rescue Sqed::Error
    sqed_depiction.update_column(:result_boundary_coordinates, nil)
  end
end

#cache_ocrObject



143
144
145
# File 'lib/vendor/sqed_to_taxonworks.rb', line 143

def cache_ocr
  sqed_depiction.update_column(:result_ocr, (sqed_result || nil)&.text)
end

#coordinates_valid?Boolean

Returns if false then they are clearly not, if true then they might be.

Returns:

  • (Boolean)

    if false then they are clearly not, if true then they might be



254
255
256
257
258
259
260
261
262
# File 'lib/vendor/sqed_to_taxonworks.rb', line 254

def coordinates_valid?
  return false if sqed_depiction.result_boundary_coordinates.nil?
  zeroed = 0
  sqed_depiction.result_boundary_coordinates.each do |k, v|
    zeroed += 1 if v == [0, 0, 0, 0]
    return false if zeroed > 1
  end
  true
end

#coords_for(layout_section_type) ⇒ Object



165
166
167
168
169
170
171
172
173
174
# File 'lib/vendor/sqed_to_taxonworks.rb', line 165

def coords_for(layout_section_type)
  index = sqed_depiction.[:metadata_map].key(layout_section_type)
  if boundaries_cached?
    sqed_depiction.result_boundary_coordinates[index.to_s].to_a # TODO- hmm, why the to_s needed here
  else # do not do the OCR if only coords asked for
    sqed_result
    cache_boundaries
    sqed.boundaries.for(index)
  end
end

#image_path_for(layout_section_type) ⇒ Object



176
177
178
179
# File 'lib/vendor/sqed_to_taxonworks.rb', line 176

def image_path_for(layout_section_type)
  c = coords_for(layout_section_type)
  "/images/#{depiction.image.id}/extract/#{c[0]}/#{c[1]}/#{c[2]}/#{c[3]}"
end

#image_path_for_large_image(layout_section_type) ⇒ Object



181
182
183
184
# File 'lib/vendor/sqed_to_taxonworks.rb', line 181

def image_path_for_large_image(layout_section_type)
  c = coords_for(layout_section_type)
  "/images/#{depiction.image.id}/scale_to_box/#{c[0]}/#{c[1]}/#{c[2]}/#{c[3]}/400/400"
end

#image_path_for_small_image(layout_section_type) ⇒ Object



186
187
188
189
# File 'lib/vendor/sqed_to_taxonworks.rb', line 186

def image_path_for_small_image(layout_section_type)
  c = coords_for(layout_section_type)
  "/images/#{depiction.image.id}/scale_to_box/#{c[0]}/#{c[1]}/#{c[2]}/#{c[3]}/150/150"
end

#image_sectionsArray

Returns:

  • (Array)


197
198
199
# File 'lib/vendor/sqed_to_taxonworks.rb', line 197

def image_sections
  (sqed_depiction.[:metadata_map].values - [:image_registration])
end

#image_unavailable?Boolean

Returns:

  • (Boolean)


247
248
249
250
# File 'lib/vendor/sqed_to_taxonworks.rb', line 247

def image_unavailable?
  return true if !File.exist?(depiction.image.image_file.path(:original))
  false
end

#large_dimensions_for(layout_section_type) ⇒ Object



241
242
243
244
245
# File 'lib/vendor/sqed_to_taxonworks.rb', line 241

def large_dimensions_for(layout_section_type)
  c = coords_for(layout_section_type)
  return nil if c.blank? || c[2] == 0 || c[3] == 0
  "0, 0, 400, #{( c[3].to_f / (c[2].to_f / 400)).to_i}"
end

#large_height_for(layout_section_type) ⇒ Object



236
237
238
239
# File 'lib/vendor/sqed_to_taxonworks.rb', line 236

def large_height_for(layout_section_type)
  c = coords_for(layout_section_type)
  "#{(c[3].to_f / (c[2].to_f / LARGE_WIDTH)).to_i}"
end

#large_height_width(layout_section_type) ⇒ Object



221
222
223
224
# File 'lib/vendor/sqed_to_taxonworks.rb', line 221

def large_height_width(layout_section_type)
  c = coords_for(layout_section_type)
  "#{LARGE_WIDTH}, #{large_height_for(layout_section_type)}"
end

#larger_height_width(layout_section_type) ⇒ Object



226
227
228
229
# File 'lib/vendor/sqed_to_taxonworks.rb', line 226

def larger_height_width(layout_section_type)
  c = coords_for(layout_section_type)
  "#{LARGE_WIDTH + 100}, #{large_height_for(layout_section_type).to_i + 100}"
end

#namespace_locked?Boolean

Returns:

  • (Boolean)


123
124
125
# File 'lib/vendor/sqed_to_taxonworks.rb', line 123

def namespace_locked?
  !namespace_id.nil?
end

#ocr_cached?Boolean

Returns:

  • (Boolean)


131
132
133
# File 'lib/vendor/sqed_to_taxonworks.rb', line 131

def ocr_cached?
  !sqed_depiction.result_ocr.nil?
end

#ocr_for(layout_section_type) ⇒ Object



154
155
156
157
158
159
160
161
162
163
# File 'lib/vendor/sqed_to_taxonworks.rb', line 154

def ocr_for(layout_section_type)
  index = sqed_depiction.[:metadata_map].key(layout_section_type)
  if ocr_cached?
    sqed_depiction.result_ocr[layout_section_type.to_s] && sqed_depiction.result_ocr[layout_section_type.to_s]['text']
  else
    sqed_result
    cache_all
    sqed_result&.text_for(layout_section_type.to_sym) if sqed_result
  end
end

#ocr_path_for(layout_section_type) ⇒ Object



191
192
193
194
# File 'lib/vendor/sqed_to_taxonworks.rb', line 191

def ocr_path_for(layout_section_type)
  c = coords_for(layout_section_type)
  "/images/#{depiction.image.id}/ocr/#{c[0]}/#{c[1]}/#{c[2]}/#{c[3]}"
end

#primary_imageSymbol

Returns:

  • (Symbol)


202
203
204
# File 'lib/vendor/sqed_to_taxonworks.rb', line 202

def primary_image
  (image_sections & [:labels, :collecting_event_labels, :annotated_specimen]).first
end

#process_result(use_thumbnail: true) ⇒ Object

private



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/vendor/sqed_to_taxonworks.rb', line 84

def process_result(use_thumbnail: true)
  begin
    sqed.use_thumbnail = use_thumbnail
    r = sqed.result
  rescue Sqed::Error
    r = false

  # TODO: likely remove TypeError
  rescue TypeError
    r = false

  rescue Magick::ImageMagickError => e
    if e.message.include?('unable to open image')
      r = false
    else
      raise
    end
  rescue RuntimeError => e
    if e.message.include?('ImageMagick library function failed to return a result.')
      r = false
    else
      raise
    end
  end
  r
end

#secondary_sectionsArray

Returns:

  • (Array)


207
208
209
# File 'lib/vendor/sqed_to_taxonworks.rb', line 207

def secondary_sections
  image_sections - [primary_image]
end

#small_dimensions_for(layout_section_type) ⇒ Object



211
212
213
214
# File 'lib/vendor/sqed_to_taxonworks.rb', line 211

def small_dimensions_for(layout_section_type)
  c = coords_for(layout_section_type)
  "0, 0, #{SMALL_WIDTH}, #{(c[3].to_f / (c[2].to_f / SMALL_WIDTH)).to_i}"
end

#small_height_for(layout_section_type) ⇒ Object



231
232
233
234
# File 'lib/vendor/sqed_to_taxonworks.rb', line 231

def small_height_for(layout_section_type)
  c = coords_for(layout_section_type)
  "#{(c[3].to_f / (c[2].to_f / SMALL_WIDTH)).to_i}"
end

#small_height_width(layout_section_type) ⇒ Object



216
217
218
219
# File 'lib/vendor/sqed_to_taxonworks.rb', line 216

def small_height_width(layout_section_type)
  c = coords_for(layout_section_type)
  "#{SMALL_WIDTH}, #{small_height_for(layout_section_type)}"
end