123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import os
- import json
- import re
- import subprocess
- import nibabel
- import shutil
- import sys
- fhome=os.path.expanduser('~')
- with open(os.path.join(fhome,".labkey","setup.json")) as f:
- setup=json.load(f)
- sys.path.insert(0,setup["paths"]["labkeyInterface"])
- import labkeyInterface
- import labkeyDatabaseBrowser
- import labkeyFileBrowser
- fconfig=os.path.join(fhome,'.labkey','network.json')
- net=labkeyInterface.labkeyInterface()
- net.init(fconfig)
- db=labkeyDatabaseBrowser.labkeyDB(net)
- fb=labkeyFileBrowser.labkeyFileBrowser(net)
- project='iPNUMMretro/Study'
- dataset='Imaging'
- tempBase=os.path.join(fhome,'temp')
- #all images from database
- ds=db.selectRows(project,'study',dataset,[])
- #imageSelector={"CT":"CT","PET":"PETWB"};
- imageResampledField={"Segm":"Segmentation"}
- #projectNIfTIBase=os.path.join(labkeyBase,'files',project,'@files/nifti')
- #use webdav to transfer file (even though it is localhost)
- def getPatientLabel(row):
- return row['PatientId'].replace('/','_')
- def getVisitLabel(row):
- return 'VISIT_'+str(int(row['SequenceNum']))
- def getStudyLabel(row):
- return getPatientLabel(row)+'-'+getVisitLabel(row)
- def updateRow(project,dataset,row,imageResampledField,gzFileNames):
- for im in imageResampledField:
- row[imageResampledField[im]]=gzFileNames[im]
- db.modifyRows('update',project,'study',dataset,[row])
-
- i=0
- for row in ds["rows"]:
- #interesting files are processedDir/studyName_CT_notCropped_2mmVoxel.nii
- #asn processedDir/studyName_PET_notCropped_2mmVoxel.nii
- gzFileNames={im:\
- getStudyLabel(row)+'_'+im+'.nii.gz'\
- for im in imageResampledField}
-
- #build/check remote directory structure
- remoteDir=fb.buildPathURL(project,\
- ['preprocessedImages',getPatientLabel(row),getVisitLabel(row)])
- gzRemoteFiles={im:remoteDir+'/'+f\
- for (im,f) in gzFileNames.items()}
- remoteFilePresent=[fb.entryExists(f)\
- for f in gzRemoteFiles.values()]
- for f in gzRemoteFiles.values():
- print("[{}]: [{}]".format(f,fb.entryExists(f)))
- if all(remoteFilePresent):
- print("Entry for row done.")
- updateRow(project,dataset,row,imageResampledField,\
- gzFileNames)
- continue
- inputDir=fb.buildPathURL(project,['segmentations'])
- inputFiles={im:inputDir+'/'+f for (im,f) in gzFileNames.items()}
-
- for im in inputFiles:
- f=inputFiles[im]
- if not fb.entryExists(f):
- print("Input file {} not found".format(f))
- continue
- print("Found {}".format(f))
- localFile=os.path.join(tempBase,gzFileNames[im])
- print("Local {}".format(localFile))
- fb.readFileToFile(f,localFile)
- fb.writeFileToFile(localFile,gzRemoteFiles[im])
- print("Remote {}".format(gzRemoteFiles[im]))
- os.remove(localFile)
- #update row and let it know where the processed files are
- updateRow(project,dataset,row,imageResampledField,gzFileNames)
-
- if i==-1:
- break
- i=i+1
- print("Done")
|