diff --git a/lib/constraints.rb b/lib/constraints.rb index 78a57d4..c5e6301 100644 --- a/lib/constraints.rb +++ b/lib/constraints.rb @@ -16,7 +16,9 @@ class Constraints 'one_white' => lambda {|results| results.any? {|bundle| race(bundle) == 'White'}}, 'one_black' => lambda {|results| results.any? {|bundle| race(bundle) == 'Black or African American'}}, 'one_hispanic' => lambda {|results| results.any? {|bundle| ethnicity(bundle) == 'Hispanic or Latino'}}, - 'one_smoker' => lambda {|results| results.any? {|bundle| smoker(bundle) }} + 'one_smoker' => lambda {|results| results.any? {|bundle| smoker(bundle) }}, + 'one_hypertension_condition' => lambda {|results| results.any? {|bundle| hypertension_condition(bundle) && observation_diastolic(bundle)}}, + 'one_hypertension_observation_high' => lambda {|results| results.any? {|bundle| hypertension_observation_high(bundle)}}, } CONSTRAINTS_MRBURNS = { @@ -35,6 +37,8 @@ class Constraints 'one_black', 'one_hispanic', 'one_smoker', + 'one_hypertension_condition', + 'one_hypertension_observation_high' ] REQUIRED_PROFILES = [ @@ -47,6 +51,7 @@ class Constraints 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-documentreference', 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter', 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-goal', + 'https://hl7.org/fhir/activitydefinition.html', 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-immunization', 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-implantable-device', 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-observation-lab', @@ -136,6 +141,31 @@ def self.smoker(bundle) smoking_statuses.map {|status| status.value.text}.include? 'Current every day smoker' end + + def self.hypertension_condition(bundle) + entries = bundle.entry.select {|entry| entry.resource.is_a?(FHIR::Condition)} + conditions = entries.map {|entry| entry.resource} + conditions.map {|condition| condition.code.text}.include? 'Hypertension' + end + + + def self.observation_diastolic(bundle) + entries = bundle.entry.select {|entry| entry.resource.is_a?(FHIR::Observation)} + observations = entries.map {|entry| entry.resource} + observations.map {|observation| observation&.component&.at(0)&.code&.text.to_s}.include? 'Diastolic Blood Pressure' + end + + + # 90 <= Diastolic <= 100 + def self.hypertension_observation_high(bundle) + entries = bundle.entry.select {|entry| entry.resource.is_a?(FHIR::Observation)} + observations = entries.map {|entry| entry.resource} + hypertension_observation_statuses = observations.select {|observation| observation&.component&.at(0)&.code&.text == 'Diastolic Blood Pressure'} + hypertension_observation_statuses.map {|observation| (observation&.component&.at(0)&.valueQuantity&.value.to_i>=90 && observation&.component&.at(0)&.valueQuantity&.value.to_i<=100) } + end + + + def self.has(bundle, fhir_class) bundle.entry.any? {|entry| entry.resource.is_a?(fhir_class)} end diff --git a/lib/modifications.rb b/lib/modifications.rb index 305dc86..dbd2fb6 100644 --- a/lib/modifications.rb +++ b/lib/modifications.rb @@ -373,6 +373,29 @@ def self.modify!(results, random_seed = 3) goal_provenance.resource.target.last.reference = "urn:uuid:#{goal.id}" end +=begin + activitydefinition_bundle = results.find { |b| DataScript::Constraints.has(b, FHIR::Activitydefinition) } + unless activitydefinition_bundle + activitydefintion_bundle = results.find { |b| DataScript::Constraints.has(b, FHIR::Patient) } + activitydefinition = FHIR::Activitydefinition.new + activitydefinition.meta = FHIR::Meta.new + activitydefinition.meta.profile = ['https://hl7.org/fhir/activitydefinition.html'] + activitydefinition.id = SecureRandom.uuid + activitydefinition.status = 'active' + activitydefinition.description = "controlling hypertension" + goal.subject = { reference: "urn:uuid:#{DataScript::Constraints.patient(goal_bundle).id}" } + goal_target = FHIR::Goal::Target.new + goal_target.dueDate = Time.now.strftime("%Y-%m-%d") + goal.target << goal_target + goal_bundle.entry << create_bundle_entry(goal) + goal_provenance = goal_bundle.entry.find { |e| e.resource.resourceType == 'Provenance' } + goal_provenance.resource.target << FHIR::Reference.new + goal_provenance.resource.target.last.reference = "urn:uuid:#{goal.id}" + end +=end + + + observation_profiles_valueCodeableConcept_required = [ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-smokingstatus' ] diff --git a/lib/synthea/synthea.jar b/lib/synthea/synthea.jar index 2664a89..275447a 100644 Binary files a/lib/synthea/synthea.jar and b/lib/synthea/synthea.jar differ diff --git a/uscore-data-script.rb b/uscore-data-script.rb index 52ac52a..7fbf255 100644 --- a/uscore-data-script.rb +++ b/uscore-data-script.rb @@ -179,7 +179,6 @@ # Save selections tik = Time.now.to_i output_data = 'output/data' -output_validation = 'output/validation' puts "Overwriting selections into ./#{output_data}" Dir.mkdir(output_data) unless File.exists?(output_data) FileUtils.rm Dir.glob("./#{output_data}/*.json") @@ -217,10 +216,6 @@ file = File.open(filename,'w:UTF-8') file.write(json) file.close - # run FHIR validator on output - puts 'Running FHIR validator on output.' - validation_file = "#{output_validation}/#{patient_bundle_absent_name.entry.first.resource.id}.txt" - system( "java -jar lib/org.hl7.fhir.validator.jar #{filename} -version 4.0.1 -ig hl7.fhir.us.core#3.1.0 > #{validation_file}" ) end tok = Time.now.to_i @@ -263,32 +258,6 @@ FileUtils.rm Dir.glob("./#{output}/**/#{resourceType}.ndjson") end -# Validating -tik = Time.now.to_i -output_validation = 'output/validation' -puts "Validating... Output logged in ./#{output_validation}" -Dir.mkdir(output_validation) unless File.exists?(output_validation) -FileUtils.rm Dir.glob("./#{output_validation}/*.txt") -selections.each do |bundle| - if bundle.resourceType == 'Bundle' - id = bundle.entry.first.resource.id - else - id = bundle.id - end - # run FHIR validator on output - filename = "#{output_data}/#{id}.json" - validation_file = "#{output_validation}/#{id}.txt" - system( "java -jar lib/org.hl7.fhir.validator.jar #{filename} -version 4.0.1 -ig hl7.fhir.us.core > #{validation_file}" ) -end - -if patient_bundle_absent_name - filename = "#{output_data}/#{patient_bundle_absent_name.entry.first.resource.id}.json" - # run FHIR validator on output - validation_file = "#{output_validation}/#{patient_bundle_absent_name.entry.first.resource.id}.txt" - system( "java -jar lib/org.hl7.fhir.validator.jar #{filename} -version 4.0.1 -ig hl7.fhir.us.core > #{validation_file}" ) -end -tok = Time.now.to_i -puts " Validated #{selections.length + (patient_bundle_absent_name ? 1 : 0)} files (#{DataScript::TimeUtilities.pretty(tok - tik)})." # Print the amount of time it took... stop = Time.now.to_i