123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- import os
- import sys
- import config
- import analysis
- import json
- import SimpleITK
- def connectDB(server):
- sPath=os.path.join(os.path.expanduser('~'),'.labkey','setup.json')
- with open(sPath,'r') as f:
- setup=json.load(f)
- sys.path.append(setup['paths']['nixWrapper'])
- import nixWrapper
- nixWrapper.loadLibrary('labkeyInterface')
- import labkeyInterface
- net=labkeyInterface.labkeyInterface()
- fconfig=os.path.join(os.path.expanduser('~'),'.labkey',server)
- net.init(fconfig)
- net.getCSRF()
- import labkeyDatabaseBrowser
- import labkeyFileBrowser
- return labkeyDatabaseBrowser.labkeyDB(net),labkeyFileBrowser.labkeyFileBrowser(net)
- def getDataset(db,setup,datasetName,qfilter=[]):
- ds=db.selectRows(setup['project'],setup['schemaName'],\
- setup[datasetName],qfilter)
- try:
- rows=ds['rows']
- except KeyError:
- rows=[]
- return rows
- def updateDataset(db,setup,datasetName,mode,rows):
- db.modifyRows(mode,setup['project'],setup['schemaName'],\
- setup[datasetName],rows)
-
- def getPatients(db,setup,qfilter=[]):
- return getDataset(db,setup,'queryName',qfilter)
- def getSegmentation(db,setup,qfilter=[]):
- return getDataset(db,setup,'segmentationQueryName',qfilter)
- def getSummary(db,setup,qfilter=[]):
- return getDataset(db,setup,'summaryQueryName',qfilter)
- def updatePatients(db,setup,mode,rows):
- updateDataset(db,setup,'queryName',mode,rows)
- def updateSegmentation(db,setup,mode,rows):
- updateDataset(db,setup,'segmentationQueryName',mode,rows)
- def updateSummary(db,setup,mode,rows):
- updateDataset(db,setup,'summaryQueryName',mode,rows)
- def downloadNode(fb,fileName,rPath,lPath):
- rPath1=rPath+'/'+fileName
- available=fb.entryExists(rPath1)
- if not available:
- print('Missing {}'.format(fileName))
- return
- lPath1=os.path.join(lPath,fileName)
- if os.path.isfile(lPath1):
- return
- print('Loading {}'.format(fileName))
- fb.readFileToFile(rPath1,lPath1)
- def downloadFiles(fb,r,setup):
-
- #CT
- fileName=config.getNodeName(r,setup,'CT')+'.nrrd'
- copyFromServer(fb,r,setup,[fileName])
-
- for i in range(20):
- fileName=config.getNodeName(r,setup,'NM',i)+'.nrrd'
- copyFromServer(fb,r,setup,[fileName])
-
- fileName=config.getNodeName(r,setup,'Dummy')+'.mcsv'
- copyFromServer(fb,r,setup,[fileName])
-
- def downloadPatientFiles(db,fb,setup,qfilter=[]):
- rows=getPatients(db,setup,qfilter)
- for r in rows:
- #download
- downloadFiles(fb,r,setup)
- def uploadCenters(fb,r,setup):
- names=config.printRowCenterNames(r,setup)
- copyToServer(fb,r,setup,names)
- def downloadCenters(fb,r,setup):
- names=config.printRowCenterNames(r,setup)
- copyFromServer(fb,r,setup,names)
- def uploadFitParFinal(fb,r,setup,mode):
- names=config.printFitParFinalRowNames(r,setup,mode)
- #copy files to server
- copyToServer(fb,r,setup,names)
- def downloadFitParFinal(fb,r,setup,mode):
- names=config.printFitParFinalRowNames(r,setup,mode)
- #copy files to server
- copyFromServer(fb,r,setup,names)
- def uploadPixelFitParFinal(fb,r,xsetup,m='IVF'):
- sigma2=xsetup['sigma2']
- #get nc
- nc=segmentation.getNC(r,xsetup)
-
- for s2 in sigma2:
- names=config.printPixelFitParFinalRowNames(r,xsetup,nc,s2,m)
- copyToServer(fb,r,setup,names)
- def copyToServer(fb,r,setup,names):
- remoteDir=fb.buildPathURL(setup['project'],config.getPathList(r,setup))
- for n in names:
- localPath=getLocalPath(r,setup,n)
- remotePath='{}/{}'.format(remoteDir,n)
- fb.writeFileToFile(localPath,remotePath)
- def copyFromServer(fb,r,setup,names):
- try:
- forceReload=setup['forceReload']
- except KeyError:
- forceReload=False
- getLocalDir(r,setup,createIfMissing=True)
- remoteDir=fb.buildPathURL(setup['project'],config.getPathList(r,setup))
- for n in names:
- localPath=getLocalPath(r,setup,n)
- if os.path.isfile(localPath) and not forceReload:
- continue
- remotePath='/'.join([remoteDir,n])
- fb.readFileToFile(remotePath,localPath)
- def getLocalDir(r,setup,createIfMissing=False):
- localDir=os.path.join(config.getTempDir(setup),config.getCode(r,setup))
- if createIfMissing:
- if not os.path.isdir(localDir):
- os.makedirs(localDir)
- return localDir
- def getLocalPath(r,setup,name):
- tempDir=config.getTempDir(setup)
- code=config.getCode(r,setup)
- fileName=name[name.rfind('/')+1:]
- return os.path.join(tempDir,code,fileName)
- def getURL(fb,r,setup,name):
- remoteDir=fb.buildPathURL(setup['project'],config.getPathList(r,setup))
- return '/'.join([remoteDir,name])
-
- def getPatientNIM(fb,r,setup):
- fileName=config.getNodeName(r,setup,'NM',19)+'.nrrd'
- f=getLocalPath(r,setup,fileName)
- if not os.path.isfile(f):
- #download from server
- copyFromServer(fb,r,setup,[fileName])
- im=SimpleITK.ReadImage(f)
- nim=SimpleITK.GetArrayFromImage(im)
- return nim
- def updateStatus(db,r,setup,var,status=True):
- #update status of var to status
- fVars=['PatientId','visitCode']
- qFilter=[{'variable':x,'value':'{}'.format(r[x]),'oper':'eq'} for x in fVars]
- ds=db.selectRows(setup['project'],'study','processingStatus',qFilter)
- try:
- rows=ds['rows']
- except KeyError:
- #no rows returned, possibly the dataset does not exist
- return
- mode='update'
- try:
- entry=rows[0]
- except IndexError:
- fVars.extend([config.getPatientField(setup), "SequenceNum"])
- entry={x:r[x] for x in fVars}
- mode='insert'
- entry[var]=status
- db.modifyRows(mode,setup['project'],'study','processingStatus',[entry])
-
|