123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #date sorts studies from orthanc dataset into target study dataset
- import os
- import json
- import re
- import sys
- import datetime
- import re
- def main(parameterFile):
- fhome=os.path.expanduser('~')
- fsetup=os.path.join(fhome,'.labkey','setup.json')
- with open(fsetup,'r') as f:
- setup=json.load(f)
- sys.path.insert(0,setup['paths']['labkeyInterface'])
- import labkeyInterface
- import labkeyDatabaseBrowser
- import labkeyFileBrowser
- fconfig=os.path.join(fhome,'.labkey','network.json')
- net=labkeyInterface.labkeyInterface()
- net.init(fconfig)
- db=labkeyDatabaseBrowser.labkeyDB(net)
- fb=labkeyFileBrowser.labkeyFileBrowser(net)
- with open(parameterFile,'r') as f:
- pars=json.load(f)
- i=0
- #from orthancDatabase/Imaging dataset
- projectOrthanc=pars['Orthanc']['project']
- inputQuery=pars['Orthanc']['queryName']
- inputSchema=pars['Orthanc']['schemaName']
- inputParticipantField=pars['Orthanc']['participantField']
- #to target project dataset
- projectStudy=pars['Database']['project']
- #'iPNUMMretro/Study'
- #for prospective, set
- #projectStudy='IPNUMMprospektiva/Study'
- outputQuery=pars['Database']['queryName']
- outputSchema=pars['Database']['schemaName']
- #select patientId that are contained in the demographics dataset
- transferQuery=pars['Database']['transferQuery']
- dbParticipantField=pars['Database']['participantField']
- #make a list of images
- dsImage=db.selectRows(projectStudy,outputSchema,transferQuery,[])
- for im in dsImage['rows']:
- idFilter={'variable':inputParticipantField,'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])
- for im1 in dsOrthanc['rows']:
- date=datetime.datetime.strptime(im1['studyDate'],'%Y/%m/%d %H:%M:%S')
- #convert date to %Y%m%d notation
- dateYMD=date.strftime('%Y%m%d')
- if dateYMD!=im['imageDate']:
- print('Rejecting mismatch: {}/{}'.format(dateYMD,im['imageDate']))
- continue
-
- outvar='NONE'
- sd=im1['seriesDescription']
- if sd=='PET WB':
- outvar='PETWB_orthancId'
- print('Found PET: {}'.format(im1['orthancSeries']))
- if sd.find('CT WB')==0:
- if sd.find('fov')<0:
- outvar='CT_orthancId'
- print('Found CT: {}'.format(im1['orthancSeries']))
- #skip irrelevant series
- if outvar=='NONE':
- continue
- #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)))
- #ds1 are the matching outputs in target dataset
- ds1=db.selectRows(projectStudy,outputSchema,outputQuery,\
- [idFilter,seqFilter])
-
- if len(ds1['rows'])>1:
- print('ERROR: too many matches for {}/{}'.\
- format(im[dbParticipantField],seqNum))
- continue
- mode='update'
- outRow={}
- if len(ds1['rows'])==0:
- mode='insert'
-
- outRow[dbParticipantField]=im[dbParticipantField]
- outRow['SequenceNum']=seqNum
- outRow['dicomStudy']=im1['dicomStudy']
-
- else:
- outRow=ds1['rows'][0]
-
- outRow[outvar]=im1['orthancSeries']
- outRow['studyDate']=im1['studyDate']
- outRow['imagingVisitId']=im['imagingVisitId']
- outRow['visitCode']='VISIT_'+str(im['imagingVisitId'])
- status=db.modifyRows(mode,projectStudy,outputSchema,outputQuery,[outRow])
- print('{}'.format(status))
-
- print("Done")
- if __name__=='__main__':
- main(sys.argv[1])
|