|
@@ -1,5 +1,8 @@
|
|
|
#date sorts studies from orthanc dataset into target study dataset
|
|
|
|
|
|
+#takes transferQuery as the list of images that should be available on orthanc
|
|
|
+
|
|
|
+
|
|
|
import os
|
|
|
import json
|
|
|
import re
|
|
@@ -13,7 +16,12 @@ def main(parameterFile):
|
|
|
with open(fsetup,'r') as f:
|
|
|
setup=json.load(f)
|
|
|
|
|
|
- sys.path.insert(0,setup['paths']['labkeyInterface'])
|
|
|
+ sys.path.insert(0,setup['paths']['nixWrapper'])
|
|
|
+
|
|
|
+ import nixWrapper
|
|
|
+
|
|
|
+ nixWrapper.loadLibrary("labkeyInterface")
|
|
|
+
|
|
|
import labkeyInterface
|
|
|
import labkeyDatabaseBrowser
|
|
|
import labkeyFileBrowser
|
|
@@ -48,17 +56,29 @@ def main(parameterFile):
|
|
|
transferQuery=pars['Database']['transferQuery']
|
|
|
dbParticipantField=pars['Database']['participantField']
|
|
|
|
|
|
- #make a list of images
|
|
|
+ missingSchema=pars['Database']['missingImagesSchema']
|
|
|
+ missingQuery=pars['Database']['missingImagesQuery']
|
|
|
+
|
|
|
+ #make a list of images from transferQuery
|
|
|
dsImage=db.selectRows(projectStudy,outputSchema,transferQuery,[])
|
|
|
|
|
|
for im in dsImage['rows']:
|
|
|
- idFilter={'variable':inputParticipantField,'value':im[dbParticipantField],\
|
|
|
- 'oper':'eq'}
|
|
|
+ inputIdFilter={'variable':inputParticipantField,\
|
|
|
+ 'value':im[dbParticipantField],\
|
|
|
+ 'oper':'eq'}
|
|
|
+
|
|
|
+ idFilter={'variable':dbParticipantField,\
|
|
|
+ 'value':im[dbParticipantField],\
|
|
|
+ 'oper':'eq'}
|
|
|
#have to convert from datetime to %Y%m%d format
|
|
|
#dateFilter={'variable':'imageDate','value':im['imageDate'],'oper':'eq'}
|
|
|
|
|
|
- dsOrthanc=db.selectRows(projectOrthanc,inputSchema,inputQuery,[idFilter])
|
|
|
+ dsOrthanc=db.selectRows(projectOrthanc,inputSchema,inputQuery,[inputIdFilter])
|
|
|
+ #what if dsOrthanc['rows'] is empty?
|
|
|
+ #this is part of QA and is reported in missingImages Schema/Query
|
|
|
|
|
|
+ uploadStatus="FAILED"
|
|
|
+ imageDateMismatch=[]
|
|
|
for im1 in dsOrthanc['rows']:
|
|
|
|
|
|
date=datetime.datetime.strptime(im1['studyDate'],'%Y/%m/%d %H:%M:%S')
|
|
@@ -66,6 +86,7 @@ def main(parameterFile):
|
|
|
dateYMD=date.strftime('%Y%m%d')
|
|
|
if dateYMD!=im['imageDate']:
|
|
|
print('Rejecting mismatch: {}/{}'.format(dateYMD,im['imageDate']))
|
|
|
+ imageDateMismatch.append(dateYMD)
|
|
|
continue
|
|
|
|
|
|
outvar='NONE'
|
|
@@ -84,10 +105,10 @@ def main(parameterFile):
|
|
|
|
|
|
#figure out which row in output study to update
|
|
|
filters=[]
|
|
|
- idFilter={'variable':dbParticipantField,'value':im[dbParticipantField],'oper':'eq'}
|
|
|
seqNum=im['imagingVisitId']
|
|
|
seqFilter={'variable':'SequenceNum','value':str(seqNum),'oper':'eq'}
|
|
|
- print('Participant {} Sequence number {}'.format(im[dbParticipantField],str(seqNum)))
|
|
|
+ print('Participant {} Sequence number {}'.\
|
|
|
+ format(im[dbParticipantField],str(seqNum)))
|
|
|
#ds1 are the matching outputs in target dataset
|
|
|
ds1=db.selectRows(projectStudy,outputSchema,outputQuery,\
|
|
|
[idFilter,seqFilter])
|
|
@@ -95,6 +116,7 @@ def main(parameterFile):
|
|
|
if len(ds1['rows'])>1:
|
|
|
print('ERROR: too many matches for {}/{}'.\
|
|
|
format(im[dbParticipantField],seqNum))
|
|
|
+ status="MULTIPLE MATCHES"
|
|
|
continue
|
|
|
|
|
|
mode='update'
|
|
@@ -114,9 +136,34 @@ def main(parameterFile):
|
|
|
outRow['imagingVisitId']=im['imagingVisitId']
|
|
|
outRow['visitCode']='VISIT_'+str(im['imagingVisitId'])
|
|
|
|
|
|
- status=db.modifyRows(mode,projectStudy,outputSchema,outputQuery,[outRow])
|
|
|
- print('{}'.format(status))
|
|
|
+ modifyStatus=db.modifyRows(mode,projectStudy,outputSchema,\
|
|
|
+ outputQuery,[outRow])
|
|
|
+ print('{}'.format(modifyStatus))
|
|
|
+ uploadStatus="LOADED"
|
|
|
|
|
|
+ if uploadStatus=="FAILED":
|
|
|
+ #standard spiel - find if already present; if so, skip, if not, add
|
|
|
+ imFilter={'variable':'imagingVisitId',
|
|
|
+ 'value':'{}'.format(im['imagingVisitId']),
|
|
|
+ 'oper':'eq'}
|
|
|
+ dsMissing=db.selectRows(projectStudy,missingSchema,\
|
|
|
+ missingQuery,[idFilter,imFilter])
|
|
|
+
|
|
|
+ #already recorded
|
|
|
+ imageDateMismatch=list(set(imageDateMismatch))
|
|
|
+ vals=[dbParticipantField,'imagingVisitId','imageDate']
|
|
|
+ mode='insert'
|
|
|
+ if len(dsMissing['rows'])>0:
|
|
|
+ mode='update'
|
|
|
+ orow=dsMissing['rows'][0]
|
|
|
+ else:
|
|
|
+ orow={v:im[v] for v in vals}
|
|
|
+ orow['imageDateMismatch']=','.join(imageDateMismatch)
|
|
|
+ orow['failureDescription']='MISSING DICOM'
|
|
|
+ db.modifyRows(mode,projectStudy,missingSchema,\
|
|
|
+ missingQuery,[orow])
|
|
|
+
|
|
|
+
|
|
|
print("Done")
|
|
|
|
|
|
if __name__=='__main__':
|