Giter Club home page Giter Club logo

opioid-cds's Introduction

Opioid Prescribing Support Implementation Guide (FHIR STU3 (3.0.1))

This project is a joint effort by the Centers for Disease Control and Prevention (CDC) and the Office of the National Coordinator for Health IT (ONC) focused on improving processes for the development of standardized, shareable, computable decision support artifacts using the CDC 2016 Opioid Prescribing Guideline as a model case.

The current draft of the implementation guide is available here. The draft is in the final stages of cleanup before publishing the initial 1.0 release.

The guide is published under a Creative Commons license.

Change Management and Roadmap

The guide currently includes artifacts to support 6 of the 12 recommendations contained in the Opioid Guideline. Next steps for this project include additional testing and piloting of the existing artifacts, as well as potential development of additional recommendations.

Feedback and issues can be submitted via the issues page, and will be incorporated into subsequent releases as time and resources allow.

Repository and Build Information

This repository contains the source for the Opioid Prescribing Support Implementation Guide, and uses the FHIR Implementation Guide publisher to produce a FHIR Implementation Guide.

Commits to this repository will automatically trigger a new build of the IG, which will then be published to the following location:

http://build.fhir.org/ig/cqframework/opioid-cds/

Build log is available here:

http://build.fhir.org.s3-website-us-east-1.amazonaws.com/logs/cqframework/opioid-cds

Debugging information is available here:

http://build.fhir.org/ig/cqframework/opioid-cds/debug.tgz

Local Build

The HL7 IG Publisher is committed to this repository to make building as easy as possible. To build locally, clone the repository and issue the following command in the root:

java -jar "publisher.jar" -ig ig.json

This IG has intentionally not been updated to the ini-based publishing approach because it is not supported for FHIR STU3.

opioid-cds's People

Contributors

bryantaustin13 avatar brynrhodes avatar c-schuler avatar capt-mac avatar duncand avatar gtoups avatar jpercival avatar madelynarsenault avatar sliver007 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Forkers

cautree ilabutk

opioid-cds's Issues

Missing Opioids

Found in guideline 10 CQL

The CQL for “Missing Opioids” seems a bit fragile in that it relies on specific display names of urine drug tests and how they match up to specific ingredient names from the prescription drugs. This may be the best approach (as it’s a tough problem), but it probably deserves some commentary in the code and/or documentation so implementors understand that tight dependency between the medication code displays and urine drug screen code displays.

Use of Coding[0]

There are several places in the CQL where only the first code in a concept is tested for inclusion. This needs to be altered to check each code in the concept for inclusion.

Add a roadmap

Document known maintenance dependencies
Document known plans for future work.

OMTK Libraries: v0.0.1 vs v0.1.0

Based on feedback from MITRE (see MIH-47) on all Recommendation Pages: 

Two versions of the OMTK library are listed and it’s not clear what the differences are until the
implementor reads the individual files. At the least, it would be helpful to clearly indicate the
difference in the descriptions that show up in the Content listings. Given that the difference
between the files is how they get data (data source vs library w/ static data), and that they
actually represent two different use cases / implementation options, it seems they should
actually be two different libraries rather than two versions of the same library.

Commented out sort by clause in Common library MME function

Commented out code might make readers wonder if the logic really should be there but is commented out for some reason – or if it really shouldn’t be there but was never deleted. If there’s a reason, add a comment why the commented code is left intact, otherwise delete it.

Refresh Value Sets

Value Set Scope (from the VSD) is intended to be always and forever a narrative description (not coded) consisting of the Description of the value set, the Clinical Focus, and the Inclusion/Exclusion narrative. We put those elements into description, useContext[clinical-focus] and inclusion and exclusion extensions. For this refresh, the narrative should all be put into description and not usageContext, inclusion, and exclusion.

Purpose will be used to capture the reason the value set was created.

Terminology updates will be provided that we reimport from, and the updates will provide explicit content for each of these elements.

Discrepancies in logic with what is provided by Us Core

Us Core provides MedicationRequest.medication as a Reference --> Logic assumes a CodeableConcept

Us Core defines ambulatory prescriptions by setting the MedicationRequest.category to "Community" --> Logic assumes "Outpatient"

Us Core does not provide an interpretation for drug screening observations --> Logic assumes an interpretation code of "POS" to be provided

The resolution of this task requires refactoring the logic to use Us Core's modeling.

Terminology paths in the CQL

Several of the expressions in the CQL use explicit terminology paths rather than relying on the model info defaults. Are these intentional, or should they be removed to allow the model info to provide the terminology path for a resource?

Update CDS Hooks handling for 1.0 release of CDS Hooks

Now that CDS Hooks has released, update to the release version. Specifically:

  • Prefetch data in a request no longer uses the "response" wrapper
  • User moved to context, not a direct request field
  • The applyCql field will need to be modeled as an extension

Pilot feedback

Running recommendations 10 and 11 results in 404 errors when attempting to retrieve the following types of resources from the FHIR endpoint:

  • ProcedureRequest
  • ReferralRequest
  • MedicationAdministration
  • MedicationDispense

This is consistent with US Core, so the logic should be updated to remove these references, possibly with a configuration option.

Add inclusion criteria for Age

From the guideline:
This guideline is intended to apply to patients aged ≥18 years with chronic pain outside of palliative and end-of-life care.

Add Age >= 18 to all recommendations.

Update Guideline Links

The guidelines.gov site is down permanently, guideline links should be updated with the following:

Guideline URL

https://www.cdc.gov/mmwr/volumes/65/rr/rr6501e1.htm

Section IDs

1_Nonpharmacologic_therapy

2_Before_starting_opioid_therapy

3_Before_starting_and_periodically

4_When_starting_opioid_therapy

5_When_opioids_are_started

6_Long_term_opioid_use"

7_Clinicians_should_evaluate_benefits

8_starting_periodically_during_continuation

9_Clinicians_should_review

10_When_prescribing_opioids

11_Clinicians_should_avoid_prescribing

12_Clinicians_should_offer_or_arrange

Specific Recommendation URL (Example)

https://www.cdc.gov/mmwr/volumes/65/rr/rr6501e1.htm#5_When_opioids_are_started

Unnecessary Intersection

Found in guideline 10 CQL

The intersection in the CQL below seems unnecessary. “A except (A intersect B)” is logically equivalent to “A except B”.

define "Unprescribed Opioids":
  "Opioids From Most Recent Screening" except
    ("Opioids From Most Recent Screening" intersect "Prescribed Opioids")

Correct urine drug screening recommendation logic

The logic for recommendation 10 currently uses string comparison of the contents of the urine drug screening result LOINC codes to determine the missing and unprescribed opioids sets, as well as string extraction of the contents of the illicit drug screening result LOINC codes to determine illicit drugs. This needs to be corrected to just display the results as they were presented in the lab test observation resources. For the missing and uprescribed opioids, these sets need to be collapsed to a single "Evidence of opioids" result that just references all the lab results in the opioid urine drug screening and non-opioid urine drug screening tests, and for the illicit drug results, just to return the results of the illicit drug screening tests.

GetDurationInDays Incorrectly Calculates on Some Units

Found in the Common library.
MedicationOrder.dispenseRequest.expectedSupplyDuration does not constrain units on duration, so it can be any of the valid UCUM duration units. The GetDurationInDays function only addresses a (year) and mo (month) and defaults all others to days. This means a duration expressed in weeks, hours, minutes, seconds, or ms would be calculated incorrectly. Even if those units aren’t likely, it’s safest to either support these units or specifically handle ‘d’ and error out (or null out) on any unsupported units. That said, it seems that a medication supply expressed in weeks could happen.

No “Get Summary” or “Get Detail” in Guideline 10 logic

All of the other recommendations have “Get Indicator”, “Get Summary”, and “Get Detail”. This recommendation, however, only has “Get Indicator”. It seems the IG has established a convention, but this is the one artifact that does not follow it. Why?

GetDrug Function

Found in guideline 10 CQL

The GetDrug function could use some documentation indicating the approach it takes to extracting the drug name. It may also benefit from a more specific name (e.g., “GetDrugNameFromScreeningCode”). Lastly, there are some codes in the screening value set that have the form “DrugName cutoff ...” – those will never match an ingredient name. Should the GetDrug function also test for “cutoff” and truncate there?

“Get Detail” Concatenates String and List of Strings and Might Throw a Run-Time Error

Found in recommendation #4 CQL

define "Get Detail":
  'The following medication requests(s) release rates should be re-evaluated: ' + Common.GetMedicationNames("Trigger Event Prescriptions")

This isn’t valid as-is, but CQL-to-ELM tries to be smart, so it applies a SingletonFrom to the list (actually, it applies it twice for some reason). The problem is, this means that if multiple prescriptions are passed in, this CQL will throw a run-time error (per spec).

This code should be using the String Combine operator (with a comma separator) on the list before concatenating.

OMTKLogic Library Rename

Based on feedback from MITRE (see MIH-47) on all Recommendation Pages:

Two versions of the OMTK library are listed and it’s not clear what the differences are until the
implementor reads the individual files. At the least, it would be helpful to clearly indicate the
difference in the descriptions that show up in the Content listings. Given that the difference
between the files is how they get data (data source vs library w/ static data), and that they
actually represent two different use cases / implementation options, it seems they should
actually be two different libraries rather than two versions of the same library.

Rename OMTKLogic-0.1.0 to OMTKLogicWithData and OMTKLogic-0.0.1 to OMTKLogicWithCQL

Some systems do not include "system" in some codeable concepts

Some systems do not include the "system" attribute in the category element of a MedicationRequest. Though this is not explicitly a conformance issue, it is suggested as best-practice to communicate system when known. In the absence of the system, given that the category binding is preferred, using the code only is acceptable. However, we will only introduce the behavior with a configuration setting and document with this rationale.

End of Life Assessment function is somewhat confusing

Because the End of Life Assessment function takes the context prescriptions as a parameter, it implies that those are being used to make the determination. And while technically they are, they are only a small part of what the function is really doing, and most of that has nothing to do with the context prescriptions.

I suggest making End of Life Assessment an expression definition that includes everything but the context prescription check, and create a different function for that aspect that takes the prescriptions as a parameter, perhaps "Prescriptions for End of Life Medication".

define function "End of Life Assessment" (ContextPrescriptions List<MedicationRequest>):

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.