123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- import numpy
- import config
- import SimpleITK
- import os
- import getData
- import matplotlib.pyplot
- def guessPixelPosition15(sx=-1,sy=-1,sz=-1):
- #guess position of segments
- if sx<0:
- sx=12
- if sy<0:
- sy=28
- if sz<0:
- sz=32
- rz=4
- oz=0
- slc=[sx,sy,sz]
- p1=[sx,sy,sz]
- pts={
- '0':[sx-5,sy,sz],\
- '1':[sx-2,sy,sz-rz],\
- '2':[sx-2,sy,sz+rz-1],\
- '3':[sx-1,sy-rz,sz],\
- '4':[sx-1,sy+rz-1,sz],\
- '5':[sx,sy-rz+oz,sz],\
- '6':[sx,sy-0.3*rz+oz,sz-rz],\
- '7':[sx,sy-0.3*rz+oz,sz+rz],\
- '8':[sx,sy,sz],\
- '9':[sx,sy+0.3*rz+oz,sz-rz],\
- '10':[sx,sy+0.3*rz+oz,sz+rz],\
- '11':[sx,sy+rz+oz,sz],\
- '12':[sx+3,sy-rz,sz],\
- '13':[sx+3,sy,sz-rz],\
- '14':[sx+3,sy,sz+rz],\
- '15':[sx+3,sy+rz,sz]}
- slices={'0':['8','0','1','13','2','14'],\
- '1':['8','0','3','4','12','15'],\
- '2':['8','11','9','6','5','7','10']}
-
- print(slices['0'])
- fp={x:[pts[q] for q in slices[x]] for x in slices}
-
- sliceIds={x:[] for x in pts}
- for p in pts:
- for s in slices:
- if p in slices[s]:
- sliceIds[p].append(s)
-
- sliceCode={x:';'.join(sliceIds[x]) for x in sliceIds}
- print(fp)
- print(sliceCode)
- return fp
- #tip
- fp={'0':[\
- [sx,sy,sz],
- [sx-5,sy,sz],\
- [sx-2,sy,sz-rz],\
- [sx+3,sy,sz-rz],\
- [sx-2,sy,sz+rz-1],\
- [sx+3,sy,sz+rz]],\
- '1':[\
- [sx,sy,sz],
- [sx-5,sy,sz],\
- [sx-1,sy-rz,sz],\
- [sx-1,sy+rz-1,sz],\
- [sx+3,sy-rz,sz],\
- [sx+3,sy+rz,sz]],\
- '2':[\
- [sx,sy,sz],
- [sx,sy+rz+oz,sz],\
- [sx,sy+0.3*rz+oz,sz-rz],\
- [sx,sy-0.3*rz+oz,sz-rz],\
- [sx,sy-rz+oz,sz],\
- [sx,sy-0.3*rz+oz,sz+rz],\
- [sx,sy+0.3*rz+oz,sz+rz]]}
- return fp
- def guessPixelPosition4(sx=-1,sy=-1,sz=-1):
- #guess position of segments
- if sx<0:
- sx=32
- if sy<0:
- sy=31
- if sz<0:
- sz=31
- rz=4
- pts={
- '0':[sx,sy,sz],\
- '1':[sx,sy,sz-rz],\
- '2':[sx,sy,sz+rz],\
- '3':[sx,sy-rz,sz],\
- '4':[sx,sy+rz,sz]}
- slices={
- '0':['0','1','2'],\
- '1':['0','3','4'],\
- '2':['0','1','2','3','4']}
-
- print(slices['0'])
- fp={x:[pts[q] for q in slices[x]] for x in slices}
-
- sliceIds={x:[] for x in pts}
- for p in pts:
- for s in slices:
- if p in slices[s]:
- sliceIds[p].append(s)
-
- sliceCode={x:';'.join(sliceIds[x]) for x in sliceIds}
- print(fp)
- print(sliceCode)
- return [{'regionId':x,'x':pts[x][0],'y':pts[x][1],'z':pts[x][2],'sliceId':sliceCode[x]} for x in pts]
- def updateSegmentation(db,setup,r,pixels):
- copyFields=['PatientId','visitName']
- for x in pixels:
- for c in copyFields:
- x[c]=r[c]
- x['SequenceNum']=r['SequenceNum']+0.01*int(x['regionId'])
- filterVar=['PatientId','SequenceNum']
- qFilter=[{'variable':y,'value':'{}'.format(x[y]),'oper':'eq'} for y in filterVar]
- ds=db.selectRows(setup['project'],'study','Segmentation',qFilter)
- entry={}
- mode='insert'
- if len(ds['rows'])>0:
- entry=ds['rows'][0]
- mode='update'
- for q in x:
- entry[q]=x[q]
- db.modifyRows(mode,setup['project'],'study','Segmentation',[entry])
- print('Done')
-
- def getSegmentationFileName(r,setup):
- fileName='{}_Segmentation.txt'.format(config.getCode(r,setup))
- def writeSegmentation(db,fb,r,setup):
- fileName=getSegmentationFileName(r,setup)
- idFilter={'variable':'PatientId','value':config.getPatientId(r,setup),'oper':'eq'}
- visitFilter={'variable':'visitName','value':config.getVisitId(r,setup),'oper':'eq'}
- rows=getData.getSegmentation(db,setup,[idFilter,visitFilter])
- v=numpy.zeros((len(rows),3))
- for qr in rows:
- region=int(qr['regionId'])
- v[region,2]=float(qr['x'])
- v[region,1]=float(qr['y'])
- v[region,0]=float(qr['z'])
- #for i in range(len(rows)):
- # print(v[i,:])
- numpy.savetxt(getData.getLocalPath(fileName))
- getData.copyToServer(fb,r,setup,[fileName])
- def getNC(r,xsetup):
- sName=getSegmentationFileName(r,xsetup)
- fName=getData.getLocalPath(sName)
- x=numpy.loadtxt(fName)
- nc=x.shape[0]
- return nc
-
- def loadSegmentation(db,fb,r,setup):
- sName=getSegmentationFileName(r,setup)
- fName=getData.getLocalPath(sName)
- if not os.path.isfile(fName):
- fURL=getData.getURL(fName)
- if fb.entryExists(fURL):
- copyFromServer(fb,r,setup,sName)
- else:
- #this creates local and global file
- writeSegmentation(db,fb,r,setup)
- return numpy.loadtxt(fName)
-
- def plotSegmentation(db,fb,r,setup,vmax=1000):
- copyFields=['PatientId','visitName']
- qFilter=[{'variable':x,'value':r[x],'oper':'eq'} for x in copyFields]
- nim=getData.getPatientNIM(fb,r,setup)
- rows=getData.getSegmentation(db,setup,qFilter)
- if len(rows)==0:
- print('Not found for id={}/{}'.format(pId,visitName))
- return
-
- fp={}
-
- for q in rows:
- if q['regionId']==0:
- slc=[q['x'],q['y'],q['z']]
- slc=[int(x) for x in slc]
- slices=q['sliceId'].split(';')
- for s in slices:
- try:
- fp[s].append([float(x) for x in [q['x'],q['y'],q['z']]])
- except KeyError:
- fp[s]=[]
- fp[s].append([float(x) for x in [q['x'],q['y'],q['z']]])
- cut0=20
- w0=20
- cut1=20
- w1=20
- cut2=20
- w2=20
- vmin=0
- nd=3
- fig,ax=matplotlib.pyplot.subplots(3,2*nd+1,figsize=(20,12))
- for i in numpy.arange(0,2*nd+1):
- ax[0,i].set_xlabel('z')
- ax[0,i].set_ylabel('x')
- ax[0,i].imshow(nim[cut2:cut2+w2,slc[1]-nd+i,cut0:cut0+w0],cmap='gray_r',vmax=vmax,vmin=vmin)
- ax[1,i].set_xlabel('x')
- ax[1,i].set_ylabel('y')
- ax[1,i].imshow(nim[cut2:cut2+w2,cut0:cut0+w0,slc[2]-nd+i].T,cmap='gray_r',vmax=vmax,vmin=vmin)
- ax[2,i].set_xlabel('z')
- ax[2,i].set_ylabel('y')
- ax[2,i].imshow(nim[slc[0]-nd+i,cut1:cut1+w1,cut1:cut1+w1],cmap='gray_r',vmax=vmax,vmin=vmin)
- if i==nd:
- pt=fp['0']
- ax[0,i].scatter([x[2]-cut0 for x in pt],[x[0]-cut2 for x in pt])
- pt=fp['1']
- ax[1,i].scatter([x[0]-cut2 for x in pt],[x[1]-cut0 for x in pt])
- pt=fp['2']
- ax[2,i].scatter([x[2]-cut1 for x in pt],[x[1]-cut1 for x in pt])
- if i==0:
- ax[0,i].text(2,2,pId,fontsize='large')
- name='{}_segmentation.png'.format(config.getCode(r,setup))
- fPath=getData.getLocalPath(r,setup,name)
- fig.savefig(fPath)
- getData.copyToServer(fb,r,setup,[name])
|