scanOrthanc.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #scans orthanc database and updates Demographics datataset and
  2. #series list in project Imaging dataset
  3. import os
  4. import json
  5. import re
  6. import sys
  7. def main(parameterFile):
  8. fhome=os.path.expanduser('~')
  9. fsetup=os.path.join(fhome,'.labkey','setup.json')
  10. with open(fsetup,'r') as f:
  11. setup=json.load(f)
  12. sys.path.insert(0,setup['paths']['labkeyInterface'])
  13. import labkeyInterface
  14. import labkeyDatabaseBrowser
  15. sys.path.insert(0,setup['paths']['orthancInterface'])
  16. import orthancInterface
  17. import orthancDatabaseBrowser
  18. fconfig=os.path.join(fhome,'.labkey','network.json')
  19. net=labkeyInterface.labkeyInterface()
  20. net.init(fconfig)
  21. db=labkeyDatabaseBrowser.labkeyDB(net)
  22. onet=orthancInterface.orthancInterface()
  23. onet.init(fconfig)
  24. odb=orthancDatabaseBrowser.orthancDB(onet)
  25. with open(parameterFile) as f:
  26. pars=json.load(f)
  27. i=0
  28. opars=pars['Orthanc']
  29. project=opars['project']
  30. participantField=opars['participantField']
  31. patients=odb.getPatients()
  32. n=len(patients)
  33. for p in patients:
  34. pdata=odb.getPatientData(p)
  35. dicom=pdata['MainDicomTags']
  36. patientId=dicom['PatientID']
  37. print("[{}/{}] Patient: {} ID: {}".format(i,n,p,patientId))
  38. qfilter={'variable':participantField,'value':patientId,'oper':'eq'}
  39. ds=db.selectRows(project,opars['schemaName'],\
  40. opars['demographicsQuery'],[qfilter])
  41. if len(ds['rows'])==0:
  42. row={}
  43. row[participantField]=patientId
  44. row['birthDate']=dicom['PatientBirthDate']
  45. row['PatientName']=dicom['PatientName']
  46. row['OrthancId']=p
  47. db.modifyRows('insert',project,opars['schemaName'],\
  48. opars['demographicsQuery'],[row])
  49. for s in pdata['Studies']:
  50. sdata=odb.getStudyData(s)
  51. sdicom=sdata['MainDicomTags']
  52. sid=sdicom['StudyInstanceUID']
  53. print('\tStudy: {}/{}'.format(s,sid))
  54. #print('Data: {}'.format(sdata))
  55. sdate=sdicom['StudyDate']
  56. #continue
  57. for se in sdata['Series']:
  58. qfilter={'variable':'orthancSeries','value':se,'oper':'eq'}
  59. ds=db.selectRows(project,opars['schemaName'],\
  60. opars['queryName'],[qfilter])
  61. if len(ds['rows'])>0:
  62. continue
  63. #count existing entries for patient
  64. qfilter={'variable':participantField,'value':patientId,'oper':'eq'}
  65. ds=db.selectRows(project,opars['schemaName'],\
  66. opars['queryName'],[qfilter])
  67. seqNum=len(ds['rows'])
  68. sedata=odb.getSeriesData(se)
  69. sedicom=sedata['MainDicomTags']
  70. seid=sedicom['SeriesInstanceUID']
  71. #print('Data: {}'.format(sedata))
  72. seDesc="NONE"
  73. try:
  74. seDesc=sedicom['SeriesDescription']
  75. except KeyError:
  76. pass
  77. print('\t\tSeries[{}]: {}/{}'.format(seDesc,se,seid))
  78. row={}
  79. row[participantField]=patientId
  80. row['sequenceNum']=seqNum
  81. row['dicomStudy']=sid
  82. row['orthancStudy']=s
  83. row['dicomSeries']=seid
  84. row['orthancSeries']=se
  85. row['studyDate']=sdate
  86. row['seriesDescription']=seDesc
  87. db.modifyRows('insert',project,opars['schemaName'],\
  88. opars['queryName'],[row])
  89. i+=1
  90. print("Done")
  91. if __name__=="__main__":
  92. main(sys.argv[1])