anonymizeImages.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import os
  2. import json
  3. import re
  4. import subprocess
  5. import nibabel
  6. import shutil
  7. import sys
  8. shome=os.path.expanduser('~nixUser')
  9. sys.path.insert(1,shome+'/software/src/labkeyInterface')
  10. import labkeyInterface
  11. import labkeyDatabaseBrowser
  12. sys.path.insert(1,shome+'/software/src/orthancInterface')
  13. import orthancInterface
  14. import orthancFileBrowser
  15. sys.path.insert(1,shome+'/software/src/IPNUMM/dicomUtils')
  16. import loadDicom
  17. fhome=os.path.expanduser('~')
  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. ofb=orthancFileBrowser.orthancFileBrowser(onet)
  25. hi=0
  26. project='iPNUMMretro/Study'
  27. #project='Orthanc/Database'
  28. tempBase=os.path.join(fhome,'temp')
  29. #all images from database
  30. ds=db.selectRows(project,'study','Imaging',[])
  31. imageSelector=["CT","PETWB"];
  32. outputBase='/data/dicom/anonymous'
  33. labkeyBase='/data/labkey'
  34. #for links
  35. projectAnonymousBase=os.path.join(labkeyBase,'files',project,'@files/anonymous')
  36. #selected dicom fields
  37. dsFields=db.selectRows(project,'lists','dicomFields',[])
  38. try:
  39. fields=[r['dicomTagName'] for r in dsFields['rows']]
  40. except KeyError:
  41. fields=[r['dicomtagname'] for r in dsFields['rows']]
  42. i=0
  43. uid=loadDicom.uuid()
  44. for row in ds["rows"]:
  45. #link dicoms with a common studiyID
  46. studyUID=uid.generateStudyUUID('volume')
  47. for im in imageSelector:
  48. linkField=im+"2"
  49. print("Checking row[{}]={}".format(linkField,row[linkField]))
  50. if row[linkField]=="[DICOM]":
  51. print("Skipping {}".format(im))
  52. continue
  53. seriesId=row[im];
  54. if seriesId=="0":
  55. continue
  56. print("{}: {}".format(im,seriesId))
  57. fname=os.path.join(tempBase,seriesId+".zip");
  58. ofb.getZip('series',seriesId,fname)
  59. unzipDir=os.path.join(tempBase,seriesId)
  60. try:
  61. os.mkdir(unzipDir)
  62. except FileExistsError:
  63. shutil.rmtree(unzipDir)
  64. try:
  65. outTxt=subprocess.check_output(["unzip","-d",unzipDir,"-xj",fname])
  66. except subprocess.CalledProcessError:
  67. print("unzip failed for {}".format(fname))
  68. continue
  69. slices=loadDicom.load(unzipDir)
  70. anonymousDir=os.path.join(tempBase,seriesId+'-a')
  71. try:
  72. os.mkdir(anonymousDir)
  73. except FileExistsError:
  74. shutil.rmtree(anonymousDir)
  75. os.mkdir(anonymousDir)
  76. loadDicom.writeAnonymousSeries(slices,anonymousDir,studyUID,fields)
  77. anonymousZip=os.path.join(outputBase,seriesId+".zip")
  78. try:
  79. outTxt=subprocess.check_output(["zip","-rj",anonymousZip,anonymousDir])
  80. except subprocess.CalledProcessError:
  81. print("zip failed for {}, dir {}".format(anonymousZip,anonymousDir))
  82. shutil.rmtree(unzipDir)
  83. shutil.rmtree(anonymousDir)
  84. os.remove(fname)
  85. labkeyAnonymousZip=os.path.join(projectAnonymousBase,seriesId+'.zip')
  86. try:
  87. os.symlink(anonymousZip,labkeyAnonymousZip)
  88. except FileExistsError:
  89. pass
  90. row[linkField]="[DICOM]"
  91. db.modifyRows("update",project,"study","Imaging",[row])
  92. if i==0:
  93. break
  94. i=i+1
  95. print("Done")