import os
import sys
os.path.expanduser('~')
sys.path.append(os.path.join(os.path.expanduser('~'),'software','src','nixSuite','wrapper'))
import nixWrapper
nixWrapper.loadLibrary('labkeyInterface')
import labkeyInterface
import labkeyDatabaseBrowser
import labkeyFileBrowser
#local files
import downloadPatient
def connect(server,f):
net=labkeyInterface.labkeyInterface()
fconfig=os.path.join(os.path.expanduser('~'),'.labkey','{}.json'.format(server))
net.init(fconfig)
net.getCSRF()
return f(net)
def connectDB(server):
return connect(server,labkeyDatabaseBrowser.labkeyDB)
def connectFB(server):
return connect(server,labkeyFileBrowser.labkeyFileBrowser)
loadLibrary remoteSourcesURL https://git0.fmf.uni-lj.si/studen/nixSuite/raw/master/remoteResources/resources.json {'labkeyInterface': {'url': 'https://git0.fmf.uni-lj.si/studen/labkeyInterface/archive/master.zip', 'branch': 'master', 'modules': []}, 'irAEMM': {'url': 'https://git0.fmf.uni-lj.si/studen/iraemm/archive/master.zip', 'branch': 'master', 'modules': ['iraemmBrowser']}, 'SlicerLabkeyExtension': {'url': 'https://git0.fmf.uni-lj.si/studen/SlicerLabkeyExtension/archive/SlicerExtensionIndex.zip', 'branch': 'SlicerExtensionIndex', 'modules': ['labkeyBrowser']}, 'limfomiPET': {'url': 'https://git0.fmf.uni-lj.si/studen/limfomiPET/archive/master.zip', 'branch': 'master', 'modules': ['imageBrowser', 'segmentationBrowser']}, 'parseConfig': {'url': 'https://git0.fmf.uni-lj.si/studen/parseConfig/archive/master.zip', 'branch': 'master', 'modules': []}, 'orthancInterface': {'url': 'https://git0.fmf.uni-lj.si/studen/orthancInterface/archive/master.zip', 'branch': 'master', 'modules': []}} {'url': 'https://git0.fmf.uni-lj.si/studen/labkeyInterface/archive/master.zip', 'branch': 'master', 'modules': []} File /home/studen/temp/labkeyInterface.zip: True
fb=connectFB('merlin')
db=connectDB('merlin')
project='dinamic_spect/Patients'
ds=db.selectRows(project,'study','Imaging',[])
patients=[row['aliasID'] for row in ds['rows']]
print(patients)
locDir=os.path.join(os.path.expanduser('~'),'temp','dynamicSPECT')
User: andrej studen CSRF: 46851818c35cf1d4b585917ae2c6f635 User: andrej studen CSRF: b7db61cfb531e7ccc9b334d169e7de4c ['10KFMIR', '10KFOBR', '11ZMMIR', '11ZMOBR', '2SBMIR', '2SMobr', '3ZFMIR', '3ZFOBR', '5MIMIR', '5MIOBR', '7TMMIR', '7TMOBR', '8JSMIR', '8JSOBR']
#download files
import labkeyDatabaseBrowser
db=labkeyDatabaseBrowser.labkeyDB(net)
ds=db.selectRows(project,'study','Imaging',[])
patients=[row['aliasID'] for row in ds['rows']]
patients1=['7TMOBR']
for p in patients1:
pass
#patientId='7TMMIR'
#files=downloadPatient.readPatient(fb,locDir,project,p)
import SimpleITK
import matplotlib.pyplot
import numpy
def getPatientNIM(id):
f=os.path.join(locDir,id,id+'Volume19.nrrd')
im=SimpleITK.ReadImage(f)
nim=SimpleITK.GetArrayFromImage(im)
return nim
patients1=[patients[4]]
for p in patients1:
if p.find('8')==0:
continue
f=os.path.join(locDir,p,p+'Volume19.nrrd')
im=SimpleITK.ReadImage(f)
nim=SimpleITK.GetArrayFromImage(im)
pz=list(numpy.sum(numpy.sum(nim,0),1))
pz1=[pz[i-1]+pz[i+1]-2*pz[i] for i in numpy.arange(1,len(pz)-1)]
imin=pz1.index(min(pz1))
imax=pz.index(max(pz))
imin-=9
print('{}: [{}]:{} {}'.format(p,imin,pz[imin],pz[imin]/pz[imax]))
matplotlib.pyplot.plot(pz)
matplotlib.pyplot.scatter(imin,pz[imin])
matplotlib.pyplot.show()
2SBMIR: [28]:160521.0 0.3870876729488373
matplotlib.pyplot.imshow(nim[:,31,:])
matplotlib.pyplot.show()
def getSegment(nim,tip,base,w1,w2):
ctr=base+1/3.*(tip-base)
kap=base+2/3.*(tip-base)
n=(tip-base)/numpy.sqrt(numpy.dot(tip-base,tip-base))
sphCtr=tip-w2*n;
print(n)
x,y,z=numpy.meshgrid(numpy.arange(nim.shape[0])+0.5,numpy.arange(nim.shape[1])+0.5,numpy.arange(nim.shape[2])+0.5,indexing='xy')
#because of xy ordering, columns 2 and 1 are swapped, but that seems to fit well with reshape
#location coded as (r)
fr=numpy.array([x,y,z])
fr1=fr.transpose()
fr2=fr1.reshape(nim.size,-1)
print(fr2.shape)
#require r to lie above the r*n plane
fw=numpy.dot(fr2,n)
fw=fw.reshape(x.shape)
print(fw.shape)
fwkap=numpy.dot(kap,n)
fwctr=numpy.dot(ctr,n)
fwbase=numpy.dot(base,n)
fcSph=numpy.array([sphCtr[0]*numpy.ones(x.shape),sphCtr[1]*numpy.ones(x.shape),sphCtr[2]*numpy.ones(x.shape)])
fcSph1=fcSph.transpose()
fcSph2=fcSph1.reshape((nim.size,-1))
vcSph=numpy.array([numpy.dot(v1-v2,v1-v2) for (v1,v2) in zip(fcSph2,fr2)])
vcSph2=vcSph.reshape(x.shape)
fc=numpy.array([ctr[0]*numpy.ones(x.shape),ctr[1]*numpy.ones(x.shape),ctr[2]*numpy.ones(x.shape)])
fc1=fc.transpose()
fc2=fc1.reshape((nim.size,-1))
vc=numpy.array([numpy.dot(v1-v2,v1-v2) for (v1,v2) in zip(fc2,fr2)])
print('vc shape {}'.format(vc.shape))
vc2=vc.reshape(x.shape)
vcrho2=numpy.array([numpy.dot(v1-v2,n)*numpy.dot(v1-v2,n) for (v1,v2) in zip(fc2,fr2)])
vcrho2Flat=vc-vcrho2
print(len(vcrho2Flat[vcrho2Flat<0]))
vcrho2=vcrho2.reshape(x.shape)
vcrho2=vc2-vcrho2
vcsqrt=numpy.sqrt(vcrho2Flat)
print(len(vcsqrt[vcsqrt==0]))
tgphi2=numpy.array([(v1[2]-v2[2]) for (v1,v2) in zip(fr2,fc2)])
tgphi2[vcsqrt>0]/=vcsqrt[vcsqrt>0]
tgphi2=tgphi2.reshape(x.shape)
tgphi1=numpy.array([(v1[1]-v2[1]) for (v1,v2) in zip(fr2,fc2)])
tgphi1[vcsqrt>0]/=vcsqrt[vcsqrt>0]
tgphi1=tgphi1.reshape(x.shape)
print('Shape (tgphi):{}'.format(tgphi1.shape))
cap=9*numpy.ones(x.shape)
cap[vcSph2<w1*w1]=0
cap[vcSph2>w2*w2]=0
cap[fw<fwkap]=0
bar1=numpy.ones(x.shape)
bar1[vcrho2>w2*w2]=0
bar1[vcrho2<w1*w1]=0
bar1[fw<fwctr]=0
bar1[fw>fwkap]=0
bar1[tgphi2>numpy.sqrt(2)/2]*=4
bar1[tgphi2<-numpy.sqrt(2)/2]*=2
bar1[tgphi1>numpy.sqrt(2)/2]*=3
bar1[tgphi1<-numpy.sqrt(2)/2]*=1
bar1[bar1>0]+=4
bar2=numpy.ones(x.shape)
bar2[vcrho2>w2*w2]=0
bar2[vcrho2<w1*w1]=0
bar2[fw>fwctr]=0
bar2[fw<fwbase]=0
bar2[tgphi2>numpy.sqrt(2)/2]*=4
bar2[tgphi2<-numpy.sqrt(2)/2]*=2
bar2[tgphi1>numpy.sqrt(2)/2]*=3
bar2[tgphi1<-numpy.sqrt(2)/2]*=1
segm=bar1\
+cap\
+bar2\
#transpose back to nim space (equivalent to ij indexing order)
vc2=numpy.transpose(vc2,axes=[1,0,2])
segm=numpy.transpose(segm,axes=[1,0,2])
return segm
pId='5MIMIR'
idFilter={'variable':'aliasID','value':pId,'oper':'eq'}
ds=db.selectRows(project,'study','Imaging',[idFilter])
rows=ds['rows']
outrows=[]
for r in rows:
p=r['aliasID']
if p.find('8')==0:
continue
f=os.path.join(locDir,p,p+'Volume19.nrrd')
im=SimpleITK.ReadImage(f)
nim=SimpleITK.GetArrayFromImage(im)
tip=numpy.array([float(r[x]) for x in ['tipX','tipY','tipZ']])
base=numpy.array([float(r[x]) for x in ['baseX','baseY','baseZ']])
segm=getSegment(nim,tip,base,float(r['w1']),float(r['w2']))
#adjust file name
outDir=os.path.join(locDir,p)
if not os.path.isdir(outDir):
os.makedirs(outDir)
segmImage=SimpleITK.GetImageFromArray(segm)
segmImage.SetOrigin(im.GetOrigin())
segmImage.SetDirection(im.GetDirection())
segmImage.SetSpacing(im.GetSpacing())
fname=p+'_Segm.nrrd'
SimpleITK.WriteImage(segmImage,os.path.join(locDir,p,fname))
r['segmentation']=fname
r['CT']=p+'CT.nrrd'
outrows.append(r)
remoteSegmentation=fb.buildPathURL(project,[p])
remoteSegmentation+='/'+fname
fb.writeFileToFile(os.path.join(locDir,p,fname),remoteSegmentation)
db.modifyRows('update',project,'study','Imaging',outrows)
[-1. 0. 0.] (114688, 3) (64, 28, 64) vc shape (114688,) 0 0 Shape (tgphi):(64, 28, 64) /usr/lib/python3/dist-packages/urllib3/connection.py:391: SubjectAltNameWarning: Certificate for merlin.fmf.uni-lj.si has no `subjectAltName`, falling back to check for a `commonName` for now. This feature is being removed by major browsers and deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 for details.) warnings.warn( User: andrej studen CSRF: 7cefbfa156cf7df98b848d539c3da76e User: andrej studen CSRF: 5d36f73137830665383bdf7cfd5f49b1
b'{\n "rowsAffected" : 1,\n "queryName" : "Imaging",\n "schemaName" : "study",\n "containerPath" : "/dinamic_spect/Patients",\n "rows" : [ {\n "date" : null,\n "dsrowid" : 112,\n "CreatedBy" : 1090,\n "sliceView" : "5MIMIR_sliceView.png",\n "tipY" : 32.0,\n "tipZ" : 32.5,\n "ctData" : "2",\n "QCState" : null,\n "tipX" : 6.0,\n "SequenceNum" : 1.0000,\n "Created" : "2019/07/11 12:02:39",\n "lsid" : "urn:lsid:ijs.si:Study.Data-113:5001.5MI.1.0000",\n "CT" : "5MIMIRCT.nrrd",\n "baseX" : 18.0,\n "aliasID" : "5MIMIR",\n "sourcelsid" : null,\n "nmCorrData" : "9",\n "PatientId" : "5MI",\n "segmentation" : "5MIMIR_Segm.nrrd",\n "baseY" : 32.0,\n "w1" : 2.0,\n "nmMaster" : "4",\n "w2" : 6.0,\n "baseZ" : 32.5\n } ],\n "command" : "update"\n}'
#test a segmentation
pId='5MIMIR'
nim=getPatientNIM(pId)
idFilter={'variable':'aliasID','value':pId,'oper':'eq'}
ds=db.selectRows(project,'study','Imaging',[idFilter])
r=[row for row in ds['rows'] if row['aliasID']==pId][0]
tip=numpy.array([float(r[x]) for x in ['tipX','tipY','tipZ']])
base=numpy.array([float(r[x]) for x in ['baseX','baseY','baseZ']])
segm=getSegment(nim,tip,base,float(r['w1']),float(r['w2']))
slc=32
matplotlib.pyplot.imshow(segm[:,slc,:])
matplotlib.pyplot.show()
matplotlib.pyplot.imshow(segm[:,slc,:])
matplotlib.pyplot.show()
matplotlib.pyplot.imshow(nim[:,slc,:])
matplotlib.pyplot.show()
matplotlib.pyplot.imshow(nim[:,slc,:])
matplotlib.pyplot.imshow(segm[:,slc,:],alpha=0.2)
matplotlib.pyplot.show()
/usr/lib/python3/dist-packages/urllib3/connection.py:391: SubjectAltNameWarning: Certificate for merlin.fmf.uni-lj.si has no `subjectAltName`, falling back to check for a `commonName` for now. This feature is being removed by major browsers and deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 for details.) warnings.warn(
[0;31m---------------------------------------------------------------------------[0m [0;31mNameError[0m Traceback (most recent call last) [0;32m<ipython-input-7-a3a104143944>[0m in [0;36m<module>[0;34m[0m [1;32m 7[0m [0mtip[0m[0;34m=[0m[0mnumpy[0m[0;34m.[0m[0marray[0m[0;34m([0m[0;34m[[0m[0mfloat[0m[0;34m([0m[0mr[0m[0;34m[[0m[0mx[0m[0;34m][0m[0;34m)[0m [0;32mfor[0m [0mx[0m [0;32min[0m [0;34m[[0m[0;34m'tipX'[0m[0;34m,[0m[0;34m'tipY'[0m[0;34m,[0m[0;34m'tipZ'[0m[0;34m][0m[0;34m][0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [1;32m 8[0m [0mbase[0m[0;34m=[0m[0mnumpy[0m[0;34m.[0m[0marray[0m[0;34m([0m[0;34m[[0m[0mfloat[0m[0;34m([0m[0mr[0m[0;34m[[0m[0mx[0m[0;34m][0m[0;34m)[0m [0;32mfor[0m [0mx[0m [0;32min[0m [0;34m[[0m[0;34m'baseX'[0m[0;34m,[0m[0;34m'baseY'[0m[0;34m,[0m[0;34m'baseZ'[0m[0;34m][0m[0;34m][0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0;32m----> 9[0;31m [0msegm[0m[0;34m=[0m[0mgetSegment[0m[0;34m([0m[0mnim[0m[0;34m,[0m[0mtip[0m[0;34m,[0m[0mbase[0m[0;34m,[0m[0mfloat[0m[0;34m([0m[0mr[0m[0;34m[[0m[0;34m'w1'[0m[0;34m][0m[0;34m)[0m[0;34m,[0m[0mfloat[0m[0;34m([0m[0mr[0m[0;34m[[0m[0;34m'w2'[0m[0;34m][0m[0;34m)[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 10[0m [0mslc[0m[0;34m=[0m[0;36m32[0m[0;34m[0m[0;34m[0m[0m [1;32m 11[0m [0mmatplotlib[0m[0;34m.[0m[0mpyplot[0m[0;34m.[0m[0mimshow[0m[0;34m([0m[0msegm[0m[0;34m[[0m[0;34m:[0m[0;34m,[0m[0mslc[0m[0;34m,[0m[0;34m:[0m[0;34m][0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0;31mNameError[0m: name 'getSegment' is not defined
#manipulate segmentations
pId='7TMOBR'
save=True
nim=getPatientNIM(pId)
idFilter={'variable':'aliasID','value':pId,'oper':'eq'}
ds=db.selectRows(project,'study','Imaging',[idFilter])
r=[row for row in ds['rows'] if row['aliasID']==pId][0]
tip=numpy.array([float(r[x]) for x in ['tipX','tipY','tipZ']])
base=numpy.array([float(r[x]) for x in ['baseX','baseY','baseZ']])
#segm=getSegment(nim,tip,base,float(r['w1']),float(r['w2']))
fp=[]
for i in numpy.arange(16):
sNum=r['SequenceNum']+0.0100*i
seqFilter={'variable':'SequenceNum','value':'{:.2f}'.format(sNum),'oper':'eq'}
ds=db.selectRows(project,'study','Segmentation',[idFilter,seqFilter])
if len(ds['rows'])==0:
print('Not found for s={}'.format(sNum))
sx=12
sy=28
sz=32
rz=4
oz=0
slc=[sx,sy,sz]
p1=[sx,sy,sz]
#tip
p2=[7,sy,32]
p3=[10,sy,sz-rz]
p5=[15,sy,sz-rz]
p4=[10,sy,sz+rz-1]
p6=[15,sy,sz+rz]
p7=[11,sy-rz,sz]
p8=[11,sy+rz-1,sz]
p9=[15,sy-rz,sz]
p10=[15,sy+rz,sz]
p11=[sx,sy+rz+oz,sz]
p12=[sx,sy+0.3*rz+oz,sz-rz]
p13=[sx,sy-0.3*rz+oz,sz-rz]
p14=[sx,sy-rz+oz,sz]
p15=[sx,sy-0.3*rz+oz,sz+rz]
p16=[sx,sy+0.3*rz+oz,sz+rz]
break
else:
frow=ds['rows'][0]
fp.append([float(x) for x in [frow['x'],frow['y'],frow['z']]])
fpp=fp[-1]
if i==0:
sx=int(fpp[0])
sy=int(fpp[1])
sz=int(fpp[2])
if len(fp)>0:
print(len(fp))
p1=fp[0]
p2=fp[1]
p3=fp[2]
p4=fp[3]
p5=fp[4]
p6=fp[5]
p7=fp[6]
p8=fp[7]
p9=fp[8]
p10=fp[9]
p11=fp[10]
p12=fp[11]
p13=fp[12]
p14=fp[13]
p15=fp[14]
p16=fp[15]
oz=0
#sy+=2
#sx+=1
#sz+=2
#rz=4
slc=[sx,sy,sz]
p1=[sx,sy,sz]
p11=[sx,sy+rz+oz,sz]
p12=[sx,sy+0.3*rz+oz,sz-rz]
p13=[sx,sy-0.3*rz+oz,sz-rz]
p14=[sx,sy-rz+oz,sz]
p15=[sx,sy-0.3*rz+oz,sz+rz]
p16=[sx,sy+0.3*rz+oz,sz+rz]
#p8[1]-=1
#p10[1]-=2
#p8[0]+=1
cut0=20
w0=20
cut1=20
w1=20
cut2=5
w2=20
vmax=1000
vmin=100
fig,ax=matplotlib.pyplot.subplots(3,9,figsize=(20,12))
for i in numpy.arange(0,9):
ax[0,i].imshow(nim[:,slc[1]-4+i,cut0:cut0+w0],cmap='gray_r',vmax=vmax,vmin=vmin)
ax[1,i].imshow(nim[cut2:cut2+w2,cut0:cut0+w0,slc[2]-4+i].T,cmap='gray_r',vmax=vmax,vmin=vmin)
ax[2,i].imshow(nim[slc[0]-4+i,cut1:cut1+w1,cut1:cut1+w1],cmap='gray_r',vmax=vmax,vmin=vmin)
if i==4:
pt=[p1,p2,p3,p4,p5,p6]
ax[0,i].scatter([x[2]-cut0 for x in pt],[x[0] for x in pt])
pt=[p1,p2,p7,p8,p9,p10]
ax[1,i].scatter([x[0]-cut2 for x in pt],[x[1]-cut0 for x in pt])
pt=[p1,p11,p12,p13,p14,p15,p16]
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')
if save:
of=os.path.join(locDir,pId,'{}_segments.png'.format(pId))
matplotlib.pyplot.savefig(of)
ds=db.selectRows(project,'study','Segmentation',[idFilter])
pts=[p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16]
for i in numpy.arange(len(pts)):
seqFilter={'variable':'SequenceNum','value':str(r['SequenceNum']+0.01*i),'oper':'eq'}
ds=db.selectRows(project,'study','Segmentation',[idFilter,seqFilter])
if len(ds['rows'])>0:
qrow=ds['rows'][0]
mode='update'
else:
qrow={}
qrow['PatientId']=r['PatientId']
qrow['SequenceNum']=0.01*i+r['SequenceNum']
qrow['aliasID']=pId
mode='insert'
qrow['regionId']=int(i)
qrow['x']=pts[i][0]
qrow['y']=pts[i][1]
qrow['z']=pts[i][2]
db.modifyRows(mode,project,'study','Segmentation',[qrow])
matplotlib.pyplot.show()
/usr/lib/python3/dist-packages/urllib3/connection.py:391: SubjectAltNameWarning: Certificate for merlin.fmf.uni-lj.si has no `subjectAltName`, falling back to check for a `commonName` for now. This feature is being removed by major browsers and deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 for details.) warnings.warn( 16 User: andrej studen CSRF: b2c5deaab50bbf312e803a4cb3ef654e User: andrej studen CSRF: 257a1acd17787f893ba19e2cf7e4dece User: andrej studen CSRF: cfa94419791e6d319f39db3b13dce0e8 User: andrej studen CSRF: 9d1d2f1e76553c26eebf4a9a7e899894 User: andrej studen CSRF: e7120ad92526021212ce0b35a7d8cc5d User: andrej studen CSRF: ba551108b45a9b4265a90ea84293ddb8 User: andrej studen CSRF: ad3ce0403b63f901b140bf6b0e0170bd User: andrej studen CSRF: 1aaa66797a94a9d2e367ecb246c380db User: andrej studen CSRF: 8f9253891755ab14c876b8410f359da7 User: andrej studen CSRF: 5507dd1a79c30bb4d0c658cffdac8b4a User: andrej studen CSRF: d9a4fa48be3393f3e6af67b74c0cfe1a User: andrej studen CSRF: 94c79b240b55d4d4241de6c63af139e5 User: andrej studen CSRF: 631565d37ef0465a614d56c1566fa652 User: andrej studen CSRF: 364c4c95011879d23cba730802820615 User: andrej studen CSRF: be4a3a5941458ae25a28213cb92cdf53 User: andrej studen CSRF: c564a5e90bb291a3f4559426b636eaa0
n=numpy.zeros((3,3))
n[1,1]=1
matplotlib.pyplot.imshow(n)
matplotlib.pyplot.scatter([1],[1])
<matplotlib.collections.PathCollection at 0x7f6198cabdf0>