populateImagingFromTransferList.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #date sorts studies from orthanc dataset into target study dataset
  2. import os
  3. import json
  4. import re
  5. import sys
  6. import datetime
  7. import re
  8. def main(parameterFile):
  9. fhome=os.path.expanduser('~')
  10. fsetup=os.path.join(fhome,'.labkey','setup.json')
  11. with open(fsetup,'r') as f:
  12. setup=json.load(f)
  13. sys.path.insert(0,setup['paths']['labkeyInterface'])
  14. import labkeyInterface
  15. import labkeyDatabaseBrowser
  16. import labkeyFileBrowser
  17. fconfig=os.path.join(fhome,'.labkey','network.json')
  18. net=labkeyInterface.labkeyInterface()
  19. net.init(fconfig)
  20. db=labkeyDatabaseBrowser.labkeyDB(net)
  21. fb=labkeyFileBrowser.labkeyFileBrowser(net)
  22. with open(parameterFile,'r') as f:
  23. pars=json.load(f)
  24. i=0
  25. #from orthancDatabase/Imaging dataset
  26. projectOrthanc=pars['Orthanc']['project']
  27. inputQuery=pars['Orthanc']['queryName']
  28. inputSchema=pars['Orthanc']['schemaName']
  29. inputParticipantField=pars['Orthanc']['participantField']
  30. #to target project dataset
  31. projectStudy=pars['Database']['project']
  32. #'iPNUMMretro/Study'
  33. #for prospective, set
  34. #projectStudy='IPNUMMprospektiva/Study'
  35. outputQuery=pars['Database']['queryName']
  36. outputSchema=pars['Database']['schemaName']
  37. #select patientId that are contained in the demographics dataset
  38. transferQuery=pars['Database']['transferQuery']
  39. dbParticipantField=pars['Database']['participantField']
  40. #make a list of images
  41. dsImage=db.selectRows(projectStudy,outputSchema,transferQuery,[])
  42. for im in dsImage['rows']:
  43. idFilter={'variable':inputParticipantField,'value':im[dbParticipantField],\
  44. 'oper':'eq'}
  45. #have to convert from datetime to %Y%m%d format
  46. #dateFilter={'variable':'imageDate','value':im['imageDate'],'oper':'eq'}
  47. dsOrthanc=db.selectRows(projectOrthanc,inputSchema,inputQuery,[idFilter])
  48. for im1 in dsOrthanc['rows']:
  49. date=datetime.datetime.strptime(im1['studyDate'],'%Y/%m/%d %H:%M:%S')
  50. #convert date to %Y%m%d notation
  51. dateYMD=date.strftime('%Y%m%d')
  52. if dateYMD!=im['imageDate']:
  53. print('Rejecting mismatch: {}/{}'.format(dateYMD,im['imageDate']))
  54. continue
  55. outvar='NONE'
  56. sd=im1['seriesDescription']
  57. if sd=='PET WB':
  58. outvar='PETWB_orthancId'
  59. print('Found PET: {}'.format(im1['orthancSeries']))
  60. if sd.find('CT WB')==0:
  61. if sd.find('fov')<0:
  62. outvar='CT_orthancId'
  63. print('Found CT: {}'.format(im1['orthancSeries']))
  64. #skip irrelevant series
  65. if outvar=='NONE':
  66. continue
  67. #figure out which row in output study to update
  68. filters=[]
  69. idFilter={'variable':dbParticipantField,'value':im[dbParticipantField],'oper':'eq'}
  70. seqNum=im['imagingVisitId']
  71. seqFilter={'variable':'SequenceNum','value':str(seqNum),'oper':'eq'}
  72. print('Participant {} Sequence number {}'.format(im[dbParticipantField],str(seqNum)))
  73. #ds1 are the matching outputs in target dataset
  74. ds1=db.selectRows(projectStudy,outputSchema,outputQuery,\
  75. [idFilter,seqFilter])
  76. if len(ds1['rows'])>1:
  77. print('ERROR: too many matches for {}/{}'.\
  78. format(im[dbParticipantField],seqNum))
  79. continue
  80. mode='update'
  81. outRow={}
  82. if len(ds1['rows'])==0:
  83. mode='insert'
  84. outRow[dbParticipantField]=im[dbParticipantField]
  85. outRow['SequenceNum']=seqNum
  86. outRow['dicomStudy']=im1['dicomStudy']
  87. else:
  88. outRow=ds1['rows'][0]
  89. outRow[outvar]=im1['orthancSeries']
  90. outRow['studyDate']=im1['studyDate']
  91. outRow['imagingVisitId']=im['imagingVisitId']
  92. outRow['visitCode']='VISIT_'+str(im['imagingVisitId'])
  93. status=db.modifyRows(mode,projectStudy,outputSchema,outputQuery,[outRow])
  94. print('{}'.format(status))
  95. print("Done")
  96. if __name__=='__main__':
  97. main(sys.argv[1])