addSegmentations.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import os
  2. import json
  3. import re
  4. import subprocess
  5. import nibabel
  6. import shutil
  7. import sys
  8. fhome=os.path.expanduser('~')
  9. with open(os.path.join(fhome,".labkey","setup.json")) as f:
  10. setup=json.load(f)
  11. sys.path.insert(0,setup["paths"]["labkeyInterface"])
  12. import labkeyInterface
  13. import labkeyDatabaseBrowser
  14. import labkeyFileBrowser
  15. fconfig=os.path.join(fhome,'.labkey','network.json')
  16. net=labkeyInterface.labkeyInterface()
  17. net.init(fconfig)
  18. db=labkeyDatabaseBrowser.labkeyDB(net)
  19. fb=labkeyFileBrowser.labkeyFileBrowser(net)
  20. project='iPNUMMretro/Study'
  21. dataset='Imaging'
  22. tempBase=os.path.join(fhome,'temp')
  23. #all images from database
  24. ds=db.selectRows(project,'study',dataset,[])
  25. #imageSelector={"CT":"CT","PET":"PETWB"};
  26. imageResampledField={"Segm":"Segmentation"}
  27. #projectNIfTIBase=os.path.join(labkeyBase,'files',project,'@files/nifti')
  28. #use webdav to transfer file (even though it is localhost)
  29. def getPatientLabel(row):
  30. return row['PatientId'].replace('/','_')
  31. def getVisitLabel(row):
  32. return 'VISIT_'+str(int(row['SequenceNum']))
  33. def getStudyLabel(row):
  34. return getPatientLabel(row)+'-'+getVisitLabel(row)
  35. def updateRow(project,dataset,row,imageResampledField,gzFileNames):
  36. for im in imageResampledField:
  37. row[imageResampledField[im]]=gzFileNames[im]
  38. db.modifyRows('update',project,'study',dataset,[row])
  39. i=0
  40. for row in ds["rows"]:
  41. #interesting files are processedDir/studyName_CT_notCropped_2mmVoxel.nii
  42. #asn processedDir/studyName_PET_notCropped_2mmVoxel.nii
  43. gzFileNames={im:\
  44. getStudyLabel(row)+'_'+im+'.nii.gz'\
  45. for im in imageResampledField}
  46. #build/check remote directory structure
  47. remoteDir=fb.buildPathURL(project,\
  48. ['preprocessedImages',getPatientLabel(row),getVisitLabel(row)])
  49. gzRemoteFiles={im:remoteDir+'/'+f\
  50. for (im,f) in gzFileNames.items()}
  51. remoteFilePresent=[fb.entryExists(f)\
  52. for f in gzRemoteFiles.values()]
  53. for f in gzRemoteFiles.values():
  54. print("[{}]: [{}]".format(f,fb.entryExists(f)))
  55. if all(remoteFilePresent):
  56. print("Entry for row done.")
  57. updateRow(project,dataset,row,imageResampledField,\
  58. gzFileNames)
  59. continue
  60. inputDir=fb.buildPathURL(project,['segmentations'])
  61. inputFiles={im:inputDir+'/'+f for (im,f) in gzFileNames.items()}
  62. for im in inputFiles:
  63. f=inputFiles[im]
  64. if not fb.entryExists(f):
  65. print("Input file {} not found".format(f))
  66. continue
  67. print("Found {}".format(f))
  68. localFile=os.path.join(tempBase,gzFileNames[im])
  69. print("Local {}".format(localFile))
  70. fb.readFileToFile(f,localFile)
  71. fb.writeFileToFile(localFile,gzRemoteFiles[im])
  72. print("Remote {}".format(gzRemoteFiles[im]))
  73. os.remove(localFile)
  74. #update row and let it know where the processed files are
  75. updateRow(project,dataset,row,imageResampledField,gzFileNames)
  76. if i==-1:
  77. break
  78. i=i+1
  79. print("Done")