blob: 75948e045735c6eeaddff878ed17893c24abb012 (
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
104
|
=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
|