scanOrthanc.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import os
  2. import json
  3. import re
  4. import sys
  5. fhome=os.path.expanduser('~')
  6. sys.path.insert(1,fhome+'/software/src/labkeyInterface')
  7. import labkeyInterface
  8. import labkeyDatabaseBrowser
  9. sys.path.insert(1,fhome+'/software/src/orthancInterface')
  10. import orthancInterface
  11. import orthancDatabaseBrowser
  12. fconfig=os.path.join(fhome,'.labkey','network.json')
  13. net=labkeyInterface.labkeyInterface()
  14. net.init(fconfig)
  15. db=labkeyDatabaseBrowser.labkeyDB(net)
  16. onet=orthancInterface.orthancInterface()
  17. onet.init(fconfig)
  18. odb=orthancDatabaseBrowser.orthancDB(onet)
  19. i=0
  20. project='Orthanc/Database'
  21. patients=odb.getPatients()
  22. for p in patients:
  23. print("Extracting patient: {}".format(p))
  24. pdata=odb.getPatientData(p)
  25. dicom=pdata['MainDicomTags']
  26. patientId=dicom['PatientID']
  27. queryPatientId=re.sub(r' ',r'%20',patientId)
  28. print("Patient: {} ID: {}".format(p,patientId))
  29. qfilter={'variable':'ParticipantId','value':queryPatientId,'oper':'eq'}
  30. ds=db.selectRows(project,'study','Demographics',[qfilter])
  31. if len(ds['rows'])==0:
  32. row={}
  33. row['ParticipantId']=patientId
  34. try:
  35. row['birthDate']=dicom['PatientBirthDate']
  36. row['PatientName']=dicom['PatientName']
  37. except KeyError:
  38. pass
  39. row['OrthancId']=p
  40. db.modifyRows('insert',project,'study','Demographics',[row])
  41. for s in pdata['Studies']:
  42. sdata=odb.getStudyData(s)
  43. sdicom=sdata['MainDicomTags']
  44. sdate='19700101'
  45. try:
  46. sid=sdicom['StudyInstanceUID']
  47. sdate=sdicom['StudyDate']
  48. print('Study: {}/{}'.format(s,sid))
  49. except KeyError:
  50. pass
  51. #print('Data: {}'.format(sdata))
  52. #continue
  53. for se in sdata['Series']:
  54. qfilter={'variable':'orthancSeries','value':se,'oper':'eq'}
  55. ds=db.selectRows(project,'study','Imaging',[qfilter])
  56. if len(ds['rows'])>0:
  57. continue
  58. #count existing entries for patient
  59. qfilter={'variable':'ParticipantId','value':queryPatientId,'oper':'eq'}
  60. ds=db.selectRows(project,'study','Imaging',[qfilter])
  61. seqNum=len(ds['rows'])
  62. sedata=odb.getSeriesData(se)
  63. sedicom=sedata['MainDicomTags']
  64. seid=sedicom['SeriesInstanceUID']
  65. print('Series: {}/{}'.format(se,seid))
  66. #print('Data: {}'.format(sedata))
  67. seDesc="NONE"
  68. try:
  69. seDesc=sedicom['SeriesDescription']
  70. except KeyError:
  71. pass
  72. #remove strange characters
  73. spanishOAcute=''.join([chr(3619),chr(3603)])
  74. spanishAAcute=''.join([chr(3619),chr(3585)])
  75. seDesc=re.sub(spanishOAcute,'o',seDesc)
  76. seDesc=re.sub(spanishAAcute,'a',seDesc)
  77. #print("seDesc")
  78. #fc=[ord(c) for c in seDesc]
  79. #for f in fc:
  80. # print("{}".format(f))
  81. #
  82. print('ID: {}.'.format(seDesc))
  83. row={}
  84. row['ParticipantId']=patientId
  85. row['sequenceNum']=seqNum
  86. row['dicomStudy']=sid
  87. row['orthancStudy']=s
  88. row['dicomSeries']=seid
  89. row['orthancSeries']=se
  90. row['studyDate']=sdate
  91. row['seriesDescription']=seDesc
  92. db.modifyRows('insert',project,'study','Imaging',[row])
  93. print("Done")