class HQMF::PopulationCriteriaConverter

Class for converting an HQMF 1.0 representation to an HQMF 2.0 representation

Attributes

sub_measures[R]

Public Class Methods

new(doc, data_criteria_converter) click to toggle source
# File lib/hqmf-parser/converter/pass1/population_criteria_converter.rb, line 7
def initialize(doc, data_criteria_converter)
  @doc = doc
  @data_criteria_converter = data_criteria_converter
  @population_criteria_by_id = {}
  @population_criteria_by_key = {}
  @population_reference = {}
  parse()
  build_sub_measures()
end

Public Instance Methods

population_criteria() click to toggle source
# File lib/hqmf-parser/converter/pass1/population_criteria_converter.rb, line 17
def population_criteria
  @population_criteria_by_key.values
end

Private Instance Methods

apply_to_submeasures(subs, type, values, unpaired_type=nil, unpaired_keys=[]) click to toggle source

create a copy of each submeasre adding on the new values of the given type skip the unpaired values. Unpaired values are denominators without exclusions or populations without exceptions

# File lib/hqmf-parser/converter/pass1/population_criteria_converter.rb, line 126
def apply_to_submeasures(subs, type, values, unpaired_type=nil, unpaired_keys=[])
  new_subs = []
  subs.each do |sub|
    # this unless prevents us from forcing an exclusion or excepion onto a measure that has a submeasure without
    # an exclusion or exception, but other populations with an exclusion or excepion.
    unless unpaired_keys.include? sub[unpaired_type]
      # duplicate each new value if it is set, otherwise set this key on each submeasure.
      values.each do |value|
        if (sub[type] and sub[type] != value.id)
          tmp = {}
          HQMF::PopulationCriteria::ALL_POPULATION_CODES.each do |key|
            tmp[key] = sub[key] if sub[key]
          end
          sub = tmp
          new_subs << sub
        end
        sub[type] = value.id
      end
    end
  end
  subs.concat(new_subs)
end
build_sub_measures() click to toggle source
# File lib/hqmf-parser/converter/pass1/population_criteria_converter.rb, line 23
def build_sub_measures()
  @sub_measures = []
  ipps = @population_criteria_by_id.select {|key, value| value.type == HQMF::PopulationCriteria::IPP}
  denoms = @population_criteria_by_id.select {|key, value| value.type == HQMF::PopulationCriteria::DENOM}
  nums = @population_criteria_by_id.select {|key, value| value.type == HQMF::PopulationCriteria::NUMER}
  numexs = @population_criteria_by_id.select {|key, value| value.type == HQMF::PopulationCriteria::NUMEX}
  msrpopls = @population_criteria_by_id.select {|key, value| value.type == HQMF::PopulationCriteria::MSRPOPL}
  observs = @population_criteria_by_id.select {|key, value| value.type == HQMF::PopulationCriteria::OBSERV}
  excls = @population_criteria_by_id.select {|key, value| value.type == HQMF::PopulationCriteria::DENEX}
  denexcs = @population_criteria_by_id.select {|key, value| value.type == HQMF::PopulationCriteria::DENEXCEP}
  msrpoplexs = @population_criteria_by_id.select {|key, value| value.type == HQMF::PopulationCriteria::MSRPOPLEX}

  stratifications = @population_criteria_by_id.values.select {|value| value.type == HQMF::PopulationCriteria::STRAT}

  if (ipps.size<=1 and denoms.size<=1 and nums.size<=1 and numexs.size<=1 and excls.size<=1 and denexcs.size<=1 and msrpopls.size<=1 and msrpoplexs.size<=1 and observs.size<=1)
    sub_measure = {}

    sub_measure[HQMF::PopulationCriteria::IPP] = HQMF::PopulationCriteria::IPP if ipps.size > 0
    sub_measure[HQMF::PopulationCriteria::DENOM] = HQMF::PopulationCriteria::DENOM if denoms.size > 0
    sub_measure[HQMF::PopulationCriteria::NUMER] = HQMF::PopulationCriteria::NUMER if nums.size > 0
    sub_measure[HQMF::PopulationCriteria::NUMEX] = HQMF::PopulationCriteria::NUMEX if numexs.size > 0
    sub_measure[HQMF::PopulationCriteria::DENEXCEP] = HQMF::PopulationCriteria::DENEXCEP if denexcs.size > 0
    sub_measure[HQMF::PopulationCriteria::DENEX] = HQMF::PopulationCriteria::DENEX if excls.size > 0
    sub_measure[HQMF::PopulationCriteria::MSRPOPL] = HQMF::PopulationCriteria::MSRPOPL if msrpopls.size > 0
    sub_measure[HQMF::PopulationCriteria::OBSERV] = HQMF::PopulationCriteria::OBSERV if observs.size > 0
    sub_measure[HQMF::PopulationCriteria::MSRPOPLEX] = HQMF::PopulationCriteria::MSRPOPLEX if msrpoplexs.size > 0

    @sub_measures << sub_measure
  else

    nums.each do |num_id, num|
      @sub_measures << {HQMF::PopulationCriteria::NUMER => num.id}
    end
    msrpopls.each do |popl_id, popl|
      @sub_measures << {HQMF::PopulationCriteria::MSRPOPL => popl.id}
    end
    apply_to_submeasures(@sub_measures, HQMF::PopulationCriteria::DENOM, denoms.values)
    apply_to_submeasures(@sub_measures, HQMF::PopulationCriteria::IPP, ipps.values)

    apply_to_submeasures(@sub_measures, HQMF::PopulationCriteria::DENEX, excls.values, HQMF::PopulationCriteria::IPP,  get_unmatched_population_keys(ipps, excls))
    apply_to_submeasures(@sub_measures, HQMF::PopulationCriteria::DENEXCEP, denexcs.values, HQMF::PopulationCriteria::DENOM,  get_unmatched_population_keys(denoms, denexcs))

    apply_to_submeasures(@sub_measures, HQMF::PopulationCriteria::OBSERV, observs.values)

    keep = []

    @sub_measures.each do |sub|

      value = sub
      HQMF::PopulationCriteria::ALL_POPULATION_CODES.each do |type|
        key = sub[type]
        if (key)
          reference_id = @population_reference[key]
          reference = @population_criteria_by_id[reference_id] if reference_id
          if (reference)
            criteria = @population_criteria_by_key[sub[reference.type]]
            value = nil if (sub[reference.type] != reference.id)
          end
        end
      end
      keep << value if (value)
    end

    @sub_measures = keep

  end

  # add stratifications if we have them
  if (stratifications.size > 0)
    strat_subs = []
    @sub_measures.each do |sub|
      stratifications.each do |stratification|
        new_sub = sub.dup
        new_sub[HQMF::PopulationCriteria::STRAT] = stratification.id
        new_sub['stratification'] = stratification.hqmf_id
        strat_subs << new_sub
      end
    end
    @sub_measures.concat strat_subs
  end

  if (@sub_measures.length > 1)
    @sub_measures.each_with_index do |sub, i|
      sub['title'] = "Population #{i+1}"
      sub['id'] = "Population#{i+1}"
    end
  end

end
convert(key, population_criteria) click to toggle source
# File lib/hqmf-parser/converter/pass1/population_criteria_converter.rb, line 163
def convert(key, population_criteria)

  # @param [String] id
  # @param [Array#Precondition] preconditions

  preconditions = HQMF::PreconditionConverter.parse_preconditions(population_criteria[:preconditions],@data_criteria_converter)
  hqmf_id = population_criteria[:hqmf_id] || population_criteria[:id]
  id = population_criteria[:id]
  type = population_criteria[:code]
  reference = population_criteria[:reference]
  title = population_criteria[:title]

  criteria = HQMF::Converter::SimplePopulationCriteria.new(key, hqmf_id, type, preconditions, title)

  @population_criteria_by_id[id] = criteria
  @population_reference[key] = reference

  criteria

end
find_sub_measures(type, value) click to toggle source
# File lib/hqmf-parser/converter/pass1/population_criteria_converter.rb, line 149
def find_sub_measures(type, value)
  found = []
  @sub_measures.each do |sub_measure|
    found << sub_measure if sub_measure[type] and sub_measure[type] == value.id
  end
  found
end
get_unmatched_population_keys(target, source) click to toggle source

source are things like exceptions or exclusions, target are IPP, or denom we want to find any denoms or IPPs that do not have exceptions or exclusions

# File lib/hqmf-parser/converter/pass1/population_criteria_converter.rb, line 115
def get_unmatched_population_keys(target, source)
  return [] if target.length == source.length
  all_target_keys = target.values.map(&:id)
  with_ref_keys = source.values.map(&:id).map {|key| @population_criteria_by_id[@population_reference[key]].id if @population_criteria_by_id[@population_reference[key]]}
  # if we have a population without a reference, we cannot trust the results.
  return [] if with_ref_keys.include? nil
  all_target_keys - with_ref_keys
end
parse() click to toggle source
# File lib/hqmf-parser/converter/pass1/population_criteria_converter.rb, line 157
def parse
  @doc[:logic].each do |key,criteria|
    @population_criteria_by_key[key] = convert(key.to_s, criteria)
  end
end