module Measures::HQMFMeasureLoader

Public Class Methods

add_fields_from_hqmf_model_hash(measure, hqmf_model_hash) click to toggle source
# File lib/measure-loader/hqmf_measure_loader.rb, line 33
def add_fields_from_hqmf_model_hash(measure, hqmf_model_hash)
  measure.measure_attributes = hqmf_model_hash[:attributes]
  measure.measure_period = hqmf_model_hash[:measure_period]
  measure.population_criteria = hqmf_model_hash[:population_criteria]

  # add observation info, note population_sets needs to have been added to the measure by now
  (hqmf_model_hash[:observations] || []).each do |observation|
    observation = CQM::Observation.new(
      hqmf_id: observation[:function_hqmf_oid],
      aggregation_type: observation[:function_aggregation_type],
      observation_function: CQM::StatementReference.new(
        library_name: hqmf_model_hash[:cql_measure_library],
        statement_name: observation[:function_name],
        hqmf_id: observation[:function_hqmf_oid]
      ),
      observation_parameter: CQM::StatementReference.new(
        library_name: hqmf_model_hash[:cql_measure_library],
        statement_name: observation[:parameter],
        hqmf_id: observation[:function_hqmf_oid]
      )
    )
    # add observation to each population set
    measure.population_sets.each { |population_set| population_set.observations << observation }
  end
end
extract_fields(hqmf_xml) click to toggle source
# File lib/measure-loader/hqmf_measure_loader.rb, line 7
def extract_fields(hqmf_xml)
  qmd = hqmf_xml.at_css('/QualityMeasureDocument')
  hqmf_id = qmd.at_css('/id')['root'].upcase
  hqmf_set_id = qmd.at_css('/setId')['root'].upcase
  title = qmd.at_css('/title')['value']
  description = qmd.at_css('/text')['value']
  cms_identifier = extract_cms_identifier(qmd)
  hqmf_version_number = qmd.at_css('/versionNumber')['value']
  cms_id = "CMS#{cms_identifier}v#{hqmf_version_number.to_i}"
  main_cql_library = qmd.at_css('/component/populationCriteriaSection/component/initialPopulationCriteria/*/*/id')['extension'].split('.').first
  measure_scoring = extract_measure_scoring(qmd)
  population_sets = extract_population_set_models(qmd, measure_scoring)

  return {
    hqmf_id: hqmf_id,
    hqmf_set_id: hqmf_set_id,
    title: title,
    description: description,
    main_cql_library: main_cql_library,
    hqmf_version_number: hqmf_version_number,
    cms_id: cms_id,
    measure_scoring: measure_scoring,
    population_sets: population_sets
  }
end

Private Class Methods

construct_population_map(measure_scoring) click to toggle source
# File lib/measure-loader/hqmf_measure_loader.rb, line 154
def construct_population_map(measure_scoring)
  case measure_scoring
  when 'PROPORTION'
    CQM::ProportionPopulationMap.new
  when 'RATIO'
    CQM::RatioPopulationMap.new
  when 'CONTINUOUS_VARIABLE'
    CQM::ContinuousVariablePopulationMap.new
  when 'COHORT'
    CQM::CohortPopulationMap.new
  else
    raise StandardError.new("Unknown measure scoring type encountered #{measure_scoring}")
  end
end
extract_cms_identifier(qmd) click to toggle source
# File lib/measure-loader/hqmf_measure_loader.rb, line 61
def extract_cms_identifier(qmd)
  cms_identifier =
    (qmd.at_xpath('./xmlns:subjectOf/xmlns:measureAttribute[xmlns:code/xmlns:originalText[@value="eCQM Identifier (Measure Authoring Tool)"]]/xmlns:value') ||
    qmd.at_xpath('./xmlns:subjectOf/xmlns:measureAttribute[xmlns:code/xmlns:originalText[@value="eMeasure Identifier (Measure Authoring Tool)"]]/xmlns:value'))
  return cms_identifier['value']
end
extract_measure_scoring(qmd) click to toggle source
# File lib/measure-loader/hqmf_measure_loader.rb, line 68
def extract_measure_scoring(qmd)
  map_from_hqmf_name_to_full_name = {
    'PROPOR' => 'PROPORTION',
    'RATIO' => 'RATIO',
    'CONTVAR' => 'CONTINUOUS_VARIABLE',
    'COHORT' => 'COHORT'
  }
  scoring = qmd.at_xpath("./xmlns:subjectOf/xmlns:measureAttribute[xmlns:code/@code='MSRSCORE']/xmlns:value").attr('code')
  scoring_full_name = map_from_hqmf_name_to_full_name[scoring]
  raise StandardError.new("Unknown measure scoring type encountered #{scoring}") if scoring_full_name.nil?
  return scoring_full_name
end
extract_population_set(population_hqmf_node) click to toggle source
# File lib/measure-loader/hqmf_measure_loader.rb, line 111
def extract_population_set(population_hqmf_node)
  ps = { populations: {}, stratifications: [], supplemental_data_elements: [] }
  ps[:id] = population_hqmf_node.at_css('id').attr('extension')
  ps[:title] = population_hqmf_node.at_css('title').attr('value')
  criteria_components = population_hqmf_node.css('component').flat_map(&:children)
  criteria_components.each do |cc|
    statement_ref = cc.at_css('precondition/criteriaReference/id')
    next if statement_ref.nil?
    statement_ref_hash = { library_name: statement_ref.attr('extension').split('.')[0],
                           statement_name: Utilities.remove_enclosing_quotes(statement_ref.attr('extension').split('.')[1]),
                           hqmf_id: cc.at_css('id').attr('root') }
    case cc.name
    when 'initialPopulationCriteria'
      ps[:populations][HQMF::PopulationCriteria::IPP] = statement_ref_hash
    when 'denominatorCriteria'
      ps[:populations][HQMF::PopulationCriteria::DENOM] = statement_ref_hash
    when 'numeratorCriteria'
      ps[:populations][HQMF::PopulationCriteria::NUMER] = statement_ref_hash
    when 'numeratorExclusionCriteria'
      ps[:populations][HQMF::PopulationCriteria::NUMEX] = statement_ref_hash
    when 'denominatorExclusionCriteria'
      ps[:populations][HQMF::PopulationCriteria::DENEX] = statement_ref_hash
    when 'denominatorExceptionCriteria'
      ps[:populations][HQMF::PopulationCriteria::DENEXCEP] = statement_ref_hash
    when 'measurePopulationCriteria'
      ps[:populations][HQMF::PopulationCriteria::MSRPOPL] = statement_ref_hash
    when 'measurePopulationExclusionCriteria'
      ps[:populations][HQMF::PopulationCriteria::MSRPOPLEX] = statement_ref_hash
    when 'stratifierCriteria'
      # Ignore Supplemental Data Elements
      next if holds_supplemental_data_elements(cc)
      ps[:stratifications] << statement_ref_hash
    when 'supplementalDataElement'
      ps[:supplemental_data_elements] << statement_ref_hash
    end
  end
  return ps
end
extract_population_set_models(qmd, measure_scoring) click to toggle source
# File lib/measure-loader/hqmf_measure_loader.rb, line 81
def extract_population_set_models(qmd, measure_scoring)
  populations = qmd.css('/component/populationCriteriaSection')
  return populations.map.with_index do |population, pop_index|
    ps_hash = extract_population_set(population)
    population_set = CQM::PopulationSet.new(
      title: ps_hash[:title],
      population_set_id: "PopulationSet_#{pop_index+1}"
    )

    population_set.populations = construct_population_map(measure_scoring)
    ps_hash[:populations].each do |pop_code,statement_ref_hash|
      population_set.populations[pop_code] = CQM::StatementReference.new(statement_ref_hash)
    end

    ps_hash[:supplemental_data_elements].each do |statement_ref_hash|
      population_set.supplemental_data_elements << CQM::StatementReference.new(statement_ref_hash)
    end

    ps_hash[:stratifications].each_with_index do |statement_ref_hash, index|
      population_set.stratifications << CQM::Stratification.new(
        hqmf_id: statement_ref_hash[:hqmf_id],
        stratification_id: "#{population_set.population_set_id}_Stratification_#{index+1}",
        title: "PopSet#{pop_index+1} Stratification #{index+1}",
        statement: CQM::StatementReference.new(statement_ref_hash)
      )
    end
    population_set
  end
end
holds_supplemental_data_elements(criteria_component_node) click to toggle source
# File lib/measure-loader/hqmf_measure_loader.rb, line 150
def holds_supplemental_data_elements(criteria_component_node)
  return criteria_component_node.at_css('component[@typeCode="COMP"]/measureAttribute/code[@code="SDE"]').present?
end