Health Intersections Pty Ltd

  • Home
  • About
  • Ask me a question about HL7
  • CDA Tools
  • Courses
    • V2 to CDA Mapping Course
      • Enrolment Form
  • Roadmap to Blog
  • Text Display Formats
    • HL7 v2 FT Type
    • HTML Colours
    • PIT Specification
RSS

Good Exchange Specifications: Microsoft vs Apple

Posted on February 13, 2012 by Grahame Grieve
1 comment

One of the early choices you have to make in building a specification is around how to leverage your domain analysis. It’s a question of how you use your story boards. There’s the Apple way, and there’s the Microsoft way.

The Apple Way

The Apple way is simple: you document your story boards, and then you develop a solution to the story boards that you agreed to. You’re going to produce a tightly crafted, simple workflow/product that solves those story boards very effectively. In as much as you’ve covered their workflow, the users will love the outcome, and it’ll just work for them. If you haven’t covered their work flow, well, they just ain’t going to be a fan-boy.

The Microsoft Way

This isn’t so simple: once you’ve documented your story boards, then you generalise the things you see, and solve the general case. You’re going to produce a flexible robust product that can be tailored to all sorts of usages you never imagined. Users will never love your products, but they’ll keep using and buying them, because they can do what they need.

Btw, I learnt about these two “Ways” by personal revelation in a vision by both Steve and Bill, so you can take them as gospel. Of course not – this is just how I feel they work based on using their products extensively. And, of course, this is a stereotype. Anyone who’s tried to teach their grandma how to shoot rogue applications on their iPhone knows that Apple can produce some spectacularly bad UI as well. And I’m sure I’ve seen really tight focused and easy to use UI from Microsoft somewhere – but by and large, these stereotypes have held true for a long time.

The same two can apply to standards – you can do your business analysis, and solve just that problem in the standard. It’ll be easy to use, fit for purpose. It’ll just work. That is, it’ll just work when the story boards (etc) fit to the implementers problem. If they don’t…. well, there’s always another standard. If you generalise the requirements, then your standard will always be more complicated than any single user wants – but at least it’ll work (all right, at least there’s a high chance it’ll sort of work!)

Straw Poll in the comments: which works better?

Categories: Interoperability, Standards

What’s a Good Exchange Specification?

Posted on February 13, 2012 by Grahame Grieve
2 comments

There’s a lot of different standards for exchanging healthcare information out there. Here’s one reason from the ever funny XKCD:

But there’s actually some very good reasons why there’s many competing standards. Well, maybe there’s lots of solid reasons, even if they aren’t good reasons, and they won’t go away just by wishing they weren’t there.

The problem is that there’s lots of different perspectives about what makes a good exchange standard. I’m going make a series of posts describing some of the issues. I’m going to make them as fun as possible, but they are all real issues.

 

Categories: Interoperability, Standards

An API is just another exchange specification?

Posted on February 8, 2012 by Grahame Grieve
5 comments

Because the specifications for data exchange are so hard, a number of government projects around the world are focusing on releasing libraries that wrap the complexities of the standard behind a local implementation that is easier to use. At least, that’s the theory. (or, alternatively, vendors provide such libraries. sometimes, vendors provide the libraries commercially with a government subsidy).

Here’s some examples:

  • Medicare Australia with several secure data exchange standards for biliing (example)
  • Quicksilver’s Spinal Tap
  • The Everest Framework in Canada
  • NEHTA’s reference platform implementation (password protected link – sorry)

There’s plenty of other examples, but that’ll do. At HL7, we’re doing a lot of serious thinking about how to develop a standard – what is a good standard. (It’s going to be a bit of a theme on my blog for a little while). At the recent San Antonio meeting, someone proposed to me that the focus shouldn’t be on making the standard easier to understand or implement, but on providing wrapping libraries that do that for you.

The basic notion here is that you can wrap complexity of the standard behind a simple API that dramatically reduces the time to implement the specification. Me, I’m not convinced. Obviously, there’s some pragmatic issues, such as what platforms you’re going to provide support for (Win32? OSX? iOS? Unix (which)? Java? DotNet? LAMP?),  can you provide an architecture that is usable in a variety of application architectures, and how do you support it? But putting those practical issues aside, why does it make implementation easier/quicker?

As far as I can see, here’s the reasons to think that an API is easier to work with than an exchange specification:

  • An API is a fine grained interface, while messages are coarse grained. Fine grained interfaces are easier to work with for a programmer (are they?)
  • A library can do local validation as the content is built – but I don’t know why it can do more validation than otherwise could occur on the message content
  • A library can integrate the bits of the data exchange format with platform dependencies (e.g. network and particularly digital signatures, yuck!)
  • The API can hide needless documentation and syntactical complexity in the standard
  • the API covers a narrower set of use cases than the exchange standard

The last points are the important ones – if the standard is needlessly complicated, then you can hide that behind an interface with busy work – but the library can’t hide the real issues. If a particular data element has to be coded with the correct code, if you have to implement a particular workflow, the API can’t do that for you. That’s where the real challenge is – or should be.

But the most important issue is that very often the API covers a narrower set of use cases. This arises because the designers of the API can say “oh, that’s an advanced use case – if they want to do that, they’ll have to use the exchange format directly”. I think that this is the biggest reason why an API in front of the data exchange format can be easier to use. (Actually, greenCDA is just a another case of this). Whenever this happens, the question should always be asked of the exchange format – does it cater for unneeded use cases? (the answer might be either yes or no)

But for me, in practice, an API is just another exchange format that I have to deal with – this data item goes here, that one comes from over here, etc. It’s only easier if the API is well designed. It sometimes turns out to be harder because the simplications don’t work for me, and because bugs in the API are really hard to diagnose and resolve. Any vendor who’s used the Medicare Australia libraries will know what I mean there. I wonder – which do vendors really prefer? I myself prefer not to use an API, but I note that most vendors working NEHTA are choosing to use the NEHTA reference platform.

Categories: Interoperability

Response to Critical Safety Issue for the PCEHR

Posted on February 7, 2012 by Grahame Grieve
24 comments

While I was on leave at Tamboon Inlet (and completely off the grid), Eric Browne made a post strongly critical of CDA on his blog:

I contend that it is nigh on impossible with the current HL7 CDA design, to build sufficient checks into the e-health system to ensure these sorts of errors won’t occur with real data, or to detect mismatch errors between the two parts of the documents once they have been sent to other providers or lodged in PCEHR repositories.

Eric’s key issue is that

One major problem with HL7 CDA, as currently specified for the PCEHR, is that data can be supplied simultaneously in two distinct, yet disconnected forms – one which is “human-readable”, narrative text displayable to a patient or clinician in a browser  panel;  the other comprising highly structured  and coded clinical “entries” destined for later computer processing.

It’s odd to hear the central design tenant of CDA described as a “major problem with CDA”. I think this betrays a fundamental misunderstanding of what CDA is, and why it exists. These misunderstandings were echoed in a number of the comments. CDA is built around the notion of a the twin forms – a human presentation, and a computer processible version. Given this, it’s an obvious issue about how the two relate to each other, and I spend at least an hour discussing this every time I do a CDA tutorial.

Eric complains that clinicians have no way to inspect how the data and the narrative relate, nor is there an algorithm to test this:

However, the critical part of the document containing the structured, computer-processable data upon which decision support  is to be based is totally opaque to clinicians, and cannot be readily viewed or checked in any meaningful way

This is true – and it would be a whole lot more concerning except that this is true of all the forms of exchange we currently have – it’s just that they don’t have any human fall back to act as a fail safe check. Of course, in a perfect world, this wouldn’t be necessary. The data elements would be clearly and unambiguously defined, everyone would agree with them, no one would use anything extra, and all the implementations would be perfect. This is not the world we live in – it’s a pure governance fantasy, but one that some of Eric’s commenters share:

I can’t imagine going into any true IT organisation and proposing storing the same information constructed in two different ways in the same document, and with no computable requirement to have them synchronised (Andrew Patterson)

My initial response was, no, of course not. But in actual fact, this is ubiquitous in health care, and CDA is designed for the reality that we have. Note that CDA is designed for exchange, for the cracks between systems that cannot or might not agree on data fields. People might not like that, but the PCEHR is very much living between the cracks of the existing clinical systems, unless we replace all of them now.

CDA itself doesn’t have much to say about the relationship between the data and the text. It implies that there must be one, but because CDA covers such a wide variety of use cases, CDA itself doesn’t make the rules; instead, the rules are delegated to CDA implementation guides to make comment about this. And a number of the NEHTA implementation guides do exactly that in response to the same concerns Eric expresses.

Back to Eric’s concerns:

Each clinician is expected to attest the validity of any document prior to sharing it with other healthcare providers, consumers or systems, and she can do so by viewing the HTML rendition of the “human-readable” part of the document… However, the critical part of the document containing the structured, computer-processable data upon which decision support  is to be based is totally opaque to clinicians, and cannot be readily viewed or checked in any meaningful way.

Where as now, with HL7 v2, they can’t see it, and can’t attest the validity at all. Instead, they must trust their systems, and there is no level of human to human fall back position at all. With CDA, they still must trust their systems, because they still can’t see the data portion – that is no different. But they also have a level of human to human communication that doesn’t exist with v2. CDA solves this problem, but does not solve the fact that we still have to trust the systems to exchange the data correctly to get computable outcomes (aside: I’m far from convinced that the clinical community wants more than a modicum of computable outcomes at the moment).

Of course, this still leaves the question of whether the data and the narrative agrees with each or not. The important thing that you have to consider in this regard is how do you build a document? How would you actually build a document that contains narrative and data that disagree with each other? Once you start pursuing this question, it becomes clear that a system or clinician that produces CDA documents that disagree between narrative and data have a serious underlying problem. Note the emphasis on clinician there. In a genuine clinical system producing genuine clinical documents, the system can’t prevent clinicians form producing incoherent documents – it’s up to the clinician. It seems to me, from watching the debate, that whether you think that is good depends on whether you’re a clinician or not.

I’ll illustrate this by describing two scenarios.

  1. A (e.g. pathology) system produces CDA entirely from structured data. The document is produced in the background with no human interaction. In this case, how can the narrative and the data disagree? Well, if a programmer or a user misunderstood the definitions or intended/actual usage of the data items.
  2. A (e.g. GP) system generates a CDA document using user selected available data from the patient record using a clinician defined template, loads the section narratives with their underlying data into an editor, and lets the clinician edit the narrative (usually in order to add additional details or clarifications not found in the structured data). In this case, the narrative can disagree from the data if the user updates the document to disagree with their own data.

In either case, there is an underlying problem that would not be detectable at the end-point were only the data provided. CDA can’t solve these problems – but the fact that CDA contains both narrative and text doesn’t create them either

Finally, the actual usefulness of containing narrative and data is unexpectedly illustrated by Eric’s own post, in an example where he appears to think that he’s criticising the presence of both narrative and data.

As an illustration of the sort of problems  we might see arising, I proffer the following. I looked at 6 sample discharge summary CDA documents  provided by the National E-health Transition Authority recently. Each discharge summary looked fine when the human-readable part was displayed in a browser, yet unbeknownst to any clinician that might do the same, buried in the computer-processable part, I found that each patient was dead at the time of discharge. One patient had been flagged as having died on the day they had been born – 25 years prior to the date that they were purportedly discharged from hospital! Fortunately this was just test, not “live” data.

Firstly, Eric shouldn’t have used technical examples provided to illustrate syntax to application developers as if they are also semantically meaningful (most NEHTA examples aren’t due to time constraints, though I’ve done one or two – it’s a lot slower than you think to produce really meaningful examples). But the date of death is actually buried in the portion of CDA that is data only, not narrative. And because Eric chose the wrong stylesheet (not the NEHTA one), his system didn’t know about the date of death, and ignored it. Had CDA actually contained a narrative portion for the header too, this would not have been a problem. Which brings me back to my earlier point: in the world we live in, not everyone shares the same set of data and processes them with no errors etc.

CDA isn’t a perfect specification – nothing is (subject of a series of posts to come) – and it does have it’s own complexity. But the problems aren’t due to containing both narrative and data. Eric says:

I know of no software anywhere in the world that can compare the two distinct parts of these electronic documents to reassure the clinician that what is being sent in the highly structured and coded part matches the simple, narrative part of the document to which they attest. This is due almost entirely to the excessive complexity and design of the current HL7 CDA standard.

This I completely disagree with. The inability to automatically determine whether what is being sent in the highly structured part matches the narrative is not “entirely due” to the complexity of CDA, but is almost entirely due to the problem itself.

Finally, Eric says that

NEHTA should provide an application, or an algorithm,  that allows users to decode and view all the hidden, coded clinical contents of any of the PCEHR electronic document types, so that those contents can be compared with the human-readable part of the document.

Actually, this is a pretty good idea, though I don’t know whether NEHTA can or not (on practical grounds). I guess that we should be able to, since the Implementation Guides will increasingly make rules about what the narrative must do, and we already provide examples based on rendering the structured data in the narrative. But my own experience trying to interpret AS 4700.1 HL7 v2 messages (Australian Diagnostic Reports) suggests that a canonical rendering application is even more necessary for that – but who could define such a beast?

 

Categories: Australia, CDA, Interoperability, NEHTA

FHIR Report to HL7 Architecture Co-ordination Council

Posted on January 19, 2012 by Grahame Grieve
2 comments

This is a written version of the report I gave to the HL7 Architecture Co-ordination Council (technically, the SAIF roll-out project), at HL7 concerning the development of the FHIR project (It has considerable similarity to the last post, made before the HL7 meeting):

At the last meeting, in San Diego, the RFH project (as it was known then) was an idea, with considerable smoke and mirrors. This meeting, we (myself, Lloyd McKenzie, and Ewout Kramer) have rounded it out, and it’s now a complete methodology (where complete means, no missing holes, not finished and ready to use). FHIR has been fairly thoroughly reviewed in various working groups within HL7 and while there are many identified specific issues with the specification, the overall shape of the specification has generally gained enthusiastic support.

The FHIR development team now has the following 4 priorities for ongoing development in the near future:

  • Collaborating with several domain content work groups in HL7 to either review or develop resources. In particular, we have a formal collaboration with the Pharmacy workgroup, and informal ones with Patient Administration and Orders and Observations. In addition to building actual resources, these collaborations are as much about building processes, knowledge and culture around doing good resource design
  • Further developing the underlying tool chain, the RIM mapping framework, the way terminology is handled, and the integration with existing HL7 content and publishing frameworks
  • Doing implementations to test the basic framework ideas. (there is already a server publicly available, but more on that later)
  • Writing a SAIF mapping between the canonical SAIF (HL7′s internal master architecture framework) and the FHIR specification (this will in effect be the formal FHIR methodology definition)

We have provisional agreement around transferring the FHIR ownership and development resources to HL7 – this should be resolved soon, and then the FHIR specification will more from it’s current place to either http://www.fhir.org or somewhere on the HL7 website.

We’ve also taken this opportunity to strengthen the nascent governance council, and I’m very pleased to welcome Bo Dagnall to the team – FHIR already owes some it’s overall design to Bo, and he’ll provide some real insight and discipline to the council and the overall architecture of FHIR

Categories: FHIR, RFH, Standards

FHIR Report for the San Antonio Meeting

Posted on January 16, 2012 by Grahame Grieve
2 comments

The prototype HL7 standard I am working on with a few others used to be called “RFH” (Resources for Health) but the marketing committee has now branded it “FHIR” (pronounced “Fire”, as in HL7 Fire). It can be found here.

At the last HL7 meeting (San Diego), RFH was just an idea, with a lot of smoke and mirrors behind it, and a whole lot of unresolved questions about how the specification would be developed and implemented. Since the last meeting, I’ve worked with several friends (principally Lloyd McKenzie and Ewout Kramer) to resolve all these outstanding issues, and polish up the rough parts. Now FHIR is ready for wider review.

Major changes:

  • There’s now a methodology for producing resources, and we’re ready to start working with a few key committees to start producing resources
  • There’s messaging, document and SOA frameworks now, and the RESTful framework is much better defined
  • Policy around extensibility – which is a central piece of managing the complexity of standards – has been extensively discussed and described
  • A whole bunch of implementation collateral has been added – schemas, examples, reference implementations, UML definitions, resource dictionaries
  • The terminology binding/definition part has been simplified and finished
  • The data types were overhauled and simplified further with substantial further input from CIMI members

What comes next?

  • Defining the key clinical resources – synopsis, medications, problem lists, vitals and other diagnostic reports (Lab already exists) and validating the existing resources with the relevant domain committees
  • Finishing out the reference implementations
  • Validation and conformance tooling
  • testing the specification in the real world
  • ..starting the long march towards ballot

When will FHIR be discussed at the San Antonio meeting?

This is the (possible) times I know about:

  • Mon Q2, RIMBAA: RIM with DDD principles, includes discussion about FHIR(?) (George De La Torre, and no, I don’t know anything more about this)
  • Mon Q3, RIMBAA/Tooling: implementation tools, standardized resources to be incorporated into software as API’s as beiing discussed in MnM from Grahame’s FHIR (again, I’m not sure when this will be discussed)
  • Tues Q1, MnM: Ongoing FHIR development (MnM sponsors the FHIR project)
  • Tues Q6, Tooling BOF (after the Corepoint party, thanks to Dave): introduction to FHIR (aimed at content developers and implementers)
  • Wed Q1, ITS: ITS consideration of FHIR (technology focus)
  • Wed Q6, RIMBAA BOF: FHIR topics of interest to RIMBAA (Ewout/Lloyd)

In addition, we are trying to find a time to discuss FHIR with the pharmacy workgroup, but I haven’t yet got a time for that.

Who is FHIR for?

Finally, a note about the target audience for FHIR: The HL7 v2, CDA, and v3 specifications are in the latter part of the development cycle. Adopters have invested substantial amounts in them, and aren’t lightly going to simply adopt a new specification. Yet most implementers and HL7 members believe that there must be a better way to define standards, and that HL7 needs to find it.

I’m regularly approached by projects or companies who are doing new types of integration, building new architectures around web and mobile technologies, looking to exchange data cheaply. They ask me what specification to use – they’re looking for an option that fits their architecture and technology and offers a good balance between useability and re-useability. I don’t have anything good to recommend to them – v2 is old tech, venerable, but not flexible and adaptable. CDA is a document spec, and while bits are useful, it’s too heavy weight to be a good option. And v3 messaging… no. Looking wider afield, the SOA specifications, IHE specs, nothing really hits the sweet spot… yet there’s a lot of this work going on.

For now, we are aiming to meet these requirements with FHIR – green fields sites. Also, we’ll be trying to position FHIR as a logical option for augmenting existing v2 implementations. If FHIR works, if it’s a real good way to produce an implementable specification, then it will start to get a good rap, and then we’ll start looking at the wider questions around HL7 product life – but we’d like to get there as soon as possible, because there are large questions in that regard.

Categories: FHIR, RFH, Standards

Health Intersections is 1 year old

Posted on December 21, 2011 by Grahame Grieve
No comments

I’m back after a few days down following a hosting problem.The original host took my site down since it was occupying too much CPU time. I don’t know what the cause of that is, but we’ve taken the opportunity to migrate to a better host. I’ll be bringing the old site back piece by piece so that hopefully we can pin point the problem if there is one.

While we were down, the one year anniversary of the establishment of Health Intersections passed by. I’ve been much busier than I expected – actually, much busier than I wanted to be. The government’s putting the pressure on with the PCEHR implementation here, and that’s keeping me real busy. Still, I’ve been glad to work with all sorts of clients, and to keep my association with Kestral (previous employer) alive. As well as continuing to be tethered to reality through maintaining HL7Connect - a dinky little interface engine that does HL7 v2, CDA and (soon) DICOM. It’s not loaded with features, but it’s simple to use, and it’s price point is unmatched.

Perhaps the most significant thing I’ve done this year is drafting what I called “Resources for Health”, which HL7 has adopted with real interest as a way forward for HL7 standards. HL7 has proposed that it be renamed to Fast Healthcare Interoperability Resources, and so I’ve renamed my draft – which has had a little bit of work since the last meeting, though not as much as we hoped.

Categories: Australia, Uncategorized

Everything you didn’t want to know about the GTS data type

Posted on December 12, 2011 by Grahame Grieve
6 comments

Of all the HL7 / ISO 21090 data types, by far the most complex is the General Timing Specification (GTS). (Aside: I usually say that CD is the most complex data type, but it’s not; it’s just that people use CD as hard as they can, where as one glance at GTS convinces almost everybody to keep things as simple as they possibly can.)

GTS in Data types R2 / ISO 21090

It’s easier to consider GTS in R2, and then work backwards to explain what GTS is in data types R1 (CDA). In ISO 21090, a GTS is a QSET(TS) – a set of TS. This is a mathematical set – some type of expression that defines what times are “in the set”, rather than a computational set, which lists the values of the set. In the case of ISO 21090, the expression can be built by combining simple times and intervals of times with grouped and nested operations such as Union, Intersection, etc.

Formally, these are defined as a set of classes like this:

 

Type Basic Summary
QSET Abstract base type. Anywhere QSET(T) is specified, one of the types below must be used
IVL A simple interval from start time to end time (may be open and therefore continuing)
PIVL A simple interval of time that repeats regularly (the interval might be assumed, like as in “3 times a day” or explicit, such as “twice a day for half an hour”)
QSI The intersection of two other sets (a simple case: the intersection of 2 times a day for 10 minutes from 10-Aug 2011 to 10-Sept 2011)
QSU The union of two sets of times (perhaps, 3 times a day on week days, and twice a day on weekends)
QSD The difference between two sets of times
QSP The periodic hull of two sets of times:  )
QSH The convex hull of two sets of times:
QSS A list of times, where the time covered by the imprecision of the time is in the set (i.e. 24-April 2012 means all of that day is in the set). This is simpler to use than IVL where single days are covered
QSC A code that identifies a set of times. The codes are only those defined by HL7 or ISO members, and include common clinical codes, as well as holidays:

  • AM  Every morning at institution specified times.
  • PM  Every afternoon at institution specified times.
  • BID  Two times a day at institution specified time
  • TID  Three times a day at institution specified time
  • QID  Four times a day at institution specified time

(note: Alert HL7 readers might wonder where EIVL is. Since this is my blog, I get to send it off to Antarctica from where I’ll retrieve it when it’s a cold day in hell)

That’s pretty confusing – so let’s clarify slightly by an example:  “every other Tuesday in the season from the (US holidays) Memorial Day to Labor Day in the years 2002 and 2003”. This is built as an expression of the intersection between 3 sets:

  • every other Tuesday;
  • the years 2002 and 2003;
  • the season between Memorial Day and Labor Day.
<example xsi:type="QSI_TS"><!-- intersection, because it is a QSI -->
 <!-- every other Tuesday -->
 <term xsi:type='PIVL_TS' alignment='DW'>
  <phase lowClosed='true' highClosed='false'>
   <low value='20001202'/>
   <high value='20001203'/>
  </phase>
  <period value='2' unit='wk'/>
 </term>

 <!-- 2002 and 2003 -->
 <term xsi:type='IVL_TS' lowClosed='true' highClosed='false'>
  <low value='20020101'/>
  <high value='20040101'/>
 </term>
 <!-- season between Memorial Day and Labor Day -->
 <!-- periodic hull between Memorial day and Labor Day -->
 <term xsi:type='QSP_TS'>
  <low xsi:type="QSI_TS">
  <!-- memorial day: intersection of last week of May and mondays -->
   <term xsi:type='PIVL_TS'>
    <phase highClosed='false'>
     <low value='19870525'/>
     <high value='19870601'/>
    </phase>
    <period value='1' unit='a'/>
   </term>
   <term xsi:type='PIVL_TS'>
    <phase highClosed='false'>
     <low value='19870105'/>
     <high value='19870106'/>
    </phase>
    <period value='1' unit='wk'/>
   </term>
  </low>
  <high xsi:type="QSI_TS">
   <!-- labor day :  intersection of first week of Sept and mondays -->
   <term xsi:type='PIVL_TS'>
    <phase highClosed='false'>
     <low value='19870901'/>
     <high value='19870908'/>
    </phase>
    <period value='1' unit='a'/>
   </term>
   <term xsi:type='PIVL_TS'>
    <phase highClosed='false'>
     <low value='19870105'/>
     <high value='19870106'/>
    </phase>
    <period value='1' unit='wk'/>
   </term>
  </high>
 </term>
</example>

For me, what this example clarifies is the following:

  • You can build any timing description you like from this.
  • There’s too much power to grapple with the general case here in a computable way
  • This is a bad way to communicate timing specifications between people

That’s a particularly nasty combination for me – from a computable view point, it’s too powerful. From a human view point – which is where we fall back if we can’t get to compute these things – it’s very clunky.

In practice, every use of the GTS data type that I’ve seen, people either use IVL, PIVL, or a bounded PIVL: a PIVL intersected with a IVL where the IVL serves as start and end dates. Anything else gives nearly everybody fits, and I’ve never seen it used (will be happy to hear real experience otherwise in comments).

R1 vs R2

GTS appears rather different in R1 than R2. Firstly, we completely rewrote how we describe GTS, so that it’s comprehensible (I know what GTS means in R1, but only because I wrote data types R2, and then wrote my R1 -> R2 implementation). We did also make some changes in the features of GTS too, by adding

  • QSC – a coded GTS
  • QSS – a list of times

Other than that, there’s no semantic change.

GTS in R1

I’m not even going to explain how GTS is specified in R1, it just hurts my head. The XML is kind of goofy (though it works). But it has one rather sad side effect that not many people realise. Let’s take that same example as above:

<effectiveTime xsi:type=’SXPR_TS’><!– memorial day –>

<comp xsi:type=’SXPR_TS’>

<comp xsi:type=’PIVL_TS’>

<phase>

<low value=’19870525′/>

<high value=’19870601′ inclusive=’false’/>

</phase>

<period value=’1′ unit=’a'/>

</comp>

<comp xsi:type=’PIVL_TS’ operator=’A'>

<phase>

<low value=’19870105′/>

<high value=’19870106′ inclusive=’false’/>

</phase>

<period value=’1′ unit=’wk’/>

</comp>

</comp>

<!– labor day –>

<comp xsi:type=’SXPR_TS’ operator=’P'>

<comp xsi:type=’PIVL_TS’>

<phase>

<low value=’19870901′/>

<high value=’19870908′ inclusive=’false’/>

</phase>

<period value=’1′ unit=’a'/>

</comp>

<comp xsi:type=’PIVL_TS’ operator=’A'>

<phase>

<low value=’19870105′/>

<high value=’19870106′ inclusive=’false’/>

</phase>

<period value=’1′ unit=’wk’/>

</comp>

</comp>

</effectiveTime>

<effectiveTime xsi:type=’PIVL_TS’ alignment=’DW’ operator=’A'>

<!– every other Tuesday –>

<phase>

<low value=’20001202′ inclusive=’true’/>

<high value=’20001203′ inclusive=’false’/>

</phase>

<period value=’2′ unit=’wk’/>

</effectiveTime>

<effectiveTime xsi:type=’IVL_TS’ operator=’A'>

<!– from 2002 and 2003 –>

<low value=’20020101′ inclusive=’true’/>

<high value=’20040101′ inclusive=’false’/>

</effectiveTime>

 

Rather than having QSX, there’s a single type SXPR_TS, and it has an operator on instead. That’s just syntactical sugar – it’s the same structure. The comp just maps to the various named attributes which are operands on the operations. And some of the attributes are renamed. So that’s not so bad.

But the real difference is the way the base operands are constructed – by tacking effectiveTime elements after each other with operators on them. This is legal, even when the cardinality on the effectiveTime attribute is 0..1, because that’s the cardinality of the GTS, not the cardinality of the effectiveTime element that builds the GTS. That’s a subtlety that not many people are aware of. Additionally, the GTS would mean that same thing if there was only one effective time with 3 components like this:

<effectiveTime xsi:type=’SXPR_TS’><comp xsi:type=’SXPR_TS’>

<!– memorial day –>

<comp xsi:type=’SXPR_TS’>

<comp xsi:type=’PIVL_TS’>

<phase>

<low value=’19870525′/>

<high value=’19870601′ inclusive=’false’/>

</phase>

<period value=’1′ unit=’a'/>

</comp>

<comp xsi:type=’PIVL_TS’ operator=’A'>

<phase>

<low value=’19870105′/>

<high value=’19870106′ inclusive=’false’/>

</phase>

<period value=’1′ unit=’wk’/>

</comp>

</comp>

<!– labor day –>

<comp xsi:type=’SXPR_TS’ operator=’P'>

<comp xsi:type=’PIVL_TS’>

<phase>

<low value=’19870901′/>

<high value=’19870908′ inclusive=’false’/>

</phase>

<period value=’1′ unit=’a'/>

</comp>

<comp xsi:type=’PIVL_TS’ operator=’A'>

<phase>

<low value=’19870105′/>

<high value=’19870106′ inclusive=’false’/>

</phase>

<period value=’1′ unit=’wk’/>

</comp>

</comp>

</comp>

<comp xsi:type=’PIVL_TS’ alignment=’DW’ operator=’A'>

<!– every other Tuesday –>

<phase>

<low value=’20001202′ inclusive=’true’/>

<high value=’20001203′ inclusive=’false’/>

</phase>

<period value=’2′ unit=’wk’/>

</comp>

< comp xsi:type=’IVL_TS’ operator=’A'>

<!– from 2002 and 2003 –>

<low value=’20020101′ inclusive=’true’/>

<high value=’20040101′ inclusive=’false’/>

</comp>

</effectiveTime>

Requirements for GTS

This doesn’t really stand as a full explanation of the GTS data type. I can’t be bothered providing one of those. The question I’m interested in is, what are we trying to do here? What are the real world requirements we need here? Here’s my list:

  • We need to support common things for medications – bid, etc, and simple bounded periodic intervals
  • Whatever we do has to be human readable as a fall back for when computing it is impossible
  • We need to be able to make repeating appointments in a form that calendars can process

Anything else?

Categories: CDA, Data Types, ISO 21090, v3

Question: Australian Health Information Security Requirements

Posted on December 9, 2011 by Grahame Grieve
4 comments

This report of a breach of personal health information has been doing the rounds lately – it’s a very well written, from a great blog, and it’s deservedly getting a lot of attention. I sent it to several contacts in Australian commercial vendors, and one of them came back to me with a question:

What best practice standards, and applicable regulations do I need to aware of here in Australia?

I don’t know the answer to this. Here’s some references:

  • There’s a list of Australian Information Security Standards
  • Office of the Australian Information Commissioner (and here, about healthcare identifiers)
  • Some HIV specific information

Much of the information in that list or elsewhere on the internet is specifically about the new healthcare identifiers, and the question is much wider than that. I don’t think this is a good answer, and I suspect that most of the vendors don’t have anything better.

Have I missed anything? references?

 

Categories: Australia, Question

Question: How do 13606 and CDA relate?

Posted on December 8, 2011 by Grahame Grieve
1 comment

Question:

I am doing a report on how well CDA fits in with ISO 13606. I understand it was derived from the ISO 13606 standard but am struggling to find literature about the mapping, e.g. EHR extract – clinical document; folder – ?; composition – ? Can you help?

Answer:

Well, it turns out, to my surprise, that I can help. A few years ago the UK NHS Connecting For Health (CfH) commissioned a technical report entitled “Results of investigating the transformability between CEN/ISO 13606, openEHR and HL7 V3″ which investigated this subject. Though there’s several references to this report on the net, the source isn’t publicly available. Laura Sato (CfH) has very kindly provided me with a late copy of the document, though not the final version (there’s some lack of clarity where that is).

Here’s the document: hl7-openEHR-13606-v0.6

Dipak Kalra – editor of the 13606 specification, and one of the authors of the above document – is planning to revisit this subject, and hoping to do so by Christmas, so something new may be available later.

Update: Rene Spronk had a copy of the final version: HL7-openEHR-13606-Transformability_v1.0

 

Categories: CDA, Question, Standards, v3
Previous Entries
  • Links

    • Discussion Forum
    • Fast Health Interoperability Resources
    • My Resume
    • RSS Feed
    • RSS Feed (Comments)
    • Yes, I'm on Twitter
  • Archives

    • February 2012 (4)
    • January 2012 (2)
    • December 2011 (9)
    • November 2011 (15)
    • October 2011 (5)
    • September 2011 (9)
    • August 2011 (24)
    • July 2011 (11)
    • June 2011 (9)
    • May 2011 (30)
    • April 2011 (13)
    • March 2011 (2)
    • January 2011 (2)
  • Categories

    • 3 laws
    • Australia
    • CDA
    • Data Types
    • FHIR
    • Interoperability
    • ISO 21090
    • NEHTA
    • Question
    • RFH
    • Standards
    • Uncategorized
    • v2
    • v3
  • Recent Posts

    • Good Exchange Specifications: Microsoft vs Apple
    • What’s a Good Exchange Specification?
    • An API is just another exchange specification?
    • Response to Critical Safety Issue for the PCEHR
    • FHIR Report to HL7 Architecture Co-ordination Council
    • FHIR Report for the San Antonio Meeting
    • Health Intersections is 1 year old
    • Everything you didn’t want to know about the GTS data type
    • Question: Australian Health Information Security Requirements
    • Question: How do 13606 and CDA relate?
  • Recent Comments

    • Thomas Beale on Good Exchange Specifications: Microsoft vs Apple
    • Michael Osborne on What’s a Good Exchange Specification?
    • Michael Osborne on What’s a Good Exchange Specification?
    • Grahame Grieve on Response to Critical Safety Issue for the PCEHR
    • Grahame Grieve on Response to Critical Safety Issue for the PCEHR
    • Eric Browne on Response to Critical Safety Issue for the PCEHR
    • Grahame Grieve on Response to Critical Safety Issue for the PCEHR
    • Eric Browne on Response to Critical Safety Issue for the PCEHR
    • Grahame Grieve on Response to Critical Safety Issue for the PCEHR
    • Eric Browne on Response to Critical Safety Issue for the PCEHR
© Health Intersections Pty Ltd. Proudly Powered by WordPress | Nest Theme by YChong