Class: CaTissue::AbstractSpecimen

Inherits:
Object
  • Object
show all
Defined in:
lib/catissue/domain/abstract_specimen.rb

Defined Under Namespace

Classes: SpecimenClass

Instance Method Summary collapse

Constructor Details

#initializeAbstractSpecimen

Initializes this AbstractSpecimen. The default specimen_class is inferred from this AbstractSpecimen instance’s subclass.



81
82
83
84
# File 'lib/catissue/domain/abstract_specimen.rb', line 81

def initialize
  super
  self.specimen_class ||= infer_specimen_class(self.class)
end

Instance Method Details

#aliquot?Boolean

Returns whether this specimen is an aliquot.

Returns:

  • (Boolean)

    whether this specimen is an aliquot



92
93
94
95
# File 'lib/catissue/domain/abstract_specimen.rb', line 92

def aliquot?
  lineage ||= default_lineage
  lineage == 'Aliquot'
end

#aliquots<AbstractSpecimen>

Returns this specimen’s aliquots.

Returns:



98
99
100
# File 'lib/catissue/domain/abstract_specimen.rb', line 98

def aliquots
  children.filter { |child| child.aliquot? }
end

#closureAbstractSpecimen

and all AbstractSpecimen in the derivation hierarcy.

Returns:

  • (AbstractSpecimen)

    the transitive closure consisting of this AbstractSpecimen



119
120
121
# File 'lib/catissue/domain/abstract_specimen.rb', line 119

def closure
  children.inject([self]) { |coll, spc| coll.concat(spc.closure) }
end

#derive(opts = Hash::EMPTY_HASH) ⇒ AbstractSpecimen+

Derives a new specimen from this specimen. The options are described in Specimen.create_specimen, with one addition:

  • :count(Integer) - the optional number of specimens to derive

If the :count option is greater than one and the :specimen_class, :specimen_type and :specimen_characteristics options are not set to values which differ from the respective values for this Specimen, then the specimen is aliquoted, otherwise the derived specimens are created independently, e.g.:

spc = Specimen.create_specimen(:specimen_class => :tissue, :specimen_type => :frozen)
spc.derive(:count => 1) #=> not aliquoted
spc.derive(:count => 2) #=> aliquoted
spc.derive(:specimen_type => 'Frozen Specimen') #=> two aliquots

The default derived initial_quantity is the parent specimen available_quantity divided by count for aliquots, zero otherwise. If the child specimen_class is the same as this Specimen class, then this parent Specimen’s available_quantity is decremented by the child initial_quantity, e.g.:

spc.available_quantity #=> 4
spc.derive(:initial_quantity => 1)
spc.available_quantity #=> 3
spc.derive(:count => 2, :specimen_type => 'Frozen Tissue')
spc.derive(:count => 2) #=> two aliquots with quantity 1 each
spc.available_quantity #=> 0

The default derived specimen label is label_n, where label is this specimen’s label and n is this specimen’s child count after including the new derived specimen, e.g. 3090_3 for the third child in the parent specimen with label 3090.

Parameters:

  • opts ({Symbol => Object}, nil) (defaults to: Hash::EMPTY_HASH)

    the attribute => value hash

Returns:

Raises:

  • (Jinx::ValidationError)

    if an aliquoted parent available quantity is not greater than zero or the derived specimen quantities exceed the parent available quantity



162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/catissue/domain/abstract_specimen.rb', line 162

def derive(opts=Hash::EMPTY_HASH)
  # add defaults
  add_defaults if specimen_class.nil?
  # copy the option hash
  opts = opts.dup
  # standardize the requirement param, if any
  rqmt = opts.delete(:requirement)
  opts[:specimen_requirement] ||= rqmt if rqmt
  # the default specimen parameters
  unless opts.has_key?(:specimen_requirement) then
    opts[:specimen_class] ||= self.specimen_class ||= infer_specimen_class
    opts[:specimen_type] ||= self.specimen_type
  end
  unless Class === opts[:specimen_class] then
    opts[:specimen_class] = infer_class(opts)
  end
  count = opts.delete(:count)
  count ||= 1
  aliquot_flag = false
  if count > 1 and opts[:specimen_class] == self.class and opts[:specimen_type] == self.specimen_type then
    # aliquots share the specimen_characteristics
    child_chr = opts[:specimen_characteristics] ||= specimen_characteristics
    aliquot_flag = child_chr == specimen_characteristics
  end
  # set aliquot parameters if necessary
  if aliquot_flag then set_aliquot_parameters(opts, count) end
  # make the derived specimens
  count == 1 ? create_derived(opts) : Array.new(count) { create_derived(opts) }
end

#derived?Boolean

Returns whether this specimen is derived from a parent specimen.

Returns:

  • (Boolean)

    whether this specimen is derived from a parent specimen



87
88
89
# File 'lib/catissue/domain/abstract_specimen.rb', line 87

def derived?
  !!parent
end

#fixed?Boolean

Returns whether this specimen’s type starts with ‘Fixed’.

Returns:

  • (Boolean)

    whether this specimen’s type starts with ‘Fixed’



108
109
110
# File 'lib/catissue/domain/abstract_specimen.rb', line 108

def fixed?
  specimen_type =~ /^Fixed/
end

#fresh?Boolean

Returns whether this specimen’s type is ‘Fresh Tissue’.

Returns:

  • (Boolean)

    whether this specimen’s type is ‘Fresh Tissue’



103
104
105
# File 'lib/catissue/domain/abstract_specimen.rb', line 103

def fresh?
  specimen_type == 'Fresh Tissue'
end

#frozen?Boolean

Returns whether this specimen’s type starts with ‘Frozen’.

Returns:

  • (Boolean)

    whether this specimen’s type starts with ‘Frozen’



113
114
115
# File 'lib/catissue/domain/abstract_specimen.rb', line 113

def frozen?
  specimen_type =~ /^Frozen/
end

#minimal_match?(other) ⇒ Boolean

Returns whether this AbstractSpecimen is minimally consistent with the other specimen. This method augments the Jinx::Resource.minimal_match? with an additional restriction that the other specimen is the same type as this specimen and is a tolerant match on specimen class, specimen type and pathological status. A tolerant match condition holds if the other attribute value is equal to this AbstractSpecimen’s attribute value or the other value is the default ‘Not Specified’.

Returns:

  • (Boolean)


201
202
203
# File 'lib/catissue/domain/abstract_specimen.rb', line 201

def minimal_match?(other)
  super and tolerant_match?(other, TOLERANT_MATCH_ATTRS)
end

#specimen_type=(value) ⇒ Object

Sets the specimen type to the specified value. The value can be a permissible caTissue String value or the shortcut symbols :fresh, :fixed and :frozen.

Parameters:

  • value (String, Symbol, nil)

    the value to set



11
12
13
14
# File 'lib/catissue/domain/abstract_specimen.rb', line 11

def specimen_type=(value)
  value = value.to_s.capitalize_first + ' Tissue' if Symbol === value
  setSpecimenType(value)
end

#standard_unitObject

Returns the standard unit for this specimen



124
125
126
127
# File 'lib/catissue/domain/abstract_specimen.rb', line 124

def standard_unit
  self.specimen_class ||= infer_specimen_class(self.class)
  SpecimenClass::UNIT_HASH[self.specimen_class]
end