Difference between revisions of "VistA Imaging Issues"
Line 82: | Line 82: | ||
checks ^MAG(2005.1,MAGIEN, (file 2005.1 = IMAGE AUDIT) to see if deleted. | checks ^MAG(2005.1,MAGIEN, (file 2005.1 = IMAGE AUDIT) to see if deleted. | ||
checks ^MAG(2005,MAGIEN (file 2005 = IMAGE) to see if it exists. | checks ^MAG(2005,MAGIEN (file 2005 = IMAGE) to see if it exists. | ||
− | + | ||
checks if field PATIENT (field #5) in file IMAGE to see if proper link to patient | checks if field PATIENT (field #5) in file IMAGE to see if proper link to patient | ||
checks if field PARENT GLOBAL ROOT D0 (field #17) in IMAGE file to see if proper link to document | checks if field PARENT GLOBAL ROOT D0 (field #17) in IMAGE file to see if proper link to document | ||
should = TIUIEN | should = TIUIEN | ||
checks INFO^MAGGTII //Get info for an Image File entry | checks INFO^MAGGTII //Get info for an Image File entry | ||
− | --> | + | -->FINDFILE^MAGFILEB |
+ | ; The call to FINDFILE returns: | ||
+ | ; MAGFILE1=LA100066.ABS filename | ||
+ | ; if no Network Location pointer or INVALID Pointer | ||
+ | ; then MAGFILE1=-1~NO NETWORK LOCATION POINTER | ||
+ | ; or -1~INVALID NETWORK LOCATION POINTER | ||
+ | ; MAGFILE1(.01)=KIRIN,B 202524404 image desc | ||
+ | ; MAGJBOL= desc of Offline server | ||
+ | ; MAGOFFLN= if JB is offline | ||
+ | ; MAGPREF=C:\TEMP\LA\10\00\ path | ||
+ | ; MAGTYPE=MAG MAG or WORM | ||
+ | |||
+ | |||
+ | FINDFILE ; | ||
+ | N MAG0,MAGERR,MAGREF,MAGSTORE | ||
+ | K MAGPREF S (MAGJBOL,MAGERR,MAGTYPE,MAGOFFLN)="" | ||
+ | S MAG0=^MAG(2005,+MAGXX,0) | ||
+ | S MAGFILE1=$P(MAG0,"^",2) //0;2 = field FILEREF (#1) = | ||
+ | This field contains the unique image filename of the image | ||
+ | stored on the magnetic server (and the jukebox if you have | ||
+ | one). It is always eight characters in length, starting | ||
+ | with the facility's 2 character Imaging | ||
+ | namespace, with the remaining six characters ranging from | ||
+ | 000001 to 999999. | ||
+ | S MAGFILE1(.01)=$P(MAG0,"^") ; for MAILMAN interface //field .01 (0;1) OBJECT NAME | ||
+ | Each object has a natural language name; this usually | ||
+ | consists of the patient name, social security number, and | ||
+ | object description. | ||
+ | S MAGFILE1=$P(MAGFILE1,"\",$L(MAGFILE1,"\"),999) | ||
+ | ; GEK 4/17/97, if DOCUMENT, send full as the abstract | ||
+ | I FILETYPE'="BIG" D ; code for full size image and abstract | ||
+ | . I (FILETYPE="ABSTRACT"),($P(MAG0,"^",6)=15) S FILETYPE="FULL" | ||
+ | . I FILETYPE="ABSTRACT" S $P(MAGFILE1,".",2)="ABS" | ||
+ | . S MAGREF=$S(FILETYPE="ABSTRACT":$P(MAG0,"^",4),1:$P(MAG0,"^",3)) | ||
+ | . I MAGREF="" S MAGJB=1,MAGREF=$P(MAG0,"^",5) ; get file from jukebox | ||
+ | . Q | ||
+ | E D Q:MAGERR ; code for big file | ||
+ | . N FBIG | ||
+ | . S FBIG=$G(^MAG(2005,MAGXX,"FBIG")) | ||
+ | . I FBIG="" D Q ; no big file exists | ||
+ | . . I $G(MAGWRITE) D ; output message to screen | ||
+ | . . . W !," *** NO ""BIG"" FILE EXISTS FOR IMAGE #",MAGXX," ***" | ||
+ | . . . Q | ||
+ | . . S MAGPREF="",MAGFILE1="-1~BIG File Does NOT Exist",MAGERR=1 | ||
+ | . . Q | ||
+ | . S $P(MAGFILE1,".",2)="BIG" | ||
+ | . S MAGREF=$P(FBIG,"^") ; get file from magnetic disk, if possible | ||
+ | . I MAGREF="" S MAGREF=$P(FBIG,"^",2) ; get file from jukebox | ||
+ | . Q | ||
+ | ; | ||
+ | I MAGREF="" D Q ;NO NETWORK LOCATION | ||
+ | . I $G(MAGWRITE) D ; output message to screen | ||
+ | . . W !," *** NO NETWORK LOCATION DEFINED FOR IMAGE #",MAGXX," ***" | ||
+ | . . Q | ||
+ | . ;S MAGREF="-1~NO NETWORK LOCATION DEFINED" | ||
+ | . S MAGFILE1="-1~NO NETWORK LOCATION DEFINED" | ||
+ | . Q | ||
+ | ; | ||
+ | I '$D(^MAG(2005.2,MAGREF,0)) D Q ; BAD POINTER | ||
+ | . ;S MAGREF="-1~INVALID NETWORK LOCATION POINTER ->"_MAGREF | ||
+ | . S MAGFILE1="-1~INVALID NETWORK LOCATION POINTER ->"_MAGREF | ||
+ | ; | ||
+ | S MAGSTORE=^MAG(2005.2,MAGREF,0),MAGTYPE=$P(MAGSTORE,"^",7) | ||
+ | I MAGTYPE="" S MAGTYPE=$E(MAGSTORE,1,4) ; in case the type is null | ||
+ | ; | ||
+ | S MAGERR="" | ||
+ | I '$P(MAGSTORE,"^",6) D Q:MAGERR ; the network device is off-line | ||
+ | . I MAGTYPE["MAG" D Q:MAGERR ; get the jukebox device | ||
+ | . . S MAGSTORE=$P(MAG0,"^",5) | ||
+ | . . I 'MAGSTORE D NOWHERE S MAGERR=1 Q ;big trouble:nowhere on jbox | ||
+ | . . S MAGSTORE=^MAG(2005.2,MAGSTORE,0) ; get the file from the jbox | ||
+ | . . Q | ||
+ | . I '$P(MAGSTORE,"^",6) D OFFLINE S MAGERR=1 Q ;jbox cartridge offline | ||
+ | . S MAGREF=$P(MAG0,"^",5) | ||
+ | . Q | ||
+ | ; | ||
+ | S MAGPREF="" | ||
+ | I MAGTYPE["MAG" S MAGPREF=$P(MAGSTORE,"^",2) | ||
+ | ; | ||
+ | I MAGTYPE?1"WORM".E D ; code for Jukeboxes | ||
+ | . I MAGTYPE=("WORM-OTG") S MAGPREF=$P(MAGSTORE,"^",2) | ||
+ | . E I MAGTYPE="WORM-PDT" S MAGPREF=$P(MAGSTORE,"^",2) | ||
+ | . E I MAGTYPE["WORM-DG" D ; this code is for DG/SONY jukebox | ||
+ | . . N SUBDIR ; the subdirectory is the last two digits of the file name | ||
+ | . . S SUBDIR=$P(MAGFILE1,".") | ||
+ | . . S SUBDIR=$E(100+$E(SUBDIR,$L(SUBDIR)-1,999),2,3)_"\" | ||
+ | . . S MAGPREF=$P(MAGSTORE,"^",2)_SUBDIR | ||
+ | . . Q | ||
+ | . ; The following is for tracking offline images | ||
+ | . I $$IMOFFLN(MAGFILE1) D | ||
+ | . . S MAGOFFLN=1 | ||
+ | . . ;GEK D MAIL(MAGFILE1,MAGPREF) | ||
+ | . . I +$G(MAGJOB("VERSION"))<2.4 D | ||
+ | . . . S MAGFILE1=$S(MAGFILE1[".ABS":"JBOFFLN.ABS",1:"JBOFFLN.TGA") | ||
+ | . . . S MAGPREF=$P(^MAG(2005.2,1,0),"^",2),MAGJBCP=0 | ||
+ | . ; End of offline image check | ||
+ | . I MAGJBCP D ; add the image to the JukeBox TO Hard Disk copy queue | ||
+ | . . S X=$$JBTOHD^MAGBAPI(MAGXX_"^"_FILETYPE) | ||
+ | . . Q | ||
+ | . Q | ||
+ | ; | ||
+ | S MAGPREF=MAGPREF_$$DIRHASH^MAGFILEB(MAGFILE1,MAGREF) | ||
+ | ; | ||
+ | Q |
Revision as of 22:13, 15 September 2005
Here are some points I have learned about VistA imaging.
TIU EXTERNAL DATA LINK (file 8925.91) 1 0;1 .01 DOCUMENT <-Pntr [RP8925'] 2 0;2 .02 IMAGE <-Pntr [P2005'] 3 1;1 1 LINKED DATA OBJECT [F] field .01 will point to a specific TIU document field .02 can link to an entry in the IMAGE file field 1 can hold the path to a fileserver (e.g. i:\images\jr042696.bmp, etc.)
IMAGE (file 2005) Holds metadata about stored images
If there in an entry in TIU EXTERNAL DATA LINK (file #8925.91), then the corresponding document in CPRS will show a picture icon beside it.
Kevin Toppenberg
9-12-05
The main, top-level imaging menu option is: MAG SYS MENU It is locked with key: MAG SYSTEM
Here are some potentially relevant RPC calls
MAG3 CPRS TIU NOTE Returns a list of all images for a TIU document MAG3 TIU DATA FROM DA Get TIU data from the TIUDA. Returns Document Type, and Document Date/Time MAG3 TIU IMAGE Files the TIU pointer in Imaging and the Imaging Pointer in TIU. MAG4 ADD IMAGE Adds a new entry to the IMAGE File ^MAG(2005 MAG4 CP CONSULT TO TIUDA Imaging Capture workstation calls this RPC to get a TIU IEN to attach images to. This call simply calls a CP API, which accepts DFN, Consult #, Visit String (optional), Complete|Do not Complete the |transaction. MAG4 CP GET VISITS This RPC call simply call a CP Routine that lists visits for a patient. Imaging prompts the user with this list when a Visit String is needed by CP to create a Note. MAG4 DATA FROM IMPORT QUEUE This call returns the Array of Data from the Import Queue, given a QUEUE Number Called from Delphi and 'M' MAG4 REMOTE IMPORT Called from MS Windows Application. MAG4 STATUS CALLBACK This RPC is called from the Imaging Delphi component when an image/images have been imported via the Imaging Import API being developed for use by Clinical Procedures. This call is used in the test version of Import API, it will be replaced in the released version. In the released version the Imaging BackGround Processor will be calling the Status Callback routine of CP.
From the VistA Imaging technical manual (edited)...
7.2.4 Further Information Every individual object (i.e., an image, audio clip, waveform, or scanned document) is an entry in the Image file (2005), where the object's attributes are managed. In addition, three auxiliary files are used: • Object Type (2005.02) • Network Location (2005.2) • Parent Data (? 2005.03--PARENT DATA FILE ?)
The objects are then related to the patient's VISTA text data (medicine, surgery, laboratory, radiology reports or progress notes) through the use of pointers, both forward from the VISTA package file to the Image file, and backwards from the Image file to the VISTA package file.
Software allows new objects to be added and displayed. Several additional files are used by the system. These include: • Imaging Workstations file that contains information about every workstation on the network. • Image Histologic Stain file, and a Microscopic Objective file used by anatomic pathology. • Imaging Site Parameters file.
9-15-05
Information about the RPC Call:
MAG3 CPRS TIU NOTE -- Returns a list of all images for a TIU document -->IMAGES^MAGGNTI(.result,TIUIEN) calls GETILST^TIUSRVPL(.MAGARR,TIUDA) to get a list of all documents for document --> This gets list from "ADI" index in file 8925.91 (TIU EXTERNAL DATA LINK) for each image in list, checks ^MAG(2005.1,MAGIEN, (file 2005.1 = IMAGE AUDIT) to see if deleted. checks ^MAG(2005,MAGIEN (file 2005 = IMAGE) to see if it exists. checks if field PATIENT (field #5) in file IMAGE to see if proper link to patient checks if field PARENT GLOBAL ROOT D0 (field #17) in IMAGE file to see if proper link to document should = TIUIEN checks INFO^MAGGTII //Get info for an Image File entry -->FINDFILE^MAGFILEB ; The call to FINDFILE returns: ; MAGFILE1=LA100066.ABS filename ; if no Network Location pointer or INVALID Pointer ; then MAGFILE1=-1~NO NETWORK LOCATION POINTER ; or -1~INVALID NETWORK LOCATION POINTER ; MAGFILE1(.01)=KIRIN,B 202524404 image desc ; MAGJBOL= desc of Offline server ; MAGOFFLN= if JB is offline ; MAGPREF=C:\TEMP\LA\10\00\ path ; MAGTYPE=MAG MAG or WORM
FINDFILE ;
N MAG0,MAGERR,MAGREF,MAGSTORE
K MAGPREF S (MAGJBOL,MAGERR,MAGTYPE,MAGOFFLN)=""
S MAG0=^MAG(2005,+MAGXX,0)
S MAGFILE1=$P(MAG0,"^",2) //0;2 = field FILEREF (#1) = This field contains the unique image filename of the image stored on the magnetic server (and the jukebox if you have one). It is always eight characters in length, starting with the facility's 2 character Imaging namespace, with the remaining six characters ranging from 000001 to 999999.
S MAGFILE1(.01)=$P(MAG0,"^") ; for MAILMAN interface //field .01 (0;1) OBJECT NAME
Each object has a natural language name; this usually consists of the patient name, social security number, and object description.
S MAGFILE1=$P(MAGFILE1,"\",$L(MAGFILE1,"\"),999) ; GEK 4/17/97, if DOCUMENT, send full as the abstract I FILETYPE'="BIG" D ; code for full size image and abstract . I (FILETYPE="ABSTRACT"),($P(MAG0,"^",6)=15) S FILETYPE="FULL" . I FILETYPE="ABSTRACT" S $P(MAGFILE1,".",2)="ABS" . S MAGREF=$S(FILETYPE="ABSTRACT":$P(MAG0,"^",4),1:$P(MAG0,"^",3)) . I MAGREF="" S MAGJB=1,MAGREF=$P(MAG0,"^",5) ; get file from jukebox . Q E D Q:MAGERR ; code for big file . N FBIG . S FBIG=$G(^MAG(2005,MAGXX,"FBIG")) . I FBIG="" D Q ; no big file exists . . I $G(MAGWRITE) D ; output message to screen . . . W !," *** NO ""BIG"" FILE EXISTS FOR IMAGE #",MAGXX," ***" . . . Q . . S MAGPREF="",MAGFILE1="-1~BIG File Does NOT Exist",MAGERR=1 . . Q . S $P(MAGFILE1,".",2)="BIG" . S MAGREF=$P(FBIG,"^") ; get file from magnetic disk, if possible . I MAGREF="" S MAGREF=$P(FBIG,"^",2) ; get file from jukebox . Q ; I MAGREF="" D Q ;NO NETWORK LOCATION . I $G(MAGWRITE) D ; output message to screen . . W !," *** NO NETWORK LOCATION DEFINED FOR IMAGE #",MAGXX," ***" . . Q . ;S MAGREF="-1~NO NETWORK LOCATION DEFINED" . S MAGFILE1="-1~NO NETWORK LOCATION DEFINED" . Q ; I '$D(^MAG(2005.2,MAGREF,0)) D Q ; BAD POINTER . ;S MAGREF="-1~INVALID NETWORK LOCATION POINTER ->"_MAGREF . S MAGFILE1="-1~INVALID NETWORK LOCATION POINTER ->"_MAGREF ; S MAGSTORE=^MAG(2005.2,MAGREF,0),MAGTYPE=$P(MAGSTORE,"^",7) I MAGTYPE="" S MAGTYPE=$E(MAGSTORE,1,4) ; in case the type is null ; S MAGERR="" I '$P(MAGSTORE,"^",6) D Q:MAGERR ; the network device is off-line . I MAGTYPE["MAG" D Q:MAGERR ; get the jukebox device . . S MAGSTORE=$P(MAG0,"^",5) . . I 'MAGSTORE D NOWHERE S MAGERR=1 Q ;big trouble:nowhere on jbox . . S MAGSTORE=^MAG(2005.2,MAGSTORE,0) ; get the file from the jbox . . Q . I '$P(MAGSTORE,"^",6) D OFFLINE S MAGERR=1 Q ;jbox cartridge offline . S MAGREF=$P(MAG0,"^",5) . Q ; S MAGPREF="" I MAGTYPE["MAG" S MAGPREF=$P(MAGSTORE,"^",2) ; I MAGTYPE?1"WORM".E D ; code for Jukeboxes . I MAGTYPE=("WORM-OTG") S MAGPREF=$P(MAGSTORE,"^",2) . E I MAGTYPE="WORM-PDT" S MAGPREF=$P(MAGSTORE,"^",2) . E I MAGTYPE["WORM-DG" D ; this code is for DG/SONY jukebox . . N SUBDIR ; the subdirectory is the last two digits of the file name . . S SUBDIR=$P(MAGFILE1,".") . . S SUBDIR=$E(100+$E(SUBDIR,$L(SUBDIR)-1,999),2,3)_"\" . . S MAGPREF=$P(MAGSTORE,"^",2)_SUBDIR . . Q . ; The following is for tracking offline images . I $$IMOFFLN(MAGFILE1) D . . S MAGOFFLN=1 . . ;GEK D MAIL(MAGFILE1,MAGPREF) . . I +$G(MAGJOB("VERSION"))<2.4 D . . . S MAGFILE1=$S(MAGFILE1[".ABS":"JBOFFLN.ABS",1:"JBOFFLN.TGA") . . . S MAGPREF=$P(^MAG(2005.2,1,0),"^",2),MAGJBCP=0 . ; End of offline image check . I MAGJBCP D ; add the image to the JukeBox TO Hard Disk copy queue . . S X=$$JBTOHD^MAGBAPI(MAGXX_"^"_FILETYPE) . . Q . Q ; S MAGPREF=MAGPREF_$$DIRHASH^MAGFILEB(MAGFILE1,MAGREF) ; Q