diff --git a/QICoreUpdateProcess.md b/QICoreUpdateProcess.md new file mode 100644 index 0000000..5c6c048 --- /dev/null +++ b/QICoreUpdateProcess.md @@ -0,0 +1,61 @@ +# QICore Update Process + +This document describes the process of updating a pure FHIR-based measure to a QICore-based measure + +## Extract MAT Bundle + +Place the MAT export in the bundles\mat directory and extract the contents into a sub-folder. For example: + +``` +bundles\mat\CMS143FHIR-v0-0-003-FHIR-4-0-1\CMS143FHIR-v0-0-003-FHIR-4-0-1.json +``` + +Use the CQFTooling ExtractMatBundle operation to extract the contents of the bundle: + +``` +java -jar input-cache\tooling-1.4.1-SNAPSHOT-jar-with-dependencies.jar -ExtractMatBundle bundles\mat\CMS143FHIR-v0-0-003-FHIR-4-0-1\CMS143FHIR-v0-0-003-FHIR-4-0-1.json +``` + +## Revert FHIR-based Library Changes + +Revert the changes to the following CQL libraries, because they are the FHIR-based versions and we do not want those, there are QICore versions already in the repository: + +1. FHIRHelpers +2. QICoreCommon + +## Copy Primary Measure Library + +Copy the primary measure library and rename it using the QICore4 postfix: + +``` +input\cql\POAGOpticNerveEvaluationQICore4.cql +``` + +## Update Primary Measure Library + +1. Open the QICore named file +2. Update the postfix on the library name from FHIR to QICore4 +3. Update the using statement to `using QICore version '4.1.1'` +3. Update the version of the FHIRHelpers reference to 4.0.013 (the current version for QICore support in this repository) +4. Change the SupplementalDataElementsFHIR4 reference to SupplementalDataElementsQICore4 +5. Change the MATGlobalCommonFunctionsFHIR4 reference to MATGlobalCommonFunctionsQICore4 +6. Remove the reference to FHIRCommon +7. Update references to MATGlobalCommonFunctionsFHIR4 functions that were moved to QICoreCommon: + 1. Normalize Interval -> ToInterval + 1. Abatement Period -> ToAbatementInterval + 1. Prevalence Period -> ToPrevalenceInterval + 1. Has Start -> HasStart + 1. Has End -> HasEnd + 1. Latest -> Latest + 1. Earliest -> Earliest + 1. Interval To Day Numbers -> Interval To Day Numbers + 1. Days in Period -> Days in Period +8. Update references to QICore profiles (https://hl7.org/fhir/us/qicore/profiles.html) + 1. Note that when the intent is looking for negation, use the negation profile: https://hl7.org/fhir/us/qicore/#negation-rationale + 1. Note that for QICore profiles, the profiles will enforce any "fixed" constraints, so you don't need to check those values (for example status = 'not-done' in a negation profile isn't necessary because the profile enforces that specifically) +9. Update references to extensions that are using the extension functions to the element names (the "slice name" of the extension element defined in the profile) + + + + + diff --git a/input/cql/DepressionRemissionatTwelveMonthsQICore4.cql b/input/cql/DepressionRemissionatTwelveMonthsQICore4.cql new file mode 100644 index 0000000..dcd949c --- /dev/null +++ b/input/cql/DepressionRemissionatTwelveMonthsQICore4.cql @@ -0,0 +1,195 @@ +library DepressionRemissionatTwelveMonthsQICore4 version '0.0.001' + +using QICore version '4.1.1' + +include FHIRHelpers version '4.0.013' called FHIRHelpers +include SupplementalDataElementsQICore4 version '3.0.000' called SDE +include MATGlobalCommonFunctionsQICore4 version '7.0.000' called Global +include QICoreCommon version '1.0.000' called QICoreCommon + +codesystem "LOINC": 'http://loinc.org' +codesystem "SNOMEDCT": 'http://snomed.info/sct' +codesystem "ICD10CM": 'http://hl7.org/fhir/sid/icd-10-cm' + +valueset "Bipolar Disorder": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.67.1.101.1.128' +valueset "Care Services in Long-Term Residential Facility": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1014' +valueset "Contact or Office Visit": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1080.5' +valueset "Dysthymia": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.67.1.101.1.254' +valueset "Encounter Inpatient": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307' +valueset "Hospice Care Ambulatory": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1584' +valueset "Hospice Encounter": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.1003' +valueset "Major Depression Including Remission": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.113883.3.67.1.101.3.2444' +valueset "Palliative Care Encounter": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1090' +valueset "Palliative Care Intervention": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.198.12.1135' +valueset "Palliative or Hospice Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.600.1.1579' +valueset "Personality Disorder Emotionally Labile": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.67.1.101.1.246' +valueset "Pervasive Developmental Disorder": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.105.12.1152' +valueset "PHQ 9 and PHQ 9M Tools": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.67.1.101.1.263' +valueset "Schizophrenia or Psychotic Disorder": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.105.12.1104' + +code "Birth date": '21112-8' from "LOINC" display 'Birth date' +code "Dead (finding)": '419099009' from "SNOMEDCT" display 'Dead (finding)' +code "Discharge to healthcare facility for hospice care (procedure)": '428371000124100' from "SNOMEDCT" display 'Discharge to healthcare facility for hospice care (procedure)' +code "Discharge to home for hospice care (procedure)": '428361000124107' from "SNOMEDCT" display 'Discharge to home for hospice care (procedure)' +code "Encounter for palliative care": 'Z51.5' from "ICD10CM" display 'Encounter for palliative care' +code "Functional Assessment of Chronic Illness Therapy - Palliative Care Questionnaire (FACIT-Pal)": '71007-9' from "LOINC" display 'Functional Assessment of Chronic Illness Therapy - Palliative Care Questionnaire (FACIT-Pal)' +code "Hospice care [Minimum Data Set]": '45755-6' from "LOINC" display 'Hospice care [Minimum Data Set]' +code "Yes (qualifier value)": '373066001' from "SNOMEDCT" display 'Yes (qualifier value)' + +parameter "Measurement Period" Interval + +context Patient + +define "Denominator Identification Period": + Interval[start of "Measurement Period" - 14 months, start of "Measurement Period" - 2 months ) + +define "Depression Diagnoses": + ["Condition": "Major Depression Including Remission"] + union ["Condition": "Dysthymia"] + +define "Has Long Term Care Encounter": + exists ( ["Encounter": "Care Services in Long-Term Residential Facility"] EncounterLongTermCare + where ToDate(start of EncounterLongTermCare.period)on or before + end of "Measure Assessment Period" + ) + +define "SDE Ethnicity": + SDE."SDE Ethnicity" + +define "SDE Payer": + SDE."SDE Payer" + +define "SDE Race": + SDE."SDE Race" + +define "SDE Sex": + SDE."SDE Sex" + +define "test1": + exists ( ["Encounter": "Palliative or Hospice Care"] HospiceEncounter + where HospiceEncounter.period starts during Interval[start of "Denominator Identification Period", + end of "Measure Assessment Period"] + ) + +define "Denominator Exclusions": + "Has Hospice Services" + or "Palliative Care in the Measure Assessment Period" + or "Has Long Term Care Encounter" + or "Patient Expired" + or "Has Mental Health Disorder Diagnoses" + +define "Depression Assessments Greater than 9": + ["Observation": "PHQ 9 and PHQ 9M Tools"] DepressionAssessment + where DepressionAssessment.value > 9 + +define "Depression Encounter": + ["Encounter": "Contact or Office Visit"] ValidEncounter + with "Depression Diagnoses" Depression + such that ValidEncounter.period overlaps Depression.onset + and ValidEncounter.period ends during "Denominator Identification Period" + +define "Denominator": + "Initial Population" + +define "Index Depression Assessment": + First("Depression Assessments Greater than 9" DepressionAssessment + with "Depression Encounter" DepressionEncounter + such that QICoreCommon.ToInterval(DepressionAssessment.effective)is not null + and QICoreCommon.ToInterval(DepressionAssessment.effective)during Interval[ToDate((start of DepressionEncounter.period)- 7 days), + end of DepressionEncounter.period] + sort by start of QICoreCommon.ToInterval(effective) + ) + +define "Initial Population": + AgeInYearsAt(start of QICoreCommon.ToInterval("Index Depression Assessment".effective))>= 12 + +define "Measure Assessment Period": + "Index Depression Assessment" FirstIndexAssessment + let YearAfterIndexAssessment: date from start of QICoreCommon.ToInterval ( FirstIndexAssessment.effective ) + 12 months + return Interval[YearAfterIndexAssessment - 60 days, YearAfterIndexAssessment + 60 days] + +define "Has Hospice Services": + exists ( ["Encounter": "Encounter Inpatient"] InpatientEncounter + where ( InpatientEncounter.hospitalization.dischargeDisposition ~ "Discharge to home for hospice care (procedure)" + or InpatientEncounter.hospitalization.dischargeDisposition ~ "Discharge to healthcare facility for hospice care (procedure)" + ) + and InpatientEncounter.period ends during day of Interval[start of "Denominator Identification Period", + end of "Measure Assessment Period"] + ) + or exists ( ["Encounter": "Hospice Encounter"] HospiceEncounter + where HospiceEncounter.period overlaps Interval[start of "Denominator Identification Period", + end of "Measure Assessment Period"] + ) + or exists ( ["Observation": "Hospice care [Minimum Data Set]"] HospiceAssessment + where HospiceAssessment.value ~ "Yes (qualifier value)" + and QICoreCommon.ToInterval ( HospiceAssessment.effective ) overlaps Interval[start of "Denominator Identification Period", + end of "Measure Assessment Period"] + ) + or exists ( ["ServiceRequest": "Hospice Care Ambulatory"] HospiceOrder + where HospiceOrder.authoredOn during day of Interval[start of "Denominator Identification Period", + end of "Measure Assessment Period"] + ) + or exists ( ["Procedure": "Hospice Care Ambulatory"] HospicePerformed + where QICoreCommon.ToInterval ( HospicePerformed.performed ) overlaps Interval[start of "Denominator Identification Period", + end of "Measure Assessment Period"] + ) + +define "Numerator": + Last(["Observation": "PHQ 9 and PHQ 9M Tools"] DepressionAssessment + where ToDate(start of QICoreCommon.ToInterval(DepressionAssessment.effective))during "Measure Assessment Period" + sort by start of QICoreCommon.ToInterval(effective) + ).value < 5 + +define "Has Mental Health Disorder Diagnoses": + exists ( ( ["Condition": "Bipolar Disorder"] + union ["Condition": "Personality Disorder Emotionally Labile"] + union ["Condition": "Schizophrenia or Psychotic Disorder"] + union ["Condition": "Pervasive Developmental Disorder"] ) MentalHealthDisorderDiagnoses + where MentalHealthDisorderDiagnoses.onset on or before + end of "Measure Assessment Period" + ) + +define "Patient Expired": + Patient.deceased on or before + end of "Measure Assessment Period" + +define "Palliative Care in the Measure Assessment Period": + exists ( ["Observation": "Functional Assessment of Chronic Illness Therapy - Palliative Care Questionnaire (FACIT-Pal)"] PalliativeAssessment + where QICoreCommon.ToInterval ( PalliativeAssessment.effective ) overlaps Interval[start of "Denominator Identification Period", + end of "Measure Assessment Period"] + ) + or exists ( ["Condition": "Encounter for palliative care"] PalliativeDiagnosis + where PalliativeDiagnosis.onset overlaps Interval[start of "Denominator Identification Period", + end of "Measure Assessment Period"] + ) + or exists ( ["Encounter": "Palliative Care Encounter"] PalliativeEncounter + where PalliativeEncounter.period overlaps Interval[start of "Denominator Identification Period", + end of "Measure Assessment Period"] + ) + or exists ( ["Procedure": "Palliative Care Intervention"] PalliativeIntervention + where QICoreCommon.ToInterval ( PalliativeIntervention.performed ) overlaps Interval[start of "Denominator Identification Period", + end of "Measure Assessment Period"] + ) + +define "Stratification 1": + "Index Depression Assessment" IndexAssessment + where AgeInYearsAt(date from start of QICoreCommon.ToInterval(IndexAssessment.effective))in Interval[12, 17] + +define "Stratification 2": + "Index Depression Assessment" IndexAssessment + where AgeInYearsAt(date from start of QICoreCommon.ToInterval(IndexAssessment.effective))>= 18 + +define function "test"(): + exists ( ["Observation": "Functional Assessment of Chronic Illness Therapy - Palliative Care Questionnaire (FACIT-Pal)"] PalliativeAssessment + where QICoreCommon.ToInterval ( PalliativeAssessment.effective ) overlaps "Measurement Period" + ) + or exists ( ["Condition": "Encounter for palliative care"] PalliativeDiagnosis + where PalliativeDiagnosis.onset overlaps "Measure Assessment Period" + ) + or exists ( ["Encounter": "Palliative Care Encounter"] PalliativeEncounter + where PalliativeEncounter.period overlaps "Measurement Period" + ) + or exists ( ["Procedure": "Palliative Care Intervention"] PalliativeIntervention + where QICoreCommon.ToInterval ( PalliativeIntervention.performed ) overlaps "Measurement Period" + ) + diff --git a/input/cql/POAGOpticNerveEvaluationQICore4.cql b/input/cql/POAGOpticNerveEvaluationQICore4.cql new file mode 100644 index 0000000..656f142 --- /dev/null +++ b/input/cql/POAGOpticNerveEvaluationQICore4.cql @@ -0,0 +1,102 @@ +library POAGOpticNerveEvaluationQICore4 version '0.0.003' + +using QICore version '4.1.1' + +include FHIRHelpers version '4.0.013' called FHIRHelpers +include SupplementalDataElementsQICore4 version '3.0.000' called SDE +include MATGlobalCommonFunctionsQICore4 version '7.0.000' called Global +include QICoreCommon version '1.0.000' called QICoreCommon + +codesystem "ActCode": 'http://terminology.hl7.org/CodeSystem/v3-ActCode' + +valueset "Care Services in Long-Term Residential Facility": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1014' +valueset "Cup to Disc Ratio": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1333' +valueset "Face-to-Face Interaction": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1048' +valueset "Medical Reason": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1007' +valueset "Nursing Facility Visit": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1012' +valueset "Office Visit": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001' +valueset "Ophthalmological Services": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1285' +valueset "Optic Disc Exam for Structural Abnormalities": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1334' +valueset "Outpatient Consultation": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1008' +valueset "Primary Open-Angle Glaucoma": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.326' + +code "virtual": 'VR' from "ActCode" display 'virtual' + +parameter "Measurement Period" Interval + +context Patient + +define "SDE Ethnicity": + SDE."SDE Ethnicity" + +define "SDE Payer": + SDE."SDE Payer" + +define "SDE Race": + SDE."SDE Race" + +define "SDE Sex": + SDE."SDE Sex" + +define "Denominator": + "Initial Population" + +define "Denominator Exceptions": + exists "Medical Reason for Not Performing Cup to Disc Ratio" + or exists "Medical Reason for Not Performing Optic Disc Exam" + +define "Qualifying Encounter During Measurement Period": + ( ["Encounter": "Office Visit"] + union ["Encounter": "Ophthalmological Services"] + union ["Encounter": "Outpatient Consultation"] + union ["Encounter": "Nursing Facility Visit"] + union ["Encounter": "Care Services in Long-Term Residential Facility"] ) QualifyingEncounter + where QualifyingEncounter.period during "Measurement Period" + and QualifyingEncounter.class !~ "virtual" + +define "Initial Population": + AgeInYearsAt(date from start of "Measurement Period")>= 18 + and exists "Primary Open Angle Glaucoma Encounter" + +define "Primary Open Angle Glaucoma Encounter": + "Qualifying Encounter During Measurement Period" ValidQualifyingEncounter + with ["Condition": "Primary Open-Angle Glaucoma"] PrimaryOpenAngleGlaucoma + such that QICoreCommon.ToPrevalenceInterval( PrimaryOpenAngleGlaucoma ) overlaps ValidQualifyingEncounter.period //Encounterperiod + +define "Cup to Disc Ratio Performed with Result": + ["Observation": "Cup to Disc Ratio"] CupToDiscExamPerformed + with "Primary Open Angle Glaucoma Encounter" EncounterWithPOAG + such that QICoreCommon.ToInterval( CupToDiscExamPerformed.effective ) during EncounterWithPOAG.period + where CupToDiscExamPerformed.value is not null + +define "Optic Disc Exam Performed with Result": + ["Observation": "Optic Disc Exam for Structural Abnormalities"] OpticDiscExamPerformed + with "Primary Open Angle Glaucoma Encounter" EncounterWithPOAG + such that QICoreCommon.ToInterval( OpticDiscExamPerformed.effective ) during EncounterWithPOAG.period + where OpticDiscExamPerformed.value is not null + +define "Numerator": + exists "Cup to Disc Ratio Performed with Result" + and exists "Optic Disc Exam Performed with Result" + +define "Medical Reason for Not Performing Cup to Disc Ratio": + ["ObservationNotDone": "Cup to Disc Ratio"] CupToDiscExamNotPerformed + with "Primary Open Angle Glaucoma Encounter" EncounterWithPOAG + such that CupToDiscExamNotPerformed.issued during EncounterWithPOAG.period + where CupToDiscExamNotPerformed.notDoneReason in "Medical Reason" + +/* +define "Medical Reason for Not Performing Optic Disc Exam": + ["Observation": "Optic Disc Exam for Structural Abnormalities"] OpticDiscExamNotPerformed + with "Primary Open Angle Glaucoma Encounter" EncounterWithPOAG + such that OpticDiscExamNotPerformed.issued during EncounterWithPOAG.period + where OpticDiscExamNotPerformed.status = 'cancelled' + and FHIRCommon."Extension" ( OpticDiscExamNotPerformed, 'http://hl7.org/fhir/us/qicore/StructureDefinition-qicore-notDone' ).value = true + and FHIRCommon."Extension" ( OpticDiscExamNotPerformed, 'http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-notDoneReason' ).value in "Medical Reason" +*/ + +define "Medical Reason for Not Performing Optic Disc Exam": + ["ObservationNotDone": "Optic Disc Exam for Structural Abnormalities"] OpticDiscExamNotPerformed + with "Primary Open Angle Glaucoma Encounter" EncounterWithPOAG + such that OpticDiscExamNotPerformed.issued during EncounterWithPOAG.period + where OpticDiscExamNotPerformed.notDoneReason in "Medical Reason"