3984 rework immunization cql unit test (#4005)

* 3984 added test resources

* 3984 added unit test for ontario immunization POC

* #3084 reworking unit tests to showcase immunization evaluation POC

Co-authored-by: Anna <anna@MacBook-Pro.local>
This commit is contained in:
alackerbauer 2022-09-08 14:16:16 +02:00 committed by GitHub
parent 002a7dc670
commit d22651a7c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 64168 additions and 640 deletions

View File

@ -2,234 +2,64 @@ package ca.uhn.fhir.cql.r4;
import ca.uhn.fhir.cql.BaseCqlR4Test;
import ca.uhn.fhir.cql.r4.provider.MeasureOperationsProvider;
import ca.uhn.fhir.util.BundleUtil;
import org.apache.commons.collections.map.HashedMap;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.r4.model.Base64BinaryType;
import org.hl7.fhir.r4.model.Bundle;
import org.hl7.fhir.r4.model.DateTimeType;
import org.hl7.fhir.r4.model.IdType;
import org.hl7.fhir.r4.model.Library;
import org.hl7.fhir.r4.model.Measure;
import org.hl7.fhir.r4.model.MeasureReport;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Date;
import java.util.List;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* This testing class and the used resources are work in progress and will likely be subject to change.
* This class tests the functionality of $evaluate-measure for the ImmunizationStatus use case
* A full documentation of this use case as well as more information on the test data that is used can be found here:
* https://gitlab.com/smilecdr-open-source/immunization-cql-poc/-/blob/main/documentation/Immunization-CQL-Guide.md
*/
public class CqlMeasureEvaluationR4ImmunizationTest extends BaseCqlR4Test {
Logger ourLog = LoggerFactory.getLogger(CqlMeasureEvaluationR4ImmunizationTest.class);
@Autowired
MeasureOperationsProvider myMeasureOperationsProvider;
@Autowired
MeasureOperationsProvider myMeasureOperationsProvider;
private static final String MY_TESTBUNDLE_MMR_SIMPLE = "r4/immunization/testdata-bundles/Testbundle_3Patients_1MMRVaccinated_1PVaccinated_1NoVaccination.json";
private static final String MY_TESTBUNDLE_MMR_INCL_PRACTITIONER = "r4/immunization/testdata-bundles/Testbundle_Patients_By_Practitioner.json";
private static final String MY_FHIR_COMMON = "r4/immunization/Fhir_Common.json";
private static final String MY_FHIR_HELPERS = "r4/immunization/Fhir_Helper.json";
private static final String MY_TEST_DATA = "r4/immunization/Patients_Encounters_Immunizations_Practitioners.json";
private static final String MY_IMMUNIZATION_CQL_RESOURCES = "r4/immunization/Measure_Library_Ontario_ImmunizationStatus.json";
private static final String MY_VALUE_SETS = "r4/immunization/Terminology_ValueSets.json";
//overall testing function including bundle manipulation and evaluation and assertion
protected void testMeasureScoresByBundleAndCQLLocation(String theBundleLocation, String theCQLMeasureLocation, String thePractitionerRef, Map<String, Double> theExpectedScores) throws IOException {
//load provided bundle and replace placeholder CQL content of Library with CQL content of provided file location
Bundle bundle = loadBundleFromFileLocationAndManipulate(theBundleLocation, theCQLMeasureLocation);
//we require at least one MeasureReport in the bundle
List<MeasureReport> measureReports = findMeasureReportsOrThrowException(bundle);
//evaluate each measure report of the provided bundle
for (MeasureReport report : measureReports) {
double expectedScore = theExpectedScores.get(report.getIdentifierFirstRep().getValue());
evaluateSingleReport(report, thePractitionerRef, expectedScore);
}
}
//overall testing function including bundle manipulation and evaluation and assertion
protected void testMeasureScoresByBundleAndCQLLocation(String theBundleLocation, String theCQLMeasureLocation, String thePractitionerRef, double theExpectedScore) throws IOException {
//load provided bundle and replace placeholder CQL content of Library with CQL content of provided file location
Bundle bundle = loadBundleFromFileLocationAndManipulate(theBundleLocation, theCQLMeasureLocation);
//we require at least one MeasureReport in the bundle
List<MeasureReport> measureReports = findMeasureReportsOrThrowException(bundle);
//evaluate each measure report of the provided bundle
for (MeasureReport report : measureReports) {
evaluateSingleReport(report, thePractitionerRef, theExpectedScore);
}
//compare 2 double values to assert no difference between expected and actual measure score
protected void assertMeasureScore(MeasureReport theReport, double theExpectedScore) {
//find the predefined expected score by looking up the report identifier
double epsilon = 0.000001d;
double actualScore = theReport.getGroupFirstRep().getMeasureScore().getValue().doubleValue();
assertEquals(theExpectedScore, actualScore, epsilon);
}
protected void evaluateSingleReport (MeasureReport theReport, String thePractitionerRef, double theExpectedScore) {
MeasureReport actualEvaluatedReport = this.evaluateMeasure(theReport, thePractitionerRef);
ourLog.info("Score of evaluation: {}", actualEvaluatedReport.getGroupFirstRep().getMeasureScore().getValue());
assertMeasureScore(actualEvaluatedReport, theExpectedScore);
}
//double compare to assert no difference between expected and actual measure score
protected void assertMeasureScore(MeasureReport theReport, double theExpectedScore) {
//find the predefined expected score by looking up the report identifier
double epsilon = 0.000001d;
double actualScore = theReport.getGroupFirstRep().getMeasureScore().getValue().doubleValue();
assertEquals(theExpectedScore, actualScore, epsilon);
}
//evaluates a Measure to produce one certain MeasureReport
protected MeasureReport evaluateMeasureByMeasure(String theMeasureId, String thePractitionerRef, String thePatientRef) {
//evaluates a Measure to produce one certain MeasureReport
protected MeasureReport evaluateMeasure(MeasureReport theMeasureReport, String thePractitionerRef) {
String measureId = this.getMeasureId(theMeasureReport);
String patientId = null;
//only when the type of the MeasureReport is set to 'individual', there is a patient required as a subject (i.e. not for a 'summary' report)
if (theMeasureReport.getSubject().getReference() != null) {
patientId = this.getPatientId(theMeasureReport);
}
String periodStart = this.getPeriodStart(theMeasureReport);
String periodEnd = this.getPeriodEnd(theMeasureReport);
String measureReportIdentifier = theMeasureReport.getIdentifierFirstRep().getValue();
String measureReportType = theMeasureReport.getTypeElement().getValueAsString();
//only when the type of the MeasureReport is set to 'individual', there is a patient required as a subject (i.e. not for a 'summary' report)
if (patientId == null) {
ourLog.info("Evaluating Measure '{}' for MeasureReport '{}' of type '{}': [{} - {}]", measureId, measureReportIdentifier, measureReportType, periodStart, periodEnd);
} else {
ourLog.info("Evaluating Measure '{}' for MeasureReport '{}' of type '{}' for Patient '{}' [{} - {}]", measureId, measureReportIdentifier, measureReportType, patientId, periodStart, periodEnd);
}
return this.myMeasureOperationsProvider.evaluateMeasure(new IdType("Measure", measureId),
periodStart, periodEnd, null,
"subject", patientId,
null, thePractitionerRef, null, null, null, null, myRequestDetails);
}
//helper function to manipulate a test bundle
//loads a bundle from theBundleLocation: requirement: containing 1 exact FHIR Measure
//finds the relevant measure, determines the related Library and replaces the CQL content of that Library with a separate CQL file
//the CQL file defined by theCQLLocation contains regular CQL text and is automatically transformed into base64 content and automatically replaces the Library content
//this process keeps manual testing simple, as the only place to change the CQL logic is by adding a new CQL file (containing no test resources and no other content) and writing a unit test with that CQL file path
protected Bundle loadBundleFromFileLocationAndManipulate(String theBundleLocation, String theCQLLocation) throws IOException {
Bundle bundle = parseBundle(theBundleLocation);
//manipulate Bundle
Measure measure = findExactlyOneMeasuresOrThrowException(bundle);
Library libraryToManipulate = findLibraryById(bundle, measure.getLibrary().get(0).getValue());
replaceCQLOfLibrary(libraryToManipulate, theCQLLocation);
loadBundle(bundle, myRequestDetails);
return bundle;
}
//requirement: test bundle must contain exactly one Measure resource
protected Measure findExactlyOneMeasuresOrThrowException(Bundle theBundle) {
List<Measure> measures = BundleUtil.toListOfResourcesOfType(myFhirContext, theBundle, Measure.class);
if (measures == null || measures.isEmpty()) {
throw new IllegalArgumentException(String.format("No measures found for Bundle %s", theBundle.getId()));
} else if (measures.size() > 1) {
throw new IllegalArgumentException(String.format("Too many measures found for Bundle %s. Only one measure is allowed for this automated testing setup.", theBundle.getId()));
}
return measures.get(0);
}
//requirement: test bundle must contain at least one MeasureReport resource
protected List<MeasureReport> findMeasureReportsOrThrowException(Bundle theBundle) {
List<MeasureReport> reports = BundleUtil.toListOfResourcesOfType(myFhirContext, theBundle, MeasureReport.class);
if (reports == null || reports.isEmpty()) {
throw new IllegalArgumentException(String.format("No measure reports found for Bundle %s", theBundle.getId()));
}
return reports;
}
//returns a Library resource of a bundle by a given ID
protected Library findLibraryById(Bundle theBundle, String theLibraryId) {
List<Library> libraries = BundleUtil.toListOfResourcesOfType(myFhirContext, theBundle, Library.class);
return libraries.stream().filter(lib -> lib.getId().equals(theLibraryId)).findFirst().orElse(null);
}
//the provided Library resource only contains a placeholder CQL
//this function replaces this placeholder CQL with the content of a specified file
protected Library replaceCQLOfLibrary(Library theLibrary, String theCQLFileLocation) throws IOException {
String decodedCQLString = stringFromResource(theCQLFileLocation);
//replace cql in library
String encodedCQLString = Base64.getEncoder().encodeToString(decodedCQLString.getBytes(StandardCharsets.UTF_8));
Base64BinaryType encodedCQLBinary = new Base64BinaryType();
encodedCQLBinary.setValueAsString(encodedCQLString);
theLibrary.getContentFirstRep().setDataElement(encodedCQLBinary);
return theLibrary;
}
// TODO: In R4 the Subject will not necessarily be a Patient.
public String getPatientId(MeasureReport measureReport) {
String[] subjectRefParts = measureReport.getSubject().getReference().split("/");
String patientId = subjectRefParts[subjectRefParts.length - 1];
return patientId;
}
public String getMeasureId(MeasureReport measureReport) {
String[] measureRefParts = measureReport.getMeasure().split("/");
String measureId = measureRefParts[measureRefParts.length - 1];
return measureId;
}
public String getPeriodStart(MeasureReport measureReport) {
Date periodStart = measureReport.getPeriod().getStart();
if (periodStart != null) {
return toDateString(periodStart);
}
return null;
}
public String getPeriodEnd(MeasureReport measureReport) {
Date periodEnd = measureReport.getPeriod().getEnd();
if (periodEnd != null) {
return toDateString(periodEnd);
}
return null;
}
public String toDateString(Date date) {
return new DateTimeType(date).getValueAsString();
}
@Test
public void test_Immunization_MMR_Individual_Vaccinated() throws IOException {
Map<String, Double> expectedScoresByIdentifier = new HashedMap();
//expected result: individual should be in numerator because Patient is MMR vaccinated
expectedScoresByIdentifier.put("measureReportIndividualVaccinatedPatient", 1.0);
//expected result: individual should not be in numerator because Patient is not MMR vaccinated (only Pertussis)
expectedScoresByIdentifier.put("measureReportIndividualNotMMRVaccinatedPatient", 0.0);
//expected result: individual should not be in numerator because Patient is not at all vaccinated (no associated Immmunization resource)
expectedScoresByIdentifier.put("measureReportIndividualNotAtAllVaccinatedPatient", 0.0);
//expected result: summary confirms that 1 out of all 3 patients are MMR immunized
expectedScoresByIdentifier.put("measureReportSummary", 1.0 / 3.0);
//note: all those CQL files specified as the second parameter produce the exact same outcome with the given test resources provided by the first parameter.
//TODO: tests are dependent and will fail if the order is incorrect. --> clean up tests
this.testMeasureScoresByBundleAndCQLLocation(MY_TESTBUNDLE_MMR_SIMPLE, "r4/immunization/cqls/3-Vaccine-Codes-Defined-By-ValueSet-MMR-Vaccine-Codes.cql", null, expectedScoresByIdentifier);
this.testMeasureScoresByBundleAndCQLLocation(MY_TESTBUNDLE_MMR_SIMPLE, "r4/immunization/cqls/1-Explicit-Vaccine-Codes-From-Any-System.cql", null, expectedScoresByIdentifier);
this.testMeasureScoresByBundleAndCQLLocation(MY_TESTBUNDLE_MMR_SIMPLE, "r4/immunization/cqls/2-Explicit-Vaccine-Codes-And-Systems.cql", null, expectedScoresByIdentifier);
}
@Test
public void test_Immunization_ByPractitioner_MMR_Summary() throws IOException {
//half of dreric' s patients (total of 2) are vaccinated, so 1/2 is vaccinated.
this.testMeasureScoresByBundleAndCQLLocation(MY_TESTBUNDLE_MMR_INCL_PRACTITIONER, "r4/immunization/cqls/3-Vaccine-Codes-Defined-By-ValueSet-MMR-Vaccine-Codes.cql", "Practitioner/dreric", 1.0/2.0);
//of drfrank's patients (total of 1), none are vaccinated
this.testMeasureScoresByBundleAndCQLLocation(MY_TESTBUNDLE_MMR_INCL_PRACTITIONER, "r4/immunization/cqls/3-Vaccine-Codes-Defined-By-ValueSet-MMR-Vaccine-Codes.cql", "Practitioner/drfrank", 0.0/1.0);
return this.myMeasureOperationsProvider.evaluateMeasure(new IdType("Measure", theMeasureId), null, null, null, "subject", thePatientRef, null, thePractitionerRef, null, null, null, null, myRequestDetails);
}
@Test
public void test_Immunization_ByAge() throws IOException {
//be aware that this test will fail eventually, because this patient will at some point become one years old (today - birthdate > 1 year)
//this patient is not yet immunized, because too young. so it won't be counted as a denominator patient and therefore the measure score is corrected to have a higher percentage
//of dreric' s patients, all are vaccinated, because the second patient who is not vaccinated yet doesn't meet the age criteria (denominator), so 1/1 is vaccinated.
this.testMeasureScoresByBundleAndCQLLocation(MY_TESTBUNDLE_MMR_INCL_PRACTITIONER, "r4/immunization/cqls/4-Patients-ByAge.cql", "Practitioner/dreric", 1.0/1.0);
}
public void test_Immunization_Ontario_Schedule() throws IOException {
//given
loadBundle(MY_FHIR_COMMON);
loadBundle(MY_FHIR_HELPERS);
loadBundle(MY_TEST_DATA);
loadBundle(MY_VALUE_SETS);
loadBundle(MY_IMMUNIZATION_CQL_RESOURCES);
//when
MeasureReport reportBasic = evaluateMeasureByMeasure("ImmunizationStatus", null, null);
MeasureReport reportByPractitioner = evaluateMeasureByMeasure("ImmunizationStatus", "Practitioner/ImmunizationStatus-practitioner-3", null);
MeasureReport reportIndividualImmunized = evaluateMeasureByMeasure("ImmunizationStatus", null, "ImmunizationStatus-1-year-patient-1");
MeasureReport reportIndividualNotImmunized = evaluateMeasureByMeasure("ImmunizationStatus", null, "ImmunizationStatus-1-year-patient-2");
//then
assertMeasureScore(reportBasic, 0.25);
assertMeasureScore(reportByPractitioner, 0.285714);
assertMeasureScore(reportIndividualImmunized, 1.0);
assertMeasureScore(reportIndividualNotImmunized, 0.0);
}
}

File diff suppressed because one or more lines are too long

View File

@ -1,344 +1,8 @@
{
"resourceType": "Bundle",
"id": "bundle-mmr-single",
"id": "bundle-fhir-helpers",
"type": "transaction",
"entry": [
{
"resource": {
"resourceType": "ValueSet",
"id": "mmr-vaccine-codes",
"url": "http://hl7.org/fhir/ValueSet/mmr-vaccine-codes",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "03",
"display": "MMR"
},
{
"code": "94",
"display": "MMRV"
}
]
}, {
"system": "urn:oid:1.2.36.1.2001.1005.17",
"concept": [
{
"code": "MMR",
"display": "MMR"
},
{
"code": "MMRCSL",
"display": "MMR II"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/mmr-vaccine-codes"
}
},
{
"resource": {
"resourceType": "Patient",
"id": "mmrVaccinatedPatient",
"name": [
{
"family": "Morrow",
"given": [
"Isaac"
]
}
],
"gender": "male",
"birthDate": "1955-11-05"
},
"request": {
"method": "PUT",
"url": "Patient/mmrVaccinatedPatient"
}
},
{
"resource": {
"resourceType": "Patient",
"id": "notMMRVaccinatedPatient",
"name": [
{
"family": "Wills",
"given": [
"Eira"
]
}
],
"gender": "female",
"birthDate": "2001-05-22"
},
"request": {
"method": "PUT",
"url": "Patient/notMMRVaccinatedPatient"
}
},
{
"resource": {
"resourceType": "Immunization",
"status": "completed",
"vaccineCode": {
"coding": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"code": "03",
"display": "MMR"
}
],
"text": "MMR according to http://hl7.org/fhir/valueset-vaccine-code.html"
},
"patient": {
"reference": "Patient/mmrVaccinatedPatient"
},
"occurrenceDateTime": "2017-04-25"
},
"request": {
"method": "POST",
"url": "Immunization"
}
},
{
"resource": {
"resourceType": "Immunization",
"status": "completed",
"vaccineCode": {
"coding": [
{
"system": "urn:oid:1.2.36.1.2001.1005.17",
"code": "Pe",
"display": "Pertussis"
}
],
"text": "MMR according to http://hl7.org/fhir/valueset-vaccine-code.html"
},
"patient": {
"reference": "Patient/notMMRVaccinatedPatient"
},
"occurrenceDateTime": "2019-01-02"
},
"request": {
"method": "POST",
"url": "Immunization"
}
},
{
"resource": {
"resourceType": "Patient",
"id": "notAtAllVaccinatedPatient",
"name": [
{
"family": "Lee",
"given": [
"Jane"
]
}
],
"gender": "female",
"birthDate": "1993-12-08"
},
"request": {
"method": "PUT",
"url": "Patient/notAtAllVaccinatedPatient"
}
},
{
"resource": {
"resourceType": "Measure",
"id": "mmrImmunizationMeasure",
"name": "mmrImmunizationMeasure",
"title": "Is immunized for MMR",
"status": "active",
"group": [
{
"id": "group-1",
"population": [
{
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "initial-population",
"display": "InitialPopulation"
}
]
},
"criteria": {
"language": "text/cql",
"expression": "InitialPopulation"
}
},
{
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "numerator",
"display": "Numerator"
}
]
},
"criteria": {
"language": "text/cql",
"expression": "Numerator"
}
},
{
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "denominator",
"display": "Denominator"
}
]
},
"criteria": {
"language": "text/cql",
"expression": "Denominator"
}
}
]
}
],
"relatedArtifact": [
{
"type": "depends-on",
"resource": "Library/library-FHIRHelpers-4.0.1"
}
],
"scoring": {
"coding": [
{
"code": "ratio"
}
]
},
"library": [
"Library/immunizationCQLLibrary"
]
},
"request": {
"method": "PUT",
"url": "Measure/mmrImmunizationMeasure"
}
},
{
"resource": {
"resourceType": "MeasureReport",
"status": "complete",
"identifier": [
{
"value": "measureReportIndividualVaccinatedPatient"
}
],
"type": "individual",
"measure": "Measure/mmrImmunizationMeasure",
"date": "2014-04-01",
"subject": {
"reference": "Patient/mmrVaccinatedPatient"
},
"period": {
"start": "2022-01-01",
"end": "2023-03-31"
}
},
"request": {
"method": "POST",
"url": "MeasureReport"
}
},
{
"resource": {
"resourceType": "MeasureReport",
"identifier":
[
{
"value": "measureReportIndividualNotMMRVaccinatedPatient"
}
],
"status": "complete",
"type": "individual",
"measure": "Measure/mmrImmunizationMeasure",
"date": "2014-04-01",
"subject": {
"reference": "Patient/notMMRVaccinatedPatient"
},
"period": {
"start": "2014-01-01",
"end": "2014-03-31"
}
},
"request": {
"method": "POST",
"url": "MeasureReport"
}
},
{
"resource": {
"resourceType": "MeasureReport",
"identifier":
[
{
"value": "measureReportIndividualNotAtAllVaccinatedPatient"
}
],
"status": "complete",
"type": "individual",
"measure": "Measure/mmrImmunizationMeasure",
"date": "2014-04-01",
"subject": {
"reference": "Patient/notAtAllVaccinatedPatient"
},
"period": {
"start": "2014-01-01",
"end": "2014-03-31"
}
},
"request": {
"method": "POST",
"url": "MeasureReport"
}
},
{
"resource": {
"resourceType": "MeasureReport",
"identifier":
[
{
"value": "measureReportSummary"
}
],
"status": "complete",
"type": "summary",
"measure": "Measure/mmrImmunizationMeasure",
"date": "2014-04-01",
"period": {
"start": "2014-01-01",
"end": "2014-03-31"
}
},
"request": {
"method": "POST",
"url": "MeasureReport"
}
},
{
"resource": {
"resourceType": "Library",

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,612 @@
{
"resourceType": "Bundle",
"id": "valuesets-ImmunizationStatus-bundle",
"type": "transaction",
"entry": [
{
"resource": {
"resourceType": "ValueSet",
"id": "2.16.840.1.113883.3.464.1003.196.11.1212",
"meta": {
"versionId": "27",
"lastUpdated": "2021-09-14T01:00:46.000-04:00"
},
"url": "http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.196.11.1212",
"version": "20210914",
"name": "DTaP Vaccine",
"status": "active",
"date": "2021-09-14T01:00:46-04:00",
"publisher": "NCQA PHEMUR",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"version": "20220615",
"concept": [
{
"code": "106",
"display": "diphtheria, tetanus toxoids and acellular pertussis vaccine, 5 pertussis antigens"
},
{
"code": "107",
"display": "diphtheria, tetanus toxoids and acellular pertussis vaccine, unspecified formulation"
},
{
"code": "110",
"display": "DTaP-hepatitis B and poliovirus vaccine"
},
{
"code": "120",
"display": "diphtheria, tetanus toxoids and acellular pertussis vaccine, Haemophilus influenzae type b conjugate, and poliovirus vaccine, inactivated (DTaP-Hib-IPV)"
},
{
"code": "146",
"display": "Diphtheria and Tetanus Toxoids and Acellular Pertussis Adsorbed, Inactivated Poliovirus, Haemophilus b Conjugate (Meningococcal Protein Conjugate), and Hepatitis B (Recombinant) Vaccine."
},
{
"code": "20",
"display": "diphtheria, tetanus toxoids and acellular pertussis vaccine"
},
{
"code": "50",
"display": "DTaP-Haemophilus influenzae type b conjugate vaccine"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/2.16.840.1.113883.3.464.1003.196.11.1212"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-HB",
"url": "http://hl7.org/fhir/ValueSet/vaccine-HB",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "08",
"display": "hepatitis B vaccine, pediatric or pediatric/adolescent dosage"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-HB"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-HPV-9",
"url": "http://hl7.org/fhir/ValueSet/vaccine-HPV-9",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "137",
"display": "HPV, unspecified formulation"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-HPV-9"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-HZ",
"url": "http://hl7.org/fhir/ValueSet/vaccine-HZ",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "121",
"display": "zoster vaccine, live"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-HZ"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-Inf",
"url": "http://hl7.org/fhir/ValueSet/vaccine-Inf",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "135",
"display": "influenza, high dose seasonal, preservative-free"
},
{
"code": "140",
"display": "Influenza, seasonal, injectable, preservative free"
},
{
"code": "141",
"display": "Influenza, seasonal, injectable"
},
{
"code": "144",
"display": "seasonal influenza, intradermal, preservative free"
},
{
"code": "155",
"display": "Seasonal, trivalent, recombinant, injectable influenza vaccine, preservative free"
},
{
"code": "168",
"display": "Seasonal trivalent influenza vaccine, adjuvanted, preservative free"
},
{
"code": "185",
"display": "Seasonal, quadrivalent, recombinant, injectable influenza vaccine, preservative free"
},
{
"code": "197",
"display": "influenza, high-dose seasonal, quadrivalent, .7mL dose, preservative free"
},
{
"code": "205",
"display": "influenza, seasonal vaccine, quadrivalent, adjuvanted, .5mL dose, preservative free"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-Inf"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-Men-C-ACYW",
"url": "http://hl7.org/fhir/ValueSet/vaccine-Men-C-ACYW",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "108",
"display": "meningococcal ACWY vaccine, unspecified formulation"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-Men-C-ACYW"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-Men-C-C",
"url": "http://hl7.org/fhir/ValueSet/vaccine-Men-C-C",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "103",
"display": "meningococcal C conjugate vaccine"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-Men-C-C"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "2.16.840.1.113883.3.464.1003.196.11.1235",
"meta": {
"versionId": "17",
"lastUpdated": "2021-02-02T15:59:43.000-05:00"
},
"url": "http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.196.11.1235",
"version": "20170504",
"name": "Measles, Mumps and Rubella (MMR) Vaccine",
"status": "active",
"date": "2017-05-04T01:00:13-04:00",
"publisher": "NCQA PHEMUR",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"version": "20220615",
"concept": [
{
"code": "03",
"display": "measles, mumps and rubella virus vaccine"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/2.16.840.1.113883.3.464.1003.196.11.1235"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-MMRV",
"url": "http://hl7.org/fhir/ValueSet/vaccine-MMRV",
"name": "measles, mumps, rubella, and varicella virus vaccine",
"status": "active",
"date": "2017-05-04T01:00:13-04:00",
"publisher": "NCQA PHEMUR",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"version": "20220615",
"concept": [
{
"code": "94",
"display": "measles, mumps, rubella, and varicella virus vaccine"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/vaccine-MMRV"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "2.16.840.1.113883.3.464.1003.1158",
"meta": {
"versionId": "5",
"lastUpdated": "2022-02-02T01:02:05.000-05:00"
},
"url": "http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.1158",
"version": "20220202",
"name": "Adult Pneumococcal Vaccine",
"status": "active",
"date": "2022-02-02T01:02:05-05:00",
"publisher": "NCQA PHEMUR",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"version": "20220615",
"concept": [
{
"code": "109",
"display": "pneumococcal vaccine, unspecified formulation"
},
{
"code": "133",
"display": "pneumococcal conjugate vaccine, 13 valent"
},
{
"code": "152",
"display": "Pneumococcal Conjugate, unspecified formulation"
},
{
"code": "215",
"display": "Pneumococcal conjugate vaccine 15-valent (PCV15), polysaccharide CRM197 conjugate, adjuvant, preservative free"
},
{
"code": "216",
"display": "Pneumococcal conjugate vaccine 20-valent (PCV20), polysaccharide CRM197 conjugate, adjuvant, preservative free"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/2.16.840.1.113883.3.464.1003.1158"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-Pneu-P-23",
"url": "http://hl7.org/fhir/ValueSet/vaccine-Pneu-P-23",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "33",
"display": "pneumococcal polysaccharide vaccine, 23 valent"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-Pneu-P-23"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-pregnancy-status",
"url": "http://hl7.org/fhir/ValueSet/valuesets-pregnancy-status",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://loinc.org",
"concept": [
{
"code": "82810-3",
"display": "Pregnancy status"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-pregnancy-status"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "2.16.840.1.113883.3.464.1003.196.11.1232",
"meta": {
"versionId": "21",
"lastUpdated": "2021-02-02T10:34:28.000-05:00"
},
"url": "http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.196.11.1232",
"version": "20180310",
"name": "Rotavirus Vaccine (3 dose schedule)",
"status": "active",
"date": "2018-03-10T01:00:08-05:00",
"publisher": "NCQA PHEMUR",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"version": "20220615",
"concept": [
{
"code": "116",
"display": "rotavirus, live, pentavalent vaccine"
},
{
"code": "122",
"display": "rotavirus vaccine, unspecified formulation"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/2.16.840.1.113883.3.464.1003.196.11.1232"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-Tdap",
"url": "http://hl7.org/fhir/ValueSet/vaccine-Tdap",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "115",
"display": "tetanus toxoid, reduced diphtheria toxoid, and acellular pertussis vaccine, adsorbed"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-Tdap"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-Tdap-IPV",
"url": "http://hl7.org/fhir/ValueSet/vaccine-Tdap-IPV",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "115",
"display": "tetanus toxoid, reduced diphtheria toxoid, and acellular pertussis vaccine, adsorbed"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-Tdap-IPV"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-Td",
"url": "http://hl7.org/fhir/ValueSet/vaccine-Td",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "139",
"display": "Td(adult) unspecified formulation"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-Td"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-vaccine-Var",
"url": "http://hl7.org/fhir/ValueSet/vaccine-Var",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://hl7.org/fhir/sid/cvx",
"concept": [
{
"code": "21",
"display": "varicella virus vaccine"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-vaccine-Var"
}
},
{
"resource": {
"resourceType": "ValueSet",
"id": "valuesets-weeks-of-gestation",
"url": "http://hl7.org/fhir/ValueSet/valuesets-weeks-of-gestation",
"version": "4.0.1",
"status": "active",
"experimental": false,
"date": "2019-11-01T09:29:23+11:00",
"compose": {
"include": [
{
"system": "http://loinc.org",
"concept": [
{
"code": "49051-6",
"display": "Gestational age in weeks"
}
]
}
]
}
},
"request": {
"method": "PUT",
"url": "ValueSet/valuesets-weeks-of-gestation"
}
}
]
}

View File

@ -1,22 +0,0 @@
library Retrieve
using FHIR version '4.0.1'
include FHIRHelpers version '4.0.1'
context Patient
define "MMR Vaccinated":
[Immunization] Immu where
(Immu.vaccineCode.coding[0].code=('03')) or
(Immu.vaccineCode.coding[0].code=('94')) or
(Immu.vaccineCode.coding[0].code=('MMR')) or
(Immu.vaccineCode.coding[0].code=('MMRV')) or
(Immu.vaccineCode.coding[0].code=('MMRCSL'))
define "InitialPopulation":
true
define "Denominator":
true
define "Numerator":
exists("MMR Vaccinated")

View File

@ -1,32 +0,0 @@
library Retrieve
using FHIR version '4.0.1'
include FHIRHelpers version '4.0.1'
codesystem VaccineCVX: 'http://hl7.org/fhir/sid/cvx'
codesystem VaccineOID: 'urn:oid:1.2.36.1.2001.1005.17'
context Patient
define "MMR Vaccinated 03":
[Immunization: Code '03' from VaccineCVX] Immu where Immu.status in {'completed'}
define "MMR Vaccinated 94":
[Immunization: Code '94' from VaccineCVX] Immu where Immu.status in {'completed'}
define "MMR Vaccinated MMR":
[Immunization: Code 'MMR' from VaccineOID] Immu where Immu.status in {'completed'}
define "MMR Vaccinated MMRCSL":
[Immunization: Code 'MMRCSL' from VaccineOID] Immu where Immu.status in {'completed'}
define "InitialPopulation":
true
define "Denominator":
true
define "Numerator":
exists("MMR Vaccinated 03") or
exists("MMR Vaccinated 94") or
exists("MMR Vaccinated MMR") or
exists("MMR Vaccinated MMRCSL")

View File

@ -1,20 +0,0 @@
library Retrieve
using FHIR version '4.0.1'
include FHIRHelpers version '4.0.1'
valueset "MMR Vaccinated": 'http://hl7.org/fhir/ValueSet/mmr-vaccine-codes'
context Patient
define "InitialPopulation":
[Patient]
define "Denominator":
[Patient]
define "Numerator":
"Qualifying Immunizations"
define "Qualifying Immunizations":
[Immunization: "MMR Vaccinated"] ValidImmunization
where ValidImmunization.status = 'completed'

View File

@ -1,20 +0,0 @@
library Retrieve
using FHIR version '4.0.1'
include FHIRHelpers version '4.0.1'
valueset "MMRVaccinated": 'http://hl7.org/fhir/ValueSet/mmr-vaccine-codes'
context Patient
define "InitialPopulation":
[Patient]
define "Denominator":
[Patient] myPatient where (myPatient.birthDate before (Today() - 1 year))
define "Numerator":
"QualifyingImmunizations"
define "QualifyingImmunizations":
[Immunization: "MMRVaccinated"] myImmunization
where myImmunization.status = 'completed'