Difference between revisions of "VistA Imaging Issues"

From VistApedia
Jump to: navigation, search
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