Changeset 1569 for smart/trunk/p/C0SLAB.m
- Timestamp:
- Oct 11, 2012, 1:42:56 PM (13 years ago)
- File:
-
- 1 edited
-
smart/trunk/p/C0SLAB.m (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
smart/trunk/p/C0SLAB.m
r1540 r1569 1 C0SLAB ; GPL - Smart Lab Processing ;4/15/12 17:052 ;;1.0;VISTA SMART CONTAINER;;Sep 26, 2012;Build 23 ;Copyright 2012 George Lilly. Licensed under the terms of the GNU4 ;General Public License See attached copy of the License.5 ;6 ;This program is free software; you can redistribute it and/or modify7 ;it under the terms of the GNU General Public License as published by8 ;the Free Software Foundation; either version 2 of the License, or9 ;(at your option) any later version.10 ;11 ;This program is distributed in the hope that it will be useful,12 ;but WITHOUT ANY WARRANTY; without even the implied warranty of13 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the14 ;GNU General Public License for more details.15 ;16 ;You should have received a copy of the GNU General Public License along17 ;with this program; if not, write to the Free Software Foundation, Inc.,18 ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.19 ;20 Q21 ;22 ; sample VistA NHIN lab result23 ;24 ;^TMP("C0STBL",32,"lab",8,"collected@value")=3110626.1625 ;^TMP("C0STBL",32,"lab",8,"comment")="Report Released Date/Time: Jun 26, 2011@19:00"26 ;^TMP("C0STBL",32,"lab",8,"comment@xml:space")="preserve"27 ;^TMP("C0STBL",32,"lab",8,"facility@code")=10028 ;^TMP("C0STBL",32,"lab",8,"facility@name")="VOE OFFICE INSTITUTION"29 ;^TMP("C0STBL",32,"lab",8,"groupName@value")="CH 0626 47"30 ;^TMP("C0STBL",32,"lab",8,"high@value")=" 101"31 ;^TMP("C0STBL",32,"lab",8,"id@value")="CH;6889372.84;67003"32 ;^TMP("C0STBL",32,"lab",8,"interpretation@value")="H"33 ;^TMP("C0STBL",32,"lab",8,"labOrderID@value")=33634 ;^TMP("C0STBL",32,"lab",8,"localName@value")="FBLDGLU"35 ;^TMP("C0STBL",32,"lab",8,"loinc@value")="14771-0"36 ;^TMP("C0STBL",32,"lab",8,"low@value")="69 "37 ;^TMP("C0STBL",32,"lab",8,"orderID@value")=80738 ;^TMP("C0STBL",32,"lab",8,"result@value")=17839 ;^TMP("C0STBL",32,"lab",8,"resulted@value")=3110626.19000640 ;^TMP("C0STBL",32,"lab",8,"sample@value")="SERUM"41 ;^TMP("C0STBL",32,"lab",8,"specimen@code")="0X500"42 ;^TMP("C0STBL",32,"lab",8,"specimen@name")="SERUM"43 ;^TMP("C0STBL",32,"lab",8,"status@value")="completed"44 ;^TMP("C0STBL",32,"lab",8,"test@value")="FASTING BLOOD GLUCOSE"45 ;^TMP("C0STBL",32,"lab",8,"type@value")="CH"46 ;^TMP("C0STBL",32,"lab",8,"units@value")="MG/DL"47 ;^TMP("C0STBL",32,"lab",8,"vuid@value")=465634248 ;49 ; sample Smart lab result triples50 ;51 ;G("loinc:29571-7","dcterms:identifier")="29571-7"52 ;G("loinc:29571-7","dcterms:title")="Phe DBS Ql"53 ;G("loinc:29571-7","rdf:type")="sp:Code"54 ;G("loinc:29571-7","sp:system")="http://loinc.org/codes/"55 ;G("loinc:38478-4","dcterms:identifier")="38478-4"56 ;G("loinc:38478-4","dcterms:title")="Biotinidase DBS Ql"57 ;G("loinc:38478-4","rdf:type")="sp:Code"58 ;G("loinc:38478-4","sp:system")="http://loinc.org/codes/"59 ;G("qqWZZIew993","rdf:type")="sp:Attribution"60 ;G("qqWZZIew993","sp:startDate")="2007-04-21"61 ;G("qqWZZIew994","rdf:type")="sp:NarrativeResult"62 ;G("qqWZZIew994","sp:value")="Normal"63 ;G("qqWZZIew995","dcterms:title")="Biotinidase DBS Ql"64 ;G("qqWZZIew995","rdf:type")="sp:CodedValue"65 ;G("qqWZZIew995","sp:code")="loinc:38478-4"66 ;G("qqWZZIew997","rdf:type")="sp:Attribution"67 ;G("qqWZZIew997","sp:startDate")="2007-09-08"68 ;G("qqWZZIew998","rdf:type")="sp:NarrativeResult"69 ;G("qqWZZIew998","sp:value")="Normal"70 ;G("qqWZZIew999","dcterms:title")="Phe DBS Ql"71 ;G("qqWZZIew999","rdf:type")="sp:CodedValue"72 ;G("qqWZZIew999","sp:code")="loinc:29571-7"73 ;G("smart:99912345/lab_results/3d9b39249193","rdf:type")="sp:LabResult"74 ;G("smart:99912345/lab_results/3d9b39249193","sp:belongsTo")="smart:99912345"75 ;G("smart:99912345/lab_results/3d9b39249193","sp:labName")="qqWZZIew995"76 ;G("smart:99912345/lab_results/3d9b39249193","sp:narrativeResult")="qqWZZIew994"77 ;G("smart:99912345/lab_results/3d9b39249193","sp:specimenCollected")="qqWZZIew993"78 ;G("smart:99912345/lab_results/426c7adc4f54","rdf:type")="sp:LabResult"79 ;G("smart:99912345/lab_results/426c7adc4f54","sp:belongsTo")="smart:99912345"80 ;G("smart:99912345/lab_results/426c7adc4f54","sp:labName")="qqWZZIew999"81 ;G("smart:99912345/lab_results/426c7adc4f54","sp:narrativeResult")="qqWZZIew998"82 ;G("smart:99912345/lab_results/426c7adc4f54","sp:specimenCollected")="qqWZZIew997"83 ;84 ;85 ; another Smart example, this one with sp:quantitativeResult86 ;87 ;G("loinc:786-4","dcterms:identifier")="786-4"88 ;G("loinc:786-4","dcterms:title")="MCHC RBC Auto-mCnc"89 ;G("loinc:786-4","rdf:type")="sp:Code"90 ;G("loinc:786-4","sp:system")="http://loinc.org/codes/"91 ;G("nodeID:4439","rdf:type")="sp:ValueAndUnit"92 ;G("nodeID:4439","sp:unit")="g/dL"93 ;G("nodeID:4439","sp:value")=36.694 ;G("nodeID:4613","rdf:type")="sp:ValueAndUnit"95 ;G("nodeID:4613","sp:unit")="g/dL"96 ;G("nodeID:4613","sp:value")=3297 ;G("nodeID:4672","rdf:type")="sp:Attribution"98 ;G("nodeID:4672","sp:startDate")="2005-03-10"99 ;G("nodeID:4866","rdf:type")="sp:ValueAndUnit"100 ;G("nodeID:4866","sp:unit")="g/dL"101 ;G("nodeID:4866","sp:value")=36102 ;G("nodeID:4871","dcterms:title")="MCHC RBC Auto-mCnc"103 ;G("nodeID:4871","rdf:type")="sp:CodedValue"104 ;G("nodeID:4871","sp:code")="loinc:786-4"105 ;G("nodeID:5221","rdf:type")="sp:QuantitativeResult"106 ;G("nodeID:5221","sp:normalRange")="nodeID:5282"107 ;G("nodeID:5221","sp:valueAndUnit")="nodeID:4439"108 ;G("nodeID:5282","rdf:type")="sp:ValueRange"109 ;G("nodeID:5282","sp:maximum")="nodeID:4866"110 ;G("nodeID:5282","sp:minimum")="nodeID:4613"111 ;G("smart:1540505/lab_results/2fc100850766","rdf:type")="sp:LabResult"112 ;G("smart:1540505/lab_results/2fc100850766","sp:belongsTo")="smart:1540505"113 ;G("smart:1540505/lab_results/2fc100850766","sp:labName")="nodeID:4871"114 ;G("smart:1540505/lab_results/2fc100850766","sp:quantitativeResult")="nodeID:5221"115 ;G("smart:1540505/lab_results/2fc100850766","sp:specimenCollected")="nodeID:4672"116 ;117 LAB(GRTN,C0SARY) ; GRTN, passed by reference,118 ; is the return name of the graph created. "" if none119 ; C0SARY is passed in by reference and is the NHIN array of lab120 ;121 I $O(C0SARY("lab",""))="" D Q ;122 . I $D(DEBUG) W !,"No Labs"123 S GRTN="" ; default to no labs124 N C0SGRF125 S C0SGRF="vistaSmart:"_ZPATID_"/lab_results"126 I $D(DEBUG) W !,"Processing ",C0SGRF127 D DELGRAPH^C0XF2N(C0SGRF) ; delete the old graph128 D INITFARY^C0XF2N("C0XFARY") ; which triple store to use129 N FARY S FARY="C0XFARY"130 D USEFARY^C0XF2N(FARY)131 D VOCINIT^C0XUTIL132 ;133 D STARTADD^C0XF2N ; initialize to create triples134 ;135 N ZI S ZI=""136 F S ZI=$O(C0SARY("lab",ZI)) Q:ZI="" D ;137 . N LRN,ZR ; ZR is the local array for building the new triples138 . S LRN=$NA(C0SARY("lab",ZI)) ; base for values in this lab result139 . ;140 . N RSLTID ; unique Id for this lab result141 . S RSLTID=C0SGRF_"/"_$$LKY17^C0XF2N ; use a random number142 . ;143 . ; i don't like this because the same labs result gets a144 . ; different ID every time it's reported. Can't trace it back to VistA145 . ; I'd rather be using id@value ie "id@value")="CH;6889372.84;67003"146 . ; .. either that or store an OID with the lab result - but that147 . ; will have to wait for the redesign of file 60.. - gpl 4/16/2012148 . ;149 . N LOINC S LOINC=$G(@LRN@("loinc@value"))150 . I LOINC="" D Q ;151 . . I $D(DEBUG) W !,"NO LOINC VALUE, SKIPPING"152 . N LABTST S LABTST=$G(@LRN@("test@value"))153 . I $D(DEBUG) D ;154 . . W !,"Processing Lab Result ",RSLTID155 . . W !,"test: ",LABTST156 . . W !,"loinc: ",LOINC157 . ;158 . ; first do the base result graph159 . ;160 . S ZR("rdf:type")="sp:LabResult"161 . S ZR("sp:belongsTo")=C0SGRF ; the subject for this patient's lab results162 . ; ie /vista/smart/99912345/lab_results163 . ;164 . N LABNAME S LABNAME=$$ANONS^C0XF2N ; new node for lab name165 . S ZR("sp:labName")=LABNAME166 . ;167 . N NARRSLT S NARRSLT=$$ANONS^C0XF2N ; new node for narrative result168 . S ZR("sp:narrativeResult")=NARRSLT169 . ;170 . N QNTRSLT S QNTRSLT=$$ANONS^C0XF2N ; new node for narrative result171 . S ZR("sp:quantitativeResult")=QNTRSLT172 . ;173 . N SPECCOLL S SPECCOLL=$$ANONS^C0XF2N ; new node for specimen collected174 . S ZR("sp:specimenCollected")=SPECCOLL175 . ;176 . D ADDINN^C0XF2N(C0SGRF,RSLTID,.ZR) ; addIfNotNull the triples177 . K ZR ; clean up178 . ;179 . ; create the narrative result graph180 . ;181 . N IVAL S IVAL=$G(@LRN@("interpretation@value"))'="" D ; H OR L182 . I IVAL'=""183 . . S ZR("rdf:type")="sp:NarrativeResult"184 . . S ZR("sp:value")=$G(@LRN@("interpretation@value")) ; H or L185 . . I ZR("sp:value")="L" S ZR("sp:value")="abnormal"186 . . I ZR("sp:value")="H" S ZR("sp:value")="abnormal"187 . . I ZR("sp:value")="HH" S ZR("sp:value")="critical"188 . . I ZR("sp:value")="LL" S ZR("sp:value")="critical"189 . . D ADDINN^C0XF2N(C0SGRF,NARRSLT,.ZR)190 . . K ZR191 . ;192 . ; create the quantitative result graph193 . ;194 . S ZR("rdf:type")="sp:QuantitativeResult"195 . N NORMNM S NORMNM=$$ANONS^C0XF2N ; new node for normal range graph196 . N VUNM S VUNM=$$ANONS^C0XF2N ; new node for value and unit graph197 . N HASNORMAL S HASNORMAL=0198 . I $G(@LRN@("high@value"))'="" S HASNORMAL=1199 . I HASNORMAL S ZR("sp:normalRange")=NORMNM200 . S ZR("sp:valueAndUnit")=VUNM201 . D ADDINN^C0XF2N(C0SGRF,QNTRSLT,.ZR)202 . K ZR203 . ;204 . ; create the normal range graph205 . ;206 . I HASNORMAL D ;207 . . S ZR("rdf:type")="sp:ValueRange"208 . . N MAXNM S MAXNM=$$ANONS^C0XF2N ; new node for maximum graph209 . . N MINNM S MINNM=$$ANONS^C0XF2N ; new node for minimum graph210 . . S ZR("sp:maximum")=MAXNM211 . . S ZR("sp:minimum")=MINNM212 . . D ADDINN^C0XF2N(C0SGRF,NORMNM,.ZR)213 . . K ZR214 . . ;215 . . ; create the maximum graph216 . . ;217 . . S ZR("rdf:type")="sp:ValueAndUnit"218 . . S ZR("sp:unit")=$G(@LRN@("units@value"))219 . . S ZR("sp:value")=$G(@LRN@("high@value"))220 . . D ADDINN^C0XF2N(C0SGRF,MAXNM,.ZR)221 . . K ZR222 . . ;223 . . ; create the minimum graph224 . . ;225 . . S ZR("rdf:type")="sp:ValueAndUnit"226 . . S ZR("sp:unit")=$G(@LRN@("units@value"))227 . . S ZR("sp:value")=$G(@LRN@("low@value"))228 . . D ADDINN^C0XF2N(C0SGRF,MINNM,.ZR)229 . . K ZR230 . ;231 . ; create the value and unit graph232 . ;233 . S ZR("rdf:type")="sp:ValueAndUnit"234 . S ZR("sp:unit")=$G(@LRN@("units@value"))235 . I ZR("sp:unit")="" S ZR("sp:unit")=$G(@LRN@("test@value"))236 . S ZR("sp:value")=$G(@LRN@("result@value"))237 . D ADDINN^C0XF2N(C0SGRF,VUNM,.ZR)238 . K ZR239 . ;240 . ; create specimen collected graph241 . ;242 . S ZR("rdf:type")="sp:Attribution"243 . S ZR("sp:startDate")=$$SPDATE^C0SUTIL($G(@LRN@("collected@value")))244 . D ADDINN^C0XF2N(C0SGRF,SPECCOLL,.ZR)245 . K ZR246 . ;247 . ; create lab name graph - this contains the test name and code248 . ;249 . I LOINC'="" D ;250 . . S ZR("rdf:type")="sp:CodedValue"251 . . S ZR("dcterms:title")=LABTST252 . . N LOINCNM S LOINCNM="loinc:"_LOINC253 . . S ZR("sp:code")="loinc:"_LOINC254 . . D ADDINN^C0XF2N(C0SGRF,LABNAME,.ZR)255 . . K ZR256 . . S ZR("dcterms:identifier")=LOINC257 . . S ZR("dcterms:title")=LABTST258 . . S ZR("rdf:type")="sp:Code"259 . . S ZR("sp:system")="http://loinc.org/codes/"260 . . D ADDINN^C0XF2N(C0SGRF,LOINCNM,.ZR)261 . . K ZR262 . ;263 . ; that's all for now folks (there is more to do like reference ranges264 . ; and result values)265 . ;266 D BULKLOAD^C0XF2N(.C0XFDA)267 S GRTN=C0SGRF268 Q269 ;270 SAMPLE ; import sample lab tests to the triplestore271 N GN272 S GN=$NA(^rdf("lab_results"))273 D INSRDF^C0XF2N(GN,"/smart/lab/samples")274 Q275 ;1 C0SLAB ; GPL - Smart Lab Processing ;4/15/12 17:05 2 ;;0.1;C0S;nopatch;noreleasedate;Build 2 3 ;Copyright 2012 George Lilly. Licensed under the terms of the GNU 4 ;General Public License See attached copy of the License. 5 ; 6 ;This program is free software; you can redistribute it and/or modify 7 ;it under the terms of the GNU General Public License as published by 8 ;the Free Software Foundation; either version 2 of the License, or 9 ;(at your option) any later version. 10 ; 11 ;This program is distributed in the hope that it will be useful, 12 ;but WITHOUT ANY WARRANTY; without even the implied warranty of 13 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 ;GNU General Public License for more details. 15 ; 16 ;You should have received a copy of the GNU General Public License along 17 ;with this program; if not, write to the Free Software Foundation, Inc., 18 ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 ; 20 Q 21 ; 22 ; sample VistA NHIN lab result 23 ; 24 ;^TMP("C0STBL",32,"lab",8,"collected@value")=3110626.16 25 ;^TMP("C0STBL",32,"lab",8,"comment")="Report Released Date/Time: Jun 26, 2011@19:00" 26 ;^TMP("C0STBL",32,"lab",8,"comment@xml:space")="preserve" 27 ;^TMP("C0STBL",32,"lab",8,"facility@code")=100 28 ;^TMP("C0STBL",32,"lab",8,"facility@name")="VOE OFFICE INSTITUTION" 29 ;^TMP("C0STBL",32,"lab",8,"groupName@value")="CH 0626 47" 30 ;^TMP("C0STBL",32,"lab",8,"high@value")=" 101" 31 ;^TMP("C0STBL",32,"lab",8,"id@value")="CH;6889372.84;67003" 32 ;^TMP("C0STBL",32,"lab",8,"interpretation@value")="H" 33 ;^TMP("C0STBL",32,"lab",8,"labOrderID@value")=336 34 ;^TMP("C0STBL",32,"lab",8,"localName@value")="FBLDGLU" 35 ;^TMP("C0STBL",32,"lab",8,"loinc@value")="14771-0" 36 ;^TMP("C0STBL",32,"lab",8,"low@value")="69 " 37 ;^TMP("C0STBL",32,"lab",8,"orderID@value")=807 38 ;^TMP("C0STBL",32,"lab",8,"result@value")=178 39 ;^TMP("C0STBL",32,"lab",8,"resulted@value")=3110626.190006 40 ;^TMP("C0STBL",32,"lab",8,"sample@value")="SERUM" 41 ;^TMP("C0STBL",32,"lab",8,"specimen@code")="0X500" 42 ;^TMP("C0STBL",32,"lab",8,"specimen@name")="SERUM" 43 ;^TMP("C0STBL",32,"lab",8,"status@value")="completed" 44 ;^TMP("C0STBL",32,"lab",8,"test@value")="FASTING BLOOD GLUCOSE" 45 ;^TMP("C0STBL",32,"lab",8,"type@value")="CH" 46 ;^TMP("C0STBL",32,"lab",8,"units@value")="MG/DL" 47 ;^TMP("C0STBL",32,"lab",8,"vuid@value")=4656342 48 ; 49 ; sample Smart lab result triples 50 ; 51 ;G("loinc:29571-7","dcterms:identifier")="29571-7" 52 ;G("loinc:29571-7","dcterms:title")="Phe DBS Ql" 53 ;G("loinc:29571-7","rdf:type")="sp:Code" 54 ;G("loinc:29571-7","sp:system")="http://loinc.org/codes/" 55 ;G("loinc:38478-4","dcterms:identifier")="38478-4" 56 ;G("loinc:38478-4","dcterms:title")="Biotinidase DBS Ql" 57 ;G("loinc:38478-4","rdf:type")="sp:Code" 58 ;G("loinc:38478-4","sp:system")="http://loinc.org/codes/" 59 ;G("qqWZZIew993","rdf:type")="sp:Attribution" 60 ;G("qqWZZIew993","sp:startDate")="2007-04-21" 61 ;G("qqWZZIew994","rdf:type")="sp:NarrativeResult" 62 ;G("qqWZZIew994","sp:value")="Normal" 63 ;G("qqWZZIew995","dcterms:title")="Biotinidase DBS Ql" 64 ;G("qqWZZIew995","rdf:type")="sp:CodedValue" 65 ;G("qqWZZIew995","sp:code")="loinc:38478-4" 66 ;G("qqWZZIew997","rdf:type")="sp:Attribution" 67 ;G("qqWZZIew997","sp:startDate")="2007-09-08" 68 ;G("qqWZZIew998","rdf:type")="sp:NarrativeResult" 69 ;G("qqWZZIew998","sp:value")="Normal" 70 ;G("qqWZZIew999","dcterms:title")="Phe DBS Ql" 71 ;G("qqWZZIew999","rdf:type")="sp:CodedValue" 72 ;G("qqWZZIew999","sp:code")="loinc:29571-7" 73 ;G("smart:99912345/lab_results/3d9b39249193","rdf:type")="sp:LabResult" 74 ;G("smart:99912345/lab_results/3d9b39249193","sp:belongsTo")="smart:99912345" 75 ;G("smart:99912345/lab_results/3d9b39249193","sp:labName")="qqWZZIew995" 76 ;G("smart:99912345/lab_results/3d9b39249193","sp:narrativeResult")="qqWZZIew994" 77 ;G("smart:99912345/lab_results/3d9b39249193","sp:specimenCollected")="qqWZZIew993" 78 ;G("smart:99912345/lab_results/426c7adc4f54","rdf:type")="sp:LabResult" 79 ;G("smart:99912345/lab_results/426c7adc4f54","sp:belongsTo")="smart:99912345" 80 ;G("smart:99912345/lab_results/426c7adc4f54","sp:labName")="qqWZZIew999" 81 ;G("smart:99912345/lab_results/426c7adc4f54","sp:narrativeResult")="qqWZZIew998" 82 ;G("smart:99912345/lab_results/426c7adc4f54","sp:specimenCollected")="qqWZZIew997" 83 ; 84 ; 85 ; another Smart example, this one with sp:quantitativeResult 86 ; 87 ;G("loinc:786-4","dcterms:identifier")="786-4" 88 ;G("loinc:786-4","dcterms:title")="MCHC RBC Auto-mCnc" 89 ;G("loinc:786-4","rdf:type")="sp:Code" 90 ;G("loinc:786-4","sp:system")="http://loinc.org/codes/" 91 ;G("nodeID:4439","rdf:type")="sp:ValueAndUnit" 92 ;G("nodeID:4439","sp:unit")="g/dL" 93 ;G("nodeID:4439","sp:value")=36.6 94 ;G("nodeID:4613","rdf:type")="sp:ValueAndUnit" 95 ;G("nodeID:4613","sp:unit")="g/dL" 96 ;G("nodeID:4613","sp:value")=32 97 ;G("nodeID:4672","rdf:type")="sp:Attribution" 98 ;G("nodeID:4672","sp:startDate")="2005-03-10" 99 ;G("nodeID:4866","rdf:type")="sp:ValueAndUnit" 100 ;G("nodeID:4866","sp:unit")="g/dL" 101 ;G("nodeID:4866","sp:value")=36 102 ;G("nodeID:4871","dcterms:title")="MCHC RBC Auto-mCnc" 103 ;G("nodeID:4871","rdf:type")="sp:CodedValue" 104 ;G("nodeID:4871","sp:code")="loinc:786-4" 105 ;G("nodeID:5221","rdf:type")="sp:QuantitativeResult" 106 ;G("nodeID:5221","sp:normalRange")="nodeID:5282" 107 ;G("nodeID:5221","sp:valueAndUnit")="nodeID:4439" 108 ;G("nodeID:5282","rdf:type")="sp:ValueRange" 109 ;G("nodeID:5282","sp:maximum")="nodeID:4866" 110 ;G("nodeID:5282","sp:minimum")="nodeID:4613" 111 ;G("smart:1540505/lab_results/2fc100850766","rdf:type")="sp:LabResult" 112 ;G("smart:1540505/lab_results/2fc100850766","sp:belongsTo")="smart:1540505" 113 ;G("smart:1540505/lab_results/2fc100850766","sp:labName")="nodeID:4871" 114 ;G("smart:1540505/lab_results/2fc100850766","sp:quantitativeResult")="nodeID:5221" 115 ;G("smart:1540505/lab_results/2fc100850766","sp:specimenCollected")="nodeID:4672" 116 ; 117 LAB(GRTN,C0SARY) ; GRTN, passed by reference, 118 ; is the return name of the graph created. "" if none 119 ; C0SARY is passed in by reference and is the NHIN array of lab 120 ; 121 I $O(C0SARY("lab",""))="" D Q ; 122 . I $D(DEBUG) W !,"No Labs" 123 S GRTN="" ; default to no labs 124 N C0SGRF 125 S C0SGRF="vistaSmart:"_ZPATID_"/lab_results" 126 I $D(DEBUG) W !,"Processing ",C0SGRF 127 D DELGRAPH^C0XF2N(C0SGRF) ; delete the old graph 128 D INITFARY^C0XF2N("C0XFARY") ; which triple store to use 129 N FARY S FARY="C0XFARY" 130 D USEFARY^C0XF2N(FARY) 131 D VOCINIT^C0XUTIL 132 ; 133 D STARTADD^C0XF2N ; initialize to create triples 134 ; 135 N ZI S ZI="" 136 F S ZI=$O(C0SARY("lab",ZI)) Q:ZI="" D ; 137 . N LRN,ZR ; ZR is the local array for building the new triples 138 . S LRN=$NA(C0SARY("lab",ZI)) ; base for values in this lab result 139 . ; 140 . N RSLTID ; unique Id for this lab result 141 . S RSLTID=C0SGRF_"/"_$$LKY17^C0XF2N ; use a random number 142 . ; 143 . ; i don't like this because the same labs result gets a 144 . ; different ID every time it's reported. Can't trace it back to VistA 145 . ; I'd rather be using id@value ie "id@value")="CH;6889372.84;67003" 146 . ; .. either that or store an OID with the lab result - but that 147 . ; will have to wait for the redesign of file 60.. - gpl 4/16/2012 148 . ; 149 . N LOINC S LOINC=$G(@LRN@("loinc@value")) 150 . I LOINC="" D Q ; 151 . . I $D(DEBUG) W !,"NO LOINC VALUE, SKIPPING" 152 . N LABTST S LABTST=$G(@LRN@("test@value")) 153 . I $D(DEBUG) D ; 154 . . W !,"Processing Lab Result ",RSLTID 155 . . W !,"test: ",LABTST 156 . . W !,"loinc: ",LOINC 157 . ; 158 . ; first do the base result graph 159 . ; 160 . S ZR("rdf:type")="sp:LabResult" 161 . S ZR("sp:belongsTo")=C0SGRF ; the subject for this patient's lab results 162 . ; ie /vista/smart/99912345/lab_results 163 . ; 164 . N LABNAME S LABNAME=$$ANONS^C0XF2N ; new node for lab name 165 . S ZR("sp:labName")=LABNAME 166 . ; 167 . N NARRSLT S NARRSLT=$$ANONS^C0XF2N ; new node for narrative result 168 . S ZR("sp:narrativeResult")=NARRSLT 169 . ; 170 . N QNTRSLT S QNTRSLT=$$ANONS^C0XF2N ; new node for narrative result 171 . S ZR("sp:quantitativeResult")=QNTRSLT 172 . ; 173 . N SPECCOLL S SPECCOLL=$$ANONS^C0XF2N ; new node for specimen collected 174 . S ZR("sp:specimenCollected")=SPECCOLL 175 . ; 176 . D ADDINN^C0XF2N(C0SGRF,RSLTID,.ZR) ; addIfNotNull the triples 177 . K ZR ; clean up 178 . ; 179 . ; create the narrative result graph 180 . ; 181 . N IVAL S IVAL=$G(@LRN@("interpretation@value"))'="" D ; H OR L 182 . I IVAL'="" 183 . . S ZR("rdf:type")="sp:NarrativeResult" 184 . . S ZR("sp:value")=$G(@LRN@("interpretation@value")) ; H or L 185 . . I ZR("sp:value")="L" S ZR("sp:value")="abnormal" 186 . . I ZR("sp:value")="H" S ZR("sp:value")="abnormal" 187 . . I ZR("sp:value")="HH" S ZR("sp:value")="critical" 188 . . I ZR("sp:value")="LL" S ZR("sp:value")="critical" 189 . . D ADDINN^C0XF2N(C0SGRF,NARRSLT,.ZR) 190 . . K ZR 191 . ; 192 . ; create the quantitative result graph 193 . ; 194 . S ZR("rdf:type")="sp:QuantitativeResult" 195 . N NORMNM S NORMNM=$$ANONS^C0XF2N ; new node for normal range graph 196 . N VUNM S VUNM=$$ANONS^C0XF2N ; new node for value and unit graph 197 . N HASNORMAL S HASNORMAL=0 198 . I $G(@LRN@("high@value"))'="" S HASNORMAL=1 199 . I HASNORMAL S ZR("sp:normalRange")=NORMNM 200 . S ZR("sp:valueAndUnit")=VUNM 201 . D ADDINN^C0XF2N(C0SGRF,QNTRSLT,.ZR) 202 . K ZR 203 . ; 204 . ; create the normal range graph 205 . ; 206 . I HASNORMAL D ; 207 . . S ZR("rdf:type")="sp:ValueRange" 208 . . N MAXNM S MAXNM=$$ANONS^C0XF2N ; new node for maximum graph 209 . . N MINNM S MINNM=$$ANONS^C0XF2N ; new node for minimum graph 210 . . S ZR("sp:maximum")=MAXNM 211 . . S ZR("sp:minimum")=MINNM 212 . . D ADDINN^C0XF2N(C0SGRF,NORMNM,.ZR) 213 . . K ZR 214 . . ; 215 . . ; create the maximum graph 216 . . ; 217 . . S ZR("rdf:type")="sp:ValueAndUnit" 218 . . S ZR("sp:unit")=$G(@LRN@("units@value")) 219 . . S ZR("sp:value")=$G(@LRN@("high@value")) 220 . . D ADDINN^C0XF2N(C0SGRF,MAXNM,.ZR) 221 . . K ZR 222 . . ; 223 . . ; create the minimum graph 224 . . ; 225 . . S ZR("rdf:type")="sp:ValueAndUnit" 226 . . S ZR("sp:unit")=$G(@LRN@("units@value")) 227 . . S ZR("sp:value")=$G(@LRN@("low@value")) 228 . . D ADDINN^C0XF2N(C0SGRF,MINNM,.ZR) 229 . . K ZR 230 . ; 231 . ; create the value and unit graph 232 . ; 233 . S ZR("rdf:type")="sp:ValueAndUnit" 234 . S ZR("sp:unit")=$G(@LRN@("units@value")) 235 . I ZR("sp:unit")="" S ZR("sp:unit")="{unknown}" ;$G(@LRN@("test@value")) 236 . S ZR("sp:value")=$G(@LRN@("result@value")) 237 . D ADDINN^C0XF2N(C0SGRF,VUNM,.ZR) 238 . K ZR 239 . ; 240 . ; create specimen collected graph 241 . ; 242 . S ZR("rdf:type")="sp:Attribution" 243 . S ZR("sp:startDate")=$$SPDATE^C0SUTIL($G(@LRN@("collected@value"))) 244 . D ADDINN^C0XF2N(C0SGRF,SPECCOLL,.ZR) 245 . K ZR 246 . ; 247 . ; create lab name graph - this contains the test name and code 248 . ; 249 . I LOINC'="" D ; 250 . . S ZR("rdf:type")="sp:CodedValue" 251 . . S ZR("dcterms:title")=LABTST 252 . . N LOINCNM S LOINCNM="loinc:"_LOINC 253 . . S ZR("sp:code")="loinc:"_LOINC 254 . . D ADDINN^C0XF2N(C0SGRF,LABNAME,.ZR) 255 . . K ZR 256 . . S ZR("dcterms:identifier")=LOINC 257 . . S ZR("dcterms:title")=LABTST 258 . . S ZR("rdf:type")="sp:Code" 259 . . S ZR("sp:system")="http://loinc.org/codes/" 260 . . D ADDINN^C0XF2N(C0SGRF,LOINCNM,.ZR) 261 . . K ZR 262 . ; 263 . ; that's all for now folks (there is more to do like reference ranges 264 . ; and result values) 265 . ; 266 D BULKLOAD^C0XF2N(.C0XFDA) 267 S GRTN=C0SGRF 268 Q 269 ; 270 SAMPLE ; import sample lab tests to the triplestore 271 N GN 272 S GN=$NA(^rdf("lab_results")) 273 D INSRDF^C0XF2N(GN,"/smart/lab/samples") 274 Q 275 ;
Note:
See TracChangeset
for help on using the changeset viewer.
