summaryrefslogtreecommitdiff
path: root/lib/utils/shims/dataset.rb
blob: 912510c77c1716e90e89a0997558c3558d0eb1b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
=begin
* Name: dataset.rb
* Description: Dataset shims
* Author: Andreas Maunz <andreas@maunz.de>
* Date: 10/2012
=end

module OpenTox

  # Shims for the Dataset Class
  class Dataset

    attr_accessor :feature_positions, :compound_positions

    # Load a dataset from URI
    # @param [String] Dataset URI
    # @return [OpenTox::Dataset] Dataset object
    def self.find(uri, subjectid=nil)
      return nil unless uri
      ds = OpenTox::Dataset.new uri, subjectid
      ds.get
      ds
    end


    ### Index Structures

    # Create value map
    # @param [OpenTox::Feature] A feature
    # @return [Hash] A hash with keys 1...feature.training_classes.size and values training classes
    def value_map(feature)
      training_classes = feature.accept_values
      training_classes.each_index.inject({}) { |h,idx| h[idx+1]=training_classes[idx]; h } 
    end

    # Create feature positions map
    # @return [Hash] A hash with keys feature uris and values feature positions
    def build_feature_positions
      unless @feature_positions
        @feature_positions = @features.each_index.inject({}) { |h,idx| 
          internal_server_error "Duplicate Feature '#{@features[idx].uri}' in dataset '#{@uri}'" if h[@features[idx].uri]
          h[@features[idx].uri] = idx 
          h
        }
      end
    end

    # Create compounds positions map
    # @return [Hash] A hash with keys compound uris and values compound position arrays
    def build_compound_positions
      unless @compound_positions
        @compound_positions = @compounds.each_index.inject({}) { |h,idx| 
          inchi=OpenTox::Compound.new(@compounds[idx].uri).inchi
          h[inchi] = [] unless h[inchi]
          h[inchi] << idx if inchi =~ /InChI/
          h
        }
      end
    end


    ### Associative Search Operations

    # Search a dataset for a feature given its URI
    # @param [String] Feature URI
    # @return [OpenTox::Feature] Feature object, or nil if not present
    def find_feature(uri)
      build_feature_positions
      res = @features[@feature_positions[uri]] if @feature_positions[uri]
      res
    end

    # Search a dataset for a compound given its URI
    # @param [String] Compound URI
    # @return [OpenTox::Compound] Array of compound objects, or nil if not present
    def find_compound(uri)
      build_compound_positions
      inchi = OpenTox::Compound.new(uri).inchi
      res = @compounds[@compound_positions[inchi]] if inchi =~ /InChI/ and @compound_positions[inchi]
      res
    end

    # Search a dataset for a data entry given compound URI and feature URI
    # @param [String] Compound URI
    # @param [String] Feature URI
    # @return [Object] Data entry, or nil if not present
    def find_data_entry(compound_uri, feature_uri)
      build_compound_positions
      build_feature_positions
      inchi = OpenTox::Compound.new(compound_uri).inchi
      if @compound_positions[inchi] && @feature_positions[feature_uri]
        res = []
        @compound_positions[inchi].each { |idx|
          res << data_entries[idx][@feature_positions[feature_uri]]
        }
      end
      res
    end

  end


end