segmentation.ipynb 62 KB

import sys
import os
import SimpleITK
import numpy
import matplotlib.pyplot
import subprocess
import json
import config
import getData

sys.path.append(os.path.join(os.path.expanduser('~'),'software','src','nixSuite','wrapper'))
import nixWrapper
nixWrapper.loadLibrary('labkeyInterface')
import labkeyInterface
import labkeyFileBrowser
import labkeyDatabaseBrowser

#manipulate segmentations
#rewrite this
#nim=getPatientNIM(pId)

def guessPixelPosition(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]

    #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 getPatientNIM(r,setup):
    locDir=config.getLocalDir(r,setup)
    fileName=config.getNodeName(r,setup,'NM',19)+'.nrrd'
    f=os.path.join(locDir,fileName)
    im=SimpleITK.ReadImage(f)
    nim=SimpleITK.GetArrayFromImage(im)
    return nim

def writeSegmentation(db,r,setup):
    locDir=config.getLocalDir(r,setup)
    fileName='{}_Segmentation.txt'.format(config.getCode(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(os.path.join(locDir,fileName),v)
    
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']}, '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': []}}
#

fsetup='../template/cardiacSPECT.json'
with open(fsetup,'r') as f:
    setup=json.load(f)
    
net=labkeyInterface.labkeyInterface()
fconfig=os.path.join(os.path.expanduser('~'),'.labkey',setup['network'])
net.init(fconfig)
#net.getCSRF()
db=labkeyDatabaseBrowser.labkeyDB(net)
fb=labkeyFileBrowser.labkeyFileBrowser(net)
#rewrite this
#nim=getPatientNIM(pId)
pId='po1982022'
cx={}
cx[pId]=[32,31,31]
pId='pred15052022'
cx[pId]=[30,32,31]
#order
#[green,blue,red]

fp={'0':[],'1':[],'2':[]}

visitId='MIR'
idFilter={'variable':'PatientId','value':pId,'oper':'eq'}
visitFilter={'variable':'visitName','value':visitId,'oper':'eq'}

rows=getData.getPatients(db,setup,[idFilter,visitFilter])
for r in rows:
    print(r)

r=rows[0]
nim=getPatientNIM(r,setup)
#i labels segments
#ns=16
#for i in numpy.arange(ns):
#    sNum=r['SequenceNum']+0.0100*i
#seqFilter={'variable':'SequenceNum','value':'{:.2f}'.format(sNum),'oper':'eq'}
rows=getData.getSegmentation(db,setup,[idFilter,visitFilter])
    
if len(rows)==0:
    print('Not found for s={}'.format(sNum))
    fp=guessPixelPosition(*cx[pId])
else:
    for q in rows:
        print(q)
        slices=q['sliceId'].split(';')
        for s in slices:
            fp[s].append([float(x) for x in [q['x'],q['y'],q['z']]])
        #first point is (sx,sy,sz)

oz=0
rz=4
#update last 6 points 
sx=fp['0'][0][0]
sy=fp['0'][0][1]
sz=fp['0'][0][2]
slc=[int(x) for x in fp['0'][0]]
print('Center ({})'.format(slc))

cut0=20
w0=20
cut1=20
w1=20
cut2=20
w2=20
vmax=1000
vmin=0
fig,ax=matplotlib.pyplot.subplots(3,9,figsize=(20,12))
for i in numpy.arange(0,9):
    ax[0,i].imshow(nim[cut2:cut2+w2,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=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')
          
        
{'lsid': 'urn:lsid:ijs.si:Study.Data-113:5006.pred15052022.1.0000', 'visitName': 'MIR', '_labkeyurl_nmMasterOrthancId': 'https://orthanc.fmf.uni-lj.si/series/45dd38f1-b8fa7828-ed8032e8-e57f47c5-ce2cf639/archive', '_labkeyurl_PatientId': '/labkey/dinamic_spect/Patients/study-participant.view?participantId=pred15052022', 'PatientId': 'pred15052022', 'ctOrthancId': '82d2d679-137725b2-b6e1de3e-7733029d-ca0e0f23', 'nmCorrDataOrthancId': 'c54ac097-d2288737-89b2a716-6a8e8859-f40a2fc0', '_labkeyurl_nmCorrDataOrthancId': 'https://orthanc.fmf.uni-lj.si/series/c54ac097-d2288737-89b2a716-6a8e8859-f40a2fc0/archive', '_labkeyurl_ctOrthancId': 'https://orthanc.fmf.uni-lj.si/series/82d2d679-137725b2-b6e1de3e-7733029d-ca0e0f23/archive', 'nmMasterOrthancId': '45dd38f1-b8fa7828-ed8032e8-e57f47c5-ce2cf639', 'SequenceNum': 1.0}
{'lsid': 'urn:lsid:ijs.si:Study.Data-113:5004.pred15052022.2.0000', 'visitName': 'MIR', 'sliceId': '0;1;2', '_labkeyurl_PatientId': '/labkey/dinamic_spect/Patients/study-participant.view?participantId=pred15052022', 'regionId': 0, 'aliasID': None, 'PatientId': 'pred15052022', 'x': '30', 'y': '32', 'z': '31', 'SequenceNum': 2.0}
{'lsid': 'urn:lsid:ijs.si:Study.Data-113:5004.pred15052022.2.0100', 'visitName': 'MIR', 'sliceId': '0;2', '_labkeyurl_PatientId': '/labkey/dinamic_spect/Patients/study-participant.view?participantId=pred15052022', 'regionId': 1, 'aliasID': None, 'PatientId': 'pred15052022', 'x': '27', 'y': '32', 'z': '27', 'SequenceNum': 2.01}
{'lsid': 'urn:lsid:ijs.si:Study.Data-113:5004.pred15052022.2.0200', 'visitName': 'MIR', 'sliceId': '0;2', '_labkeyurl_PatientId': '/labkey/dinamic_spect/Patients/study-participant.view?participantId=pred15052022', 'regionId': 2, 'aliasID': None, 'PatientId': 'pred15052022', 'x': '27', 'y': '32', 'z': '35', 'SequenceNum': 2.02}
{'lsid': 'urn:lsid:ijs.si:Study.Data-113:5004.pred15052022.2.0300', 'visitName': 'MIR', 'sliceId': '1;2', '_labkeyurl_PatientId': '/labkey/dinamic_spect/Patients/study-participant.view?participantId=pred15052022', 'regionId': 3, 'aliasID': None, 'PatientId': 'pred15052022', 'x': '30', 'y': '29', 'z': '31', 'SequenceNum': 2.03}
{'lsid': 'urn:lsid:ijs.si:Study.Data-113:5004.pred15052022.2.0400', 'visitName': 'MIR', 'sliceId': '1;2', '_labkeyurl_PatientId': '/labkey/dinamic_spect/Patients/study-participant.view?participantId=pred15052022', 'regionId': 4, 'aliasID': None, 'PatientId': 'pred15052022', 'x': '30', 'y': '35', 'z': '31', 'SequenceNum': 2.04}
Center ([30, 32, 31])
rows=getData.getPatients(db,setup)
for r in rows:
    print('******{}******'.format(config.getCode(r,setup)))
    writeSegmentation(db,r,setup)
******10KF_MIR******
[33. 33. 15.]
[33. 33. 11.]
[29. 33. 13.]
[37. 33. 14.]
[29. 33. 17.]
[38. 33. 19.]
[33. 29. 14.]
[33. 38. 14.]
[33. 28. 19.]
[33. 39. 19.]
[33. 37. 15.]
[29.  34.2 15. ]
[29.  31.8 15. ]
[33. 29. 15.]
[37.  31.8 15. ]
[37.  34.2 15. ]
******10KF_OBR******
[32. 27. 13.]
[32. 27.  8.]
[28. 27. 10.]
[37. 27. 11.]
[28. 27. 14.]
[37. 27. 16.]
[32. 23. 11.]
[32. 32. 11.]
[32. 22. 16.]
[32. 33. 16.]
[32. 31. 13.]
[28.  28.2 13. ]
[28.  25.8 13. ]
[32. 23. 13.]
[36.  25.8 13. ]
[36.  28.2 13. ]
******po1982022_MIR******
[31. 31. 32.]
[27.5 31.  32. ]
[35. 31. 32.]
[31.  27.5 32. ]
[31. 35. 32.]
******pred15052022_MIR******
[31. 32. 30.]
[27. 32. 27.]
[35. 32. 27.]
[31. 29. 30.]
[31. 35. 30.]