Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: MAGDSTA1

MAGDSTA1.m

Go to the documentation of this file.
  1. MAGDSTA1 ;WOIFO/PMK - Q/R Retrieve of DICOM images from PACS to VistA ; Mar 08, 2022@07:55:07
  1. ;;3.0;IMAGING;**231,306,305**;Mar 19, 2002;Build 3
  1. ;; Per VHA Directive 2004-038, this routine should not be modified.
  1. ;; +---------------------------------------------------------------+
  1. ;; | Property of the US Government. |
  1. ;; | No permission to copy or redistribute this software is given. |
  1. ;; | Use of unreleased versions of this software requires the user |
  1. ;; | to execute a written test agreement with the VistA Imaging |
  1. ;; | Development Office of the Department of Veterans Affairs, |
  1. ;; | telephone (301) 734-0100. |
  1. ;; | The Food and Drug Administration classifies this software as |
  1. ;; | a medical device. As such, it may not be changed in any way. |
  1. ;; | Modifications to this software may result in an adulterated |
  1. ;; | medical device under 21CFR820, the use of which is considered |
  1. ;; | to be a violation of US Federal Statutes. |
  1. ;; +---------------------------------------------------------------+
  1. ;;
  1. ; Supported IA #2056 reference $$GET1^DIQ function call
  1. ; Supported IA #10103 reference $$FMTE^XLFDT function call
  1. ; Supported IA #10103 reference $$FMADD^XLFDT function call
  1. ; Supported IA #10103 reference $$NOW^XLFDT function call
  1. ; Supported IA #1519 reference EN^XUTMDEVQ subroutine call
  1. ; Supported IA #10097 reference $$EC^%ZOSV
  1. ; Supported IA #1621 reference UNWIND^%ZTER
  1. ; Supported IA #10035 to read PATIENT file (#2)
  1. ;
  1. Q
  1. ;
  1. ENTRY(MENUOPTION) ; Entry point from main menu
  1. N ACNUMB,BATCHSIZE,BEGDATE,DFN,ENDDATE,HOSTNAME,HOURS,IMAGINGSERVICE,OPTION,QRSCP,QRSTACK
  1. N MAGIOM,MAGXTMP,RUNTIME,SCANMODE,SORTORDER,STARTIEN,STARTTIME,STATUS,STUDYDATE,STUDYIEN
  1. N CONSULTSERVICES,DEFAULT,DIVISION,DONE,ERROR,I,LASTRUN,OK,QUESTION,QUIT,SERVICES,X,ZTDESC
  1. ;
  1. N $ETRAP,$ESTACK S $ETRAP="D ERROR^MAGDSTA"
  1. ;
  1. ; application-wide variables
  1. S OPTION=$G(^TMP("MAG",$J,"BATCH Q/R","OPTION"))
  1. S IMAGINGSERVICE=$G(^TMP("MAG",$J,"BATCH Q/R","IMAGING SERVICE"))
  1. S QRSTACK="AUTOMATIC"
  1. S HOSTNAME=$$HOSTNAME^MAGDFCNV
  1. I $$CHECKDIV^MAGDSTAB()="" D Q
  1. . W !!,"*** Use the PARM option to set Check Study Division switch ***"
  1. . D CONTINUE^MAGDSTQ
  1. . Q
  1. S DIVISION=$G(DUZ(2),0) ; user's logon division
  1. I $$CHECKDIV^MAGDSTAB()="Y",'DIVISION D Q
  1. . W !!,"*** User's Division is not defined ***"
  1. . D CONTINUE^MAGDSTQ
  1. . Q
  1. ;
  1. S MAGXTMP=$$INITXTMP^MAGDSTQ0
  1. ;
  1. S DEFAULT=$G(^TMP("MAG",$J,"Q/R PARAM","SCAN MODE"),"DATE")
  1. W ! S OK=0 F D Q:OK
  1. . I IMAGINGSERVICE="RADIOLOGY" D
  1. . . W !!,"Scan by Date, Report Number, Patient, or Accession (D, N, P, or A): "
  1. . . Q
  1. . E D
  1. . . W !!,"Scan by Date, Consult Number, Patient, or Accession (D, N, P, or A): "
  1. . . Q
  1. . I $L(DEFAULT) W DEFAULT,"// "
  1. . R X:DTIME E S OK=-1 Q
  1. . I X="",$L(DEFAULT) S X=DEFAULT W X
  1. . I X="" S OK=-1 Q
  1. . I X["^" S OK=-1 Q
  1. . I "Dd"[$E(X) S SCANMODE="DATE",OK=1 Q
  1. . I "Nn"[$E(X) S SCANMODE="NUMBER",OK=1 Q
  1. . I "Pp"[$E(X) S SCANMODE="PATIENT",OK=1 Q
  1. . I "Aa"[$E(X) S SCANMODE="ACCESSION",OK=1 Q
  1. . W " ???",!,"Please enter ""D"", ""N"", ""P"", or ""A""."
  1. . Q
  1. Q:OK'=1 ; didn't enter a choice
  1. S ^TMP("MAG",$J,"Q/R PARAM","SCAN MODE")=SCANMODE
  1. ;
  1. ; get parameters of last run
  1. S LASTRUN=$O(^MAGDSTT(2006.543,"C",MENUOPTION,$E(SCANMODE,1),""),-1)
  1. I LASTRUN D
  1. . S X="Parameters of the Previous "_SCANMODE_" Run"
  1. . W !!?10,X,!?10 F I=1:1:$L(X) W "-"
  1. . D LASTRUN^MAGDSTAS(LASTRUN)
  1. . D DISPLAY1^MAGDSTA9
  1. . I STATUS="COMPLETED" D
  1. . . W !!,"The last ",SCANMODE," scan run completed on ",$$FMTE^XLFDT(RUNTIME)
  1. . . S ERROR=$$YESNO^MAGDSTQ("Start this "_SCANMODE_" scan where the last run ended?","y",.X)
  1. . . I ERROR<0 W " YESNO ERROR" Q
  1. . . I X="YES" D
  1. . . . D COPYPARM(1)
  1. . . . Q
  1. . . E D
  1. . . . K ^TMP("MAG",$J,"BATCH Q/R","PATIENT DFN")
  1. . . . K PICK ; consult service list
  1. . . . Q
  1. . . Q
  1. . E I STATUS="RUNNING" D
  1. . . W !!,"THE LAST ",SCANMODE," SCAN RUN HAS NOT YET COMPLETED. The last action was on ",$$FMTE^XLFDT(RUNTIME)
  1. . . S ERROR=$$YESNO^MAGDSTQ("Start this "_SCANMODE_" scan where the last run is expected to end?",,.X) ; no default
  1. . . I ERROR<0 W " YESNO ERROR" Q
  1. . . I X="YES" D
  1. . . . D COPYPARM(1)
  1. . . . Q
  1. . . E D
  1. . . . K ^TMP("MAG",$J,"BATCH Q/R","PATIENT DFN")
  1. . . . Q
  1. . . Q
  1. . E I STATUS="STARTED" D
  1. . . W !!,"THE LAST ",SCANMODE," SCAN RUN HAS NOT YET BEGUN. The last action was on ",$$FMTE^XLFDT(RUNTIME)
  1. . . S ERROR=$$YESNO^MAGDSTQ("Start this "_SCANMODE_" scan where the last run is expected to end?",,.X) ; no default
  1. . . I ERROR<0 W " YESNO ERROR" Q
  1. . . I X="YES" D
  1. . . . D COPYPARM(1)
  1. . . . Q
  1. . . E D
  1. . . . K ^TMP("MAG",$J,"BATCH Q/R","PATIENT DFN")
  1. . . . Q
  1. . . Q
  1. . E D
  1. . . W !!,"THE LAST ",SCANMODE," SCAN RUN ABNORMALLY TERMINATED: ",STATUS
  1. . . W !,"The last action was on ",$$FMTE^XLFDT(RUNTIME)
  1. . . S ERROR=$$YESNO^MAGDSTQ("Start this "_SCANMODE_" scan where the last run abnormally ended?",,.X) ; no default
  1. . . I ERROR<0 W " YESNO ERROR" Q
  1. . . I X="YES" D
  1. . . . D COPYPARM(0)
  1. . . . Q
  1. . . E D
  1. . . . K ^TMP("MAG",$J,"BATCH Q/R","PATIENT DFN")
  1. . . . Q
  1. . . Q
  1. . . Q
  1. . Q
  1. ;
  1. I '$D(^TMP("MAG",$J,"BATCH Q/R","HOURS OF OPERATION")) D
  1. . S ^TMP("MAG",$J,"BATCH Q/R","HOURS OF OPERATION")="YYYYYYYYYYYYYYYYYYYYYYYY"
  1. . Q
  1. ;
  1. D QRSCP^MAGDSTA2 ; get query/retrieve scp for radiology & consults
  1. I $G(^TMP("MAG",$J,"BATCH Q/R","PACS Q/R RETRIEVE SCP"))="" W " -- Exiting" Q
  1. ;
  1. I SCANMODE="ACCESSION" D Q ; single accession number compare/retrieve
  1. . D ACNUM^MAGDSTA2
  1. . Q
  1. ;
  1. S X=0
  1. I IMAGINGSERVICE="CONSULTS" D
  1. . S X=$$SERVICES^MAGDSTA8(.CONSULTSERVICES,"YES")
  1. . K ^TMP("MAG",$J,"BATCH Q/R","CONSULT SERVICES") ; remove old ones
  1. . M ^TMP("MAG",$J,"BATCH Q/R","CONSULT SERVICES")=CONSULTSERVICES
  1. . Q
  1. I X<0 W !,"Exiting" Q
  1. ;
  1. I SCANMODE="NUMBER" D
  1. . S QUESTION="SORTORDR^MAGDSTA2"
  1. . I IMAGINGSERVICE="RADIOLOGY" D
  1. . . S QUESTION=QUESTION_" RARPT1^MAGDSTA4"
  1. . . Q
  1. . E D ; consults
  1. . . S QUESTION=QUESTION_" STUDY1^MAGDSTA6"
  1. . . Q
  1. . S QUESTION=QUESTION_" BATCHSIZ^MAGDSTA2 HOURS^MAGDSTA2 VERIFY^MAGDSTA9"
  1. . S QUESTION("ASCENDING")=QUESTION
  1. . S QUESTION("DESCENDING")=QUESTION
  1. . Q
  1. E I SCANMODE="DATE" D
  1. . S QUESTION="SORTORDR^MAGDSTA2"
  1. . S QUESTION("ASCENDING")=QUESTION_" BEGDATE^MAGDSTA2 ENDDATE^MAGDSTA2 HOURS^MAGDSTA2 VERIFY^MAGDSTA9"
  1. . S QUESTION("DESCENDING")=QUESTION_" ENDDATE^MAGDSTA2 BEGDATE^MAGDSTA2 HOURS^MAGDSTA2 VERIFY^MAGDSTA9"
  1. . Q
  1. E I SCANMODE="PATIENT" D
  1. . S QUESTION="PATIENTA^MAGDSTQA SORTORDR^MAGDSTA2"
  1. . S QUESTION("ASCENDING")=QUESTION_" BEGDATE^MAGDSTA2 ENDDATE^MAGDSTA2 HOURS^MAGDSTA2 VERIFY^MAGDSTA9"
  1. . S QUESTION("DESCENDING")=QUESTION_" ENDDATE^MAGDSTA2 BEGDATE^MAGDSTA2 HOURS^MAGDSTA2 VERIFY^MAGDSTA9"
  1. . Q
  1. ;
  1. S QUESTION("NONE")=QUESTION("ASCENDING") ; initial default is ASCENDING
  1. ;
  1. S SORTORDER="NONE" ; value will change when SORTORDER^MAGDSTA2 is invoked
  1. F I=1:1:$L(QUESTION(SORTORDER)," ") D I I<0 S QUIT=-1 Q
  1. . S QUIT=0
  1. . D @$P(QUESTION(SORTORDER)," ",I)
  1. . I QUIT>0 S I=I-2
  1. . E I QUIT<0 S I=-1
  1. . Q
  1. I QUIT<0 Q
  1. ;
  1. D TASKINIT
  1. ;
  1. ; Setup for tasking the compare image counts/retrieve job
  1. ;
  1. ; ZTDESC is set above
  1. ;
  1. N %ZIS,ZTSAVE
  1. S ZTSAVE("HOSTNAME")=""
  1. S ZTSAVE("MAGIOM")=""
  1. S ZTSAVE("MAGXTMP")=""
  1. S ZTSAVE("MENUOPTION")=""
  1. S ZTSAVE("^TMP(""MAG"",$J,""BATCH Q/R"",")=""
  1. S ZTSAVE("^TMP(""MAG"",$J,""Q/R PARAM"",")=""
  1. S ZTSAVE("QRSTACK")=""
  1. S ZTSAVE("CONSULTSERVICES(")=""
  1. D EN^XUTMDEVQ("TASK^"_$T(+0),ZTDESC,.ZTSAVE,.%ZIS)
  1. Q
  1. ;
  1. TASKINIT ; initialize MAGIOM and ZTDESC
  1. I ^TMP("MAG",$J,"BATCH Q/R","OPTION")="RETRIEVE MISSING IMAGES" D
  1. . W !!,"Recommend report output of 132 columns",!!
  1. . S MAGIOM=132 ; retrieve requires 132 columns
  1. . S ZTDESC="Retrieve Missing Images" ; for tasking
  1. . Q
  1. E D ; compare image counts
  1. . S MAGIOM=80 ; comparing image counts requires only 80 columns
  1. . S ZTDESC="Compare Image Counts" ; for tasking
  1. . Q
  1. S ZTDESC=ZTDESC_" for "_IMAGINGSERVICE
  1. Q
  1. ;
  1. TASK ; entry point for a tasked job
  1. N $ETRAP,$ESTACK S $ETRAP="D ERROR^MAGDSTA"
  1. N I
  1. F I=1:1:$L(ZTDESC) W $E(ZTDESC,I)," "
  1. W !,"-" F I=2:1:$L(ZTDESC) W "--"
  1. W !,"Started on ",$$FMTE^XLFDT($$NOW^XLFDT,1)
  1. W " by ",$$GET1^DIQ(200,DUZ,.01,"E")," (DUZ: ",DUZ,")"
  1. W " Job Number: ",$J
  1. D DISPLAY^MAGDSTA9
  1. W !!
  1. ;
  1. BEGIN ; entry point for running the image compare or retrieve process
  1. N ACNUMB,BATCHSIZE,BEGDATE,DFN,ENDDATE,HOURS,IMAGINGSERVICE,OPTION,QRSCP,RUNTIME
  1. N SCANMODE,SORTORDER,STARTIEN,STARTTIME,STATUS,STUDYDATE,STUDYIEN
  1. N DIRECTION,I,J,K,L,RUNNUMBER,STOP
  1. ;
  1. S X=MAGIOM X ^%ZOSF("RM") ; set right margin to 80 or 132
  1. ;
  1. S OPTION=$G(^TMP("MAG",$J,"BATCH Q/R","OPTION"))
  1. S IMAGINGSERVICE=$G(^TMP("MAG",$J,"BATCH Q/R","IMAGING SERVICE"))
  1. S SCANMODE=$G(^TMP("MAG",$J,"Q/R PARAM","SCAN MODE"))
  1. S SORTORDER=$G(^TMP("MAG",$J,"BATCH Q/R","SORT ORDER"))
  1. S BATCHSIZE=$G(^TMP("MAG",$J,"BATCH Q/R","BATCH SIZE"))
  1. S STARTIEN=$G(^TMP("MAG",$J,"BATCH Q/R","REPORT/STUDY IEN"))
  1. S BEGDATE=$G(^TMP("MAG",$J,"BATCH Q/R","BEGIN DATE"))
  1. S ENDDATE=$G(^TMP("MAG",$J,"BATCH Q/R","END DATE"))
  1. S SORTORDER=$G(^TMP("MAG",$J,"BATCH Q/R","SORT ORDER"))
  1. S HOURS=^TMP("MAG",$J,"BATCH Q/R","HOURS OF OPERATION")
  1. S QRSCP=$G(^TMP("MAG",$J,"BATCH Q/R","PACS Q/R RETRIEVE SCP"))
  1. S DFN=$G(^TMP("MAG",$J,"BATCH Q/R","PATIENT DFN"))
  1. ;
  1. L +^MAGDSTT(2006.543,0):30 E D Q
  1. . W !!,"Cannot obtain LOCK on Q/R RETRIEVE DICOM RUN STATISTICS Table.",!!
  1. . Q
  1. S X=$G(^MAGDSTT(2006.543,0))
  1. S $P(X,"^",1,2)="DICOM BATCH Q/R RUN STATISTICS^2006.543"
  1. S (RUNNUMBER,$P(X,"^",3))=$O(^MAGDSTT(2006.543," "),-1)+1 ; get next IEN
  1. S $P(X,"^",4)=$P(X,"^",4)+1 ; increment total count
  1. S ^MAGDSTT(2006.543,0)=X
  1. ;
  1. S (RUNTIME,STARTTIME)=$$NOW^XLFDT(),X=""
  1. S $P(X,"^",1)=STARTTIME
  1. S $P(X,"^",2)=$E(IMAGINGSERVICE,1) ; R or C
  1. S $P(X,"^",3)=RUNTIME ; updated during the run
  1. S $P(X,"^",4)=$E(OPTION,1) ; C or R
  1. S $P(X,"^",5)="STARTED" ; will be updated during the run
  1. S $P(X,"^",6)=$E(SCANMODE,1) ; D, N, or P
  1. S $P(X,"^",7)=QRSCP
  1. S $P(X,"^",9)=BEGDATE
  1. S $P(X,"^",10)=ENDDATE
  1. S $P(X,"^",11)=STARTIEN
  1. S $P(X,"^",12)=BATCHSIZE
  1. S $P(X,"^",13)=$E(SORTORDER,1) ; A or D
  1. S $P(X,"^",14)=HOURS
  1. S $P(X,"^",15)=DFN
  1. ;
  1. ; piece 8 will be set in ^MAGDSTV1
  1. ; pieces 15-18 will be set in ^MAGDSTAA
  1. ;
  1. S $P(X,"^",19)=DUZ
  1. S $P(X,"^",20)=MENUOPTION
  1. S ^MAGDSTT(2006.543,RUNNUMBER,0)=X
  1. I IMAGINGSERVICE="CONSULTS" D ; add the consult request services, if applicable
  1. . S (I,J)=0
  1. . F S I=$O(CONSULTSERVICES(I)) Q:'I D
  1. . . S J=J+1
  1. . . S ^MAGDSTT(2006.543,RUNNUMBER,1,J,0)=I
  1. . . S ^MAGDSTT(2006.543,RUNNUMBER,1,"B",I,J)=""
  1. . . Q
  1. . S ^MAGDSTT(2006.543,RUNNUMBER,1,0)="^2006.5431P^"_J_"^"_J
  1. . Q
  1. S ^MAGDSTT(2006.543,"B",STARTTIME,RUNNUMBER)=""
  1. S ^MAGDSTT(2006.543,"C",MENUOPTION,$E(SCANMODE,1),RUNNUMBER)=""
  1. L -^MAGDSTT(2006.543,0)
  1. ;
  1. D INITSTT^MAGDSTA(RUNNUMBER) ; initialize the statistics
  1. ;
  1. S ^TMP("MAG",$J,"BATCH Q/R","RUN NUMBER")=RUNNUMBER
  1. ;
  1. S DIRECTION=$$DIRECTON(SORTORDER)
  1. ;
  1. S ^XTMP(MAGXTMP,"AUTO Q/R",HOSTNAME,$J,"STATUS")="RUN",^("IMAGING SERVICE")=IMAGINGSERVICE
  1. S ^XTMP(MAGXTMP,"AUTO Q/R",HOSTNAME,$J,"SCAN MODE")=SCANMODE,^("OPTION")=OPTION
  1. S ^XTMP(MAGXTMP,"AUTO Q/R",HOSTNAME,$J,"START TIME")=$$NOW^XLFDT
  1. ;
  1. I IMAGINGSERVICE="RADIOLOGY" D
  1. . S STOP=$$MAIN^MAGDSTA5()
  1. . Q
  1. E D ; consults and procedures
  1. . S STOP=$$MAIN^MAGDSTA7()
  1. . Q
  1. ;
  1. ;
  1. ; STOP: -1=error, 0=run completed, 1=run stopped
  1. S RUNTIME=$$NOW^XLFDT()
  1. S $P(^MAGDSTT(2006.543,RUNNUMBER,0),"^",3)=RUNTIME ; final time updated
  1. S X=$S(STOP<0:"Stopped due to Error",STOP>0:"Stopped by User",1:"COMPLETED")
  1. S $P(^MAGDSTT(2006.543,RUNNUMBER,0),"^",5)=X
  1. W !!,"RUN ",X
  1. W " at ",$$FMTE^XLFDT($$NOW^XLFDT,1)
  1. K ^XTMP(MAGXTMP,"AUTO Q/R",HOSTNAME,$J)
  1. K ^TMP("MAG",$J,"BATCH Q/R")
  1. D CONTINUE^MAGDSTQ
  1. Q
  1. ;
  1. DIRECTON(SORTORDER) ; return the direction for $order
  1. ; 1 = normal order
  1. ; -1 = reverse order
  1. Q $S(SORTORDER="ASCENDING":1,SORTORDER="DESCENDING":-1)
  1. ;
  1. COPYPARM(NORMALRUN) ; copy last run's parameters for the next run
  1. N I,DIRECTION
  1. S ^TMP("MAG",$J,"BATCH Q/R","PACS Q/R RETRIEVE SCP")=QRSCP
  1. S ^TMP("MAG",$J,"Q/R PARAM","SCAN MODE")=SCANMODE
  1. S ^TMP("MAG",$J,"BATCH Q/R","SORT ORDER")=SORTORDER
  1. S ^TMP("MAG",$J,"BATCH Q/R","HOURS OF OPERATION")=HOURS
  1. ;
  1. S ^TMP("MAG",$J,"Q/R PARAM","QUERY USER APPLICATION")=QRSCP ; needed for QRSCP^MAGDSTA2
  1. ;
  1. S DIRECTION=$$DIRECTON(SORTORDER)
  1. ;
  1. ; get scan mode specific parameters
  1. I SCANMODE="PATIENT" D
  1. . ; user may want to change patient
  1. . S ^TMP("MAG",$J,"BATCH Q/R","PATIENT DFN")=DFN
  1. . Q
  1. I (SCANMODE="DATE")!(SCANMODE="PATIENT") D ; user may want to change date range
  1. . I SORTORDER="ASCENDING" D ; set BEGIN DATE to the last date of the previous run
  1. . . I NORMALRUN S ^TMP("MAG",$J,"BATCH Q/R","BEGIN DATE")=$$NEXTDATE(ENDDATE,DIRECTION)
  1. . . E S ^TMP("MAG",$J,"BATCH Q/R","BEGIN DATE")=STUDYDATE\1
  1. . . S ^TMP("MAG",$J,"BATCH Q/R","END DATE")=""
  1. . . Q
  1. . E D ; DESCENDING -- set END DATE to the last date of the previous run
  1. . . I NORMALRUN S ^TMP("MAG",$J,"BATCH Q/R","END DATE")=$$NEXTDATE(BEGDATE,DIRECTION)
  1. . . E S ^TMP("MAG",$J,"BATCH Q/R","END DATE")=STUDYDATE\1
  1. . . S ^TMP("MAG",$J,"BATCH Q/R","BEGIN DATE")=""
  1. . . Q
  1. . Q
  1. E I SCANMODE="NUMBER" D
  1. . ; set REPORT/STUDY IEN to the last IEN of the previous run
  1. . S ^TMP("MAG",$J,"BATCH Q/R","REPORT/STUDY IEN")=(STUDYIEN+DIRECTION)
  1. . S ^TMP("MAG",$J,"BATCH Q/R","BATCH SIZE")=BATCHSIZE
  1. . Q
  1. ;
  1. ; get consult services
  1. M ^TMP("MAG",$J,"BATCH Q/R","CONSULT SERVICES")=CONSULTSERVICES
  1. Q
  1. ;
  1. NEXTDATE(DATE,DIRECTION) ; get the next date, but not in the future
  1. N NEXTDATE,NOW
  1. S NOW=$$NOW^XLFDT\1
  1. S NEXTDATE=$$FMADD^XLFDT(DATE\1,DIRECTION)
  1. I NEXTDATE>NOW S NEXTDATE=NOW ; no future dates
  1. Q NEXTDATE