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

MAGVRS61.m

Go to the documentation of this file.
  1. MAGVRS61 ;WOIFO/DAC,JSJ - RPC calls for DICOM file processing ; 20 Nov 2015 11:20 AM
  1. ;;3.0;IMAGING;**118,162,307**;Mar 19, 2002;Build 28
  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. ;
  1. ; Reference to GET1^DIQ in ICR #2056
  1. ;
  1. Q
  1. DUPUID(OUT,ACCESSION,DFN,TYPE,UID,STUDUID,SERUID) ; Check for duplicate UIDs in the new structure
  1. ; OUT - Duplicate message output
  1. ; ACCESSION - Accession # ; DFN - Patient DFN
  1. ; TYPE - Type of UID check - "STUDY", "SERIES", or "SOP"
  1. ; UID - Unique Identifier
  1. ; if accession number does not match then it's a duplicate UID
  1. ; OUT:
  1. ;
  1. ; -1 - Exception with error message
  1. ;
  1. ; 0 - Not a duplicate UID - Non duplicates are either have no entries in the 2005.6x files
  1. ; or they match on UID, DFN, Accession, and parent UIDs
  1. ; 1 - Duplicate UID - Duplicates have an entry in a 2005.6x file, but does not match
  1. ; on UID, DFN, Accession, and/or parent UID
  1. ; 2 - Record exist - A record exists with a matching DFN, Accession, Study UID, Series UID,
  1. ; and SOP UID already
  1. N SOPOUT,SOPLINK
  1. I TYPE'="STUDY",TYPE'="SERIES",TYPE'="SOP" S OUT="-1~TYPE is not Study, Series, or SOP" Q
  1. S OUT=0
  1. ; If the UID and the accession are already being used and the UID is not linked to the
  1. ; procedure REF with the same accession then the UID is a duplicate
  1. I TYPE="STUDY",$D(^MAGV(2005.62,"B",UID)) D
  1. . I $$LINKED(ACCESSION,DFN,UID,"STUDY") Q
  1. . S OUT=1
  1. . Q
  1. I TYPE="SERIES",$D(^MAGV(2005.63,"B",UID)) D
  1. . I $$LINKED(ACCESSION,DFN,UID,"SERIES",STUDUID) Q
  1. . S OUT=1
  1. . Q
  1. I TYPE="SOP",$D(^MAGV(2005.64,"B",UID)) D
  1. . S SOPLINK=$$LINKED(ACCESSION,DFN,UID,"SOP",STUDUID,SERUID)
  1. . I SOPLINK=2 S OUT=0 Q
  1. . I SOPLINK="NOT AOF" S OUT=0 Q ; P162 DAC - Check AOF before checking if duplicate
  1. . I SOPLINK=1 S OUT=2 Q
  1. . S OUT=1
  1. . Q
  1. Q OUT
  1. DUPSTUD(DFN,ACCESSION,UID) ; Check for duplicate Study UID
  1. S TYPE="STUDY"
  1. I $G(ACCESSION)="" Q "-1~No accession number provided"
  1. I $G(DFN)="" Q "-1~No patient DFN provided"
  1. D DUPUID(.OUT,ACCESSION,DFN,TYPE,UID)
  1. Q OUT
  1. DUPSER(DFN,ACCESSION,STUDUID,UID) ; Check for duplicate Series UID
  1. S TYPE="SERIES"
  1. I $G(ACCESSION)="" Q "-1~No accession number provided"
  1. I $G(DFN)="" Q "-1~No patient DFN provided"
  1. D DUPUID(.OUT,ACCESSION,DFN,TYPE,UID,STUDUID)
  1. Q OUT
  1. DUPSOP(DFN,ACCESSION,STUDUID,SERUID,UID) ; Check for duplicate SOP UID
  1. S TYPE="SOP"
  1. I $G(ACCESSION)="" Q "-1~No accession number provided"
  1. I $G(DFN)="" Q "-1~No patient DFN provided"
  1. D DUPUID(.OUT,ACCESSION,DFN,TYPE,UID,STUDUID,SERUID)
  1. Q OUT
  1. LINKED(ACCESSION,DFN,UID,UIDTYPE,STUDUIDA,SERUIDA) ; Check if duplicate UID is linked to the same procedure, patient, and parent Study, Series, SOP IENS
  1. N LINK,IEN,PROCIEN,STUDYIEN,SERIESIEN,SOPIEN,PROCCASE,PRIEN,PRDFN,STATUS,STUDUIDB,SOPUIDB,PATPROC,SERUIDB,AOF,STUDUIDO ;P307 add STUDDUI0 (original study UID)
  1. S LINK=0
  1. I UIDTYPE="STUDY" D
  1. . ; Check if the Study IEN is linked to the procedure IEN with the Accession #
  1. . S STUDYIEN=""
  1. . F S STUDYIEN=$O(^MAGV(2005.62,"B",UID,STUDYIEN)) Q:STUDYIEN="" D Q:STATUS="A"
  1. . . S STATUS=$P($G(^MAGV(2005.62,STUDYIEN,5)),U,2)
  1. . . Q:STATUS="I"
  1. . . S PATPROC=$G(^MAGV(2005.62,STUDYIEN,6))
  1. . . S PROCIEN=$P(PATPROC,U,1)
  1. . . S PRIEN=$P(PATPROC,U,3)
  1. . . Q
  1. . Q
  1. I UIDTYPE="SERIES" D
  1. . ; Check if the Series IEN is linked to the procedure IEN with the Accession #
  1. . S SERIESIEN=""
  1. . F S SERIESIEN=$O(^MAGV(2005.63,"B",UID,SERIESIEN)) Q:SERIESIEN="" D Q:STATUS="A"
  1. . . S STATUS=$G(^MAGV(2005.63,SERIESIEN,9))
  1. . . Q:STATUS="I"
  1. . . S STUDYIEN=$P($G(^MAGV(2005.63,SERIESIEN,6)),U,1)
  1. . . S STUDUIDB=$P($G(^MAGV(2005.62,STUDYIEN,0)),U,1)
  1. . . S PATPROC=$G(^MAGV(2005.62,STUDYIEN,6))
  1. . . S PROCIEN=$P(PATPROC,U,1)
  1. . . S PRIEN=$P(PATPROC,U,3)
  1. . . Q
  1. . Q
  1. I UIDTYPE="SOP" D
  1. . ; Check if the SOP IEN is linked to the procedure IEN with the Accession #
  1. . S SOPIEN=""
  1. . F S SOPIEN=$O(^MAGV(2005.64,"B",UID,SOPIEN)) Q:SOPIEN="" D Q:STATUS="A"
  1. . . S STATUS=$G(^MAGV(2005.64,SOPIEN,11))
  1. . . Q:STATUS="I"
  1. . . S AOF=$P($G(^MAGV(2005.64,SOPIEN,6)),U,2)
  1. . . S SERIESIEN=$P($G(^MAGV(2005.64,SOPIEN,6)),U,1)
  1. . . S SERUIDB=$P($G(^MAGV(2005.63,SERIESIEN,0)),U,1)
  1. . . S STUDYIEN=$P($G(^MAGV(2005.63,SERIESIEN,6)),U,1)
  1. . . S STUDUIDB=$P($G(^MAGV(2005.62,STUDYIEN,0)),U,1)
  1. . . S PATPROC=$G(^MAGV(2005.62,STUDYIEN,6))
  1. . . S PROCIEN=$P(PATPROC,U,1)
  1. . . S PRIEN=$P(PATPROC,U,3)
  1. . . Q
  1. . Q
  1. I $G(PROCIEN)="" Q LINK ; Not linked to a procedure ref
  1. I $G(PRIEN)="" Q LINK ; Not linked to a procedure ref
  1. S PROCCASE=$P(^MAGV(2005.61,PROCIEN,0),U,1)
  1. S PRDFN=$P($G(^MAGV(2005.6,PRIEN,0)),U,1)
  1. S STUDUIDO=$P($G(^MAGV(2005.62,STUDYIEN,0)),U,2) ;P307 get original study UID
  1. I (STUDUIDO]""),(STUDUIDA'=STUDUIDB) S STUDUIDB=STUDUIDO ;P307 replace study UID with original study UID for compare
  1. I PRDFN=DFN,ACCESSION=PROCCASE S LINK=1
  1. I UIDTYPE="SERIES",LINK,STUDUIDA'=STUDUIDB S LINK=0 ;P307 use UIDTYPE passed rather than TYPE that falls through
  1. I UIDTYPE="SOP",LINK,((STUDUIDA'=STUDUIDB)!(SERUIDA'=SERUIDB)) S LINK=0 ;P307 use UIDTYPE
  1. I LINK=1,UIDTYPE="SOP",AOF'=1 S LINK="NOT AOF" Q LINK ;P307 use UIDTYPE
  1. I $G(STATUS)="I" Q 2 ; P162 DAC - Check Status after AOF check. No accessible record found.
  1. Q LINK
  1. LOGDUP(ORIGUID,NEWUID,ACCESSION,DFN,TYPE,STUDYUID,SERUID) ; Log duplicate UIDs
  1. N FDA,FILE,ONEWUID,SOCTYPE
  1. S ONEWUID=NEWUID ; Store original generated NEWUID with postfix
  1. I TYPE="SERIES",STUDYUID="" S NEWUID="-1~No Study UID provided" Q
  1. I TYPE="SOP",STUDYUID="" S NEWUID="-1~No Study UID provided" Q
  1. I TYPE="SOP",SERUID="" S NEWUID="-1~No Series UID provided" Q
  1. L +^MAGV(2005.66,"C",ONEWUID):1E9 ; Lock generated UID
  1. I TYPE="STUDY" S SOCTYPE=1
  1. I TYPE="SERIES" S SOCTYPE=2
  1. I TYPE="SOP" S SOCTYPE=3
  1. S FILE=2005.66
  1. D LOGLOOK(.NEWUID)
  1. S FDA(FILE,"+1,",.01)=ORIGUID
  1. S FDA(FILE,"+1,",2)=NEWUID
  1. S FDA(FILE,"+1,",3)=ACCESSION
  1. S FDA(FILE,"+1,",4)=DFN
  1. S FDA(FILE,"+1,",5)=SOCTYPE
  1. I $G(STUDYUID)'="" S FDA(FILE,"+1,",6)=STUDYUID
  1. I $G(SERUID)'="" S FDA(FILE,"+1,",7)=SERUID
  1. D UPDATE^DIE("","FDA")
  1. L -^MAGV(2005.66,"C",ONEWUID) ; Unlock original generated UID
  1. I NEWUID'=ONEWUID L -^MAGV(2005.66,"C",NEWUID) ; Unlock new generated UID with postfix
  1. K FDA
  1. Q
  1. LOGLOOK(NEWUID) ; Look for UID in duplicate log and generate a new UID if there is a duplicate
  1. N POSTFIX
  1. I '$$UIDCHECK(NEWUID) F POSTFIX=1:1 Q:$$UIDCHECK(NEWUID_"."_POSTFIX)
  1. I $G(POSTFIX)'="" D
  1. . S NEWUID=NEWUID_"."_POSTFIX
  1. . L +^MAGV(2005.66,"C",NEWUID):1E9
  1. . Q
  1. Q
  1. UIDCHECK(POSTUID) ; Check if newly generated UID exists in UID database indexes
  1. ; If UID is found return 0, if UID is not found return 1
  1. N UNIQUE
  1. S UNIQUE=1
  1. D ; Check file indexes for UID
  1. . ; Check for duplicate in new UID log
  1. . I $D(^MAGV(2005.66,"C",POSTUID)) S UNIQUE=0 Q
  1. . ; Check for duplicate Study and SOP in 2005
  1. . I $D(^MAG(2005,"P",POSTUID)) S UNIQUE=0 Q
  1. . ; Check for duplicate Series in 2005
  1. . I $D(^MAG(2005,"SERIESUID",POSTUID)) S UNIQUE=0 Q
  1. . ; Check for duplicate Study in 2005.62
  1. . I $D(^MAGV(2005.62,"B",POSTUID)) S UNIQUE=0 Q
  1. . ; Check for duplicate Series in 2005.63
  1. . I $D(^MAGV(2005.63,"B",POSTUID)) S UNIQUE=0 Q
  1. . ; Check for duplicate SOP in 2005.64
  1. . I $D(^MAGV(2005.64,"B",POSTUID)) S UNIQUE=0 Q
  1. . Q
  1. Q UNIQUE
  1. UIDLOOK(UID,DFN,ACC,TYPE,STUDYUID,SERUID) ; Look to see if Original UID exists and if entry matches DFN and ACC provided. If so, return New UID. Otherwise, 0.
  1. N OUT,IEN,ENTRY,ENTRY2,STYPE
  1. S OUT=0
  1. I (UID="")!($G(DFN)="")!($G(ACC)="")!($G(TYPE)="") Q OUT
  1. I '$D(^MAGV(2005.66,"B",UID)) Q OUT
  1. I TYPE="SERIES",$G(STUDYUID)="" Q OUT
  1. I TYPE="SOP",($G(SERUID)="")!($G(STUDYUID)="") Q OUT
  1. I TYPE="SERIES" I '$D(^MAGV(2005.66,"D",UID,$G(STUDYUID))) Q OUT
  1. I TYPE="SOP" I '$D(^MAGV(2005.66,"E",UID,$G(SERUID))) Q OUT
  1. S IEN=""
  1. F S IEN=$O(^MAGV(2005.66,"B",UID,IEN)) Q:(IEN="")!(OUT'=0) D
  1. . S ENTRY=$G(^MAGV(2005.66,IEN,0))
  1. . S ENTRY2=$G(^MAGV(2005.66,IEN,1))
  1. . S STYPE=$P($$GET1^DIQ(2005.66,IEN,5)," ",1)
  1. . I DFN=$P(ENTRY,U,4),ACC=$P(ENTRY,U,3),TYPE=STYPE D
  1. . . I TYPE="STUDY",$G(UID)=$P(ENTRY,U,1) S OUT=$P(ENTRY,U,2) Q
  1. . . I TYPE="SERIES",$G(STUDYUID)=$P(ENTRY2,U,1),$G(UID)=$P(ENTRY,U,1) S OUT=$P(ENTRY,U,2) Q
  1. . . I TYPE="SOP",$G(STUDYUID)=$P(ENTRY2,U,1),$G(SERUID)=$P(ENTRY2,U,2),$G(UID)=$P(ENTRY,U,1) S OUT=$P(ENTRY,U,2) Q
  1. Q OUT
  1. DELLOG(OUT,IEN,FILE) ; Remove inactivated entries from the duplicate log
  1. N DUPIEN,PIEN,ACC,DFN,SOPUID,SERUID,STUDUID,TYPE,ERR,UID,PATIEN,SSEP,PROCIEN,PATID,DUPDATA1,DUPDATA2
  1. N DUPACC,DUPPATID,DSERUID,IENS,FDA,DSTDUID,STUDDATA,DELETE
  1. ;
  1. S OUT="0"
  1. S SSEP=$$STATSEP^MAGVRS41
  1. I (FILE'=2005.64)&(FILE'=2005.63)&(FILE'=2005.62) S OUT="-1"_SSEP_"Invalid file number" Q
  1. I IEN="" S OUT="-7"_SSEP_"No IEN provided" Q
  1. I FILE=2005.64 D
  1. . S (SOPUID,UID)=$P($G(^MAGV(2005.64,IEN,0)),U,1)
  1. . S IEN=$P($G(^MAGV(2005.64,IEN,6)),U,1)
  1. . Q
  1. I IEN="" S OUT="-8"_SSEP_"No Parent Record" Q
  1. I FILE>=2005.63 D
  1. . I FILE=2005.64 S SERUID=$P($G(^MAGV(2005.63,IEN,0)),U,2)
  1. . I FILE=2005.63 S SERUID=$P($G(^MAGV(2005.63,IEN,0)),U,1)
  1. . I '$D(UID) S UID=SERUID
  1. . S IEN=$P($G(^MAGV(2005.63,IEN,6)),U,1)
  1. . Q
  1. I IEN="" S OUT="-8"_SSEP_"No Parent Record" Q
  1. I FILE>=2005.62 D
  1. . I FILE=2005.62 S STUDUID=$P($G(^MAGV(2005.62,IEN,0)),U,1)
  1. . I FILE'=2005.62 S STUDUID=$P($G(^MAGV(2005.62,IEN,0)),U,2)
  1. . I '$D(UID) S UID=STUDUID
  1. . S STUDDATA=$G(^MAGV(2005.62,IEN,6))
  1. . S PATIEN=$P(STUDDATA,U,3)
  1. . S PROCIEN=$P(STUDDATA,U,1)
  1. . I (PROCIEN="")!(PATIEN="") Q
  1. . S ACC=$P($G(^MAGV(2005.61,PROCIEN,0)),U,1)
  1. . S PATID=$P($G(^MAGV(2005.6,PATIEN,0)),U,1)
  1. . Q
  1. I PATIEN="" S OUT="-9"_SSEP_"No Patient Record" Q
  1. I PROCIEN="" S OUT="-10"_SSEP_"No Procedure Record" Q
  1. S DUPIEN=""
  1. F DUPIEN=$O(^MAGV(2005.66,"C",UID,DUPIEN)) Q:DUPIEN="" D
  1. . S DUPDATA1=$G(^MAGV(2005.66,DUPIEN,0))
  1. . S DUPDATA2=$G(^MAGV(2005.66,DUPIEN,1))
  1. . S DUPACC=$P(DUPDATA1,U,3),DUPPATID=$P(DUPDATA1,U,4)
  1. . S DSTDUID=$P(DUPDATA2,U,1),DSERUID=$P(DUPDATA2,U,2)
  1. . S DELETE=0
  1. . I FILE=2005.64,ACC=DUPACC,PATID=DUPPATID,((STUDUID=DSTDUID)!('DSTDUID)),(($G(SERUID)=DSERUID)!('DSERUID)) S DELETE=1 ; SOP Check
  1. . I FILE=2005.63,ACC=DUPACC,PATID=DUPPATID,((STUDUID=DSTDUID)!('DSTDUID)) S DELETE=1 ; Series Check
  1. . I FILE=2005.62,ACC=DUPACC,PATID=DUPPATID S DELETE=1 ; Study Check
  1. . I DELETE D
  1. . . ; Delete matching duplicate entries
  1. . . S IENS=DUPIEN_","
  1. . . S FDA(2005.66,IENS,.01)="@"
  1. . . D FILE^DIE("","FDA","ERR")
  1. . . S OUT="0"
  1. . . I $D(ERR("DIERR")) S OUT="-11"_SSEP_$G(ERR("DIERR",1,"TEXT",1))
  1. . . Q
  1. . Q
  1. Q
  1. ;