123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- import os
- import json
- import re
- import subprocess
- import nibabel
- import shutil
- import sys
- if len(sys.argv)<2:
- print("Usage {} sourceDir version(v1 or similar)".format(sys.argv[0]))
- sys.exit(0)
- sourceDir=sys.argv[1]
- ver=sys.argv[2]
- shome=os.path.expanduser('~nixUser')
- 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"}
- participantField='PatientId'
- #for prosepective
- #participantField='ParticipantId'
- #projectNIfTIBase=os.path.join(labkeyBase,'files',project,'@files/nifti')
- #use webdav to transfer file (even though it is localhost)
- def getPatientLabel(row,participantField='PatientId'):
- return row[participantField].replace('/','_')
- def getVisitLabel(row):
- return 'VISIT_'+str(int(row['SequenceNum']))
- def getStudyLabel(row,participantField='PatientId'):
- return getPatientLabel(row,participantField)+'-'+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
- #standard names provided by Zan and Daniel
- baseFileNames={im:\
- getStudyLabel(row,participantField)+'_'+im \
- for im in imageResampledField}
-
- #append suffix to base name for source files
- gzSrcFileNames={im:baseFileNames[im]+'.nii.gz'\
- for im in baseFileNames}
- #add version to out files
- gzOutFileNames={im:baseFileNames[im]+'_'+ver+'.nii.gz'\
- for im in baseFileNames}
- #build/check remote directory structure
- remoteDir=fb.buildPathURL(project,\
- ['preprocessedImages',getPatientLabel(row,participantField),\
- getVisitLabel(row)])
- #target files
- gzRemoteFiles={im:remoteDir+'/'+f\
- for (im,f) in gzOutFileNames.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,\
- gzOutFileNames)
- continue
- inputDir=fb.buildPathURL(project,[sourceDir])
- inputFiles={im:inputDir+'/'+f for (im,f) in gzSrcFileNames.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,gzSrcFileNames[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,gzOutFileNames)
-
- if i==-1:
- break
- i=i+1
- print("Done")
|