Browse Source

Adapting pixel analysis to nrrd segmentation files

Andrej 1 year ago
parent
commit
9fb3643710
2 changed files with 50 additions and 18 deletions
  1. 3 1
      pythonScripts/analysis.py
  2. 47 17
      pythonScripts/segmentation.py

+ 3 - 1
pythonScripts/analysis.py

@@ -141,12 +141,14 @@ def doPixelAnalysisRow(r,setup, mode='IVF'):
    for s2 in sigma2:
       f=config.getPixelFitParFinalName(code,nc,s2,mode)
       fName=getData.getLocalPath(r,setup,f)
+      sFile=segmentation.getSegmentationFileName(r,setup)
+      segmFile=getData.getLocalPath(r,setup,sFile)
       if os.path.isfile(fName):
          print('Skipping; {} available.'.format(fName))
          continue
 
       runCmds=[x for x in cmds]
-      runCmds.append('-r "path=\'{}\'; patientID=\'{}\'; sigma2=\'{}\'; {}"'.format(tempDir,code,s2,mScript))
+      runCmds.append('-r "path=\'{}\'; patientID=\'{}\'; sigma2=\'{}\' segmFile=\'{}\'; {}"'.format(tempDir,code,s2,segmFile,mScript))
 
       
       subprocess.run(runCmds,check=True, stdout=subprocess.PIPE)

+ 47 - 17
pythonScripts/segmentation.py

@@ -135,26 +135,52 @@ def updateSegmentation(db,setup,r,pixels):
    print('Done')
     
 def getSegmentationFileName(r,setup):
-   fileName='{}_Segmentation.txt'.format(config.getCode(r,setup))
-   return fileName
+   if setup['segmentationMode']=='TXT':
+      return '{}_Segmentation.txt'.format(config.getCode(r,setup))
+   if setup['segmentationMode']=='NRRD':
+      copyFields=['PatientId','visitName']
+      qFilter=[{'variable':x,'value':r[x],'oper':'eq'} for x in copyFields]
+      qFilter.append({'variable':'User','value':setup['targetUser'],'oper':'eq'})
+      rows=getData.getSegmentation(db,setup,qFilter)
+      r=rows[0]
+      return r['latestFile']
+ 
 
 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'])
+
+   if setup['segmentationMode']=='NRRD':
+      print('Failed to load segmentation')
+      return
+   
+   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(r,setup,fileName),v)
-    getData.copyToServer(fb,r,setup,[fileName])
+      numpy.savetxt(getData.getLocalPath(r,setup,fileName),v)
+      getData.copyToServer(fb,r,setup,[fileName])
 
 def getNC(r,xsetup):
+   if xsetup['segmentationMode']=='TXT':
+      getNCTxt(r,xsetup)
+   if xsetup['segmentationMode']=='NRRD':
+      return 500
+
+def loadSegmentation(db,fb,r,xsetup):
+   if xsetup['segmentationMode']=='TXT':
+      return loadSegmentationTxt(db,fb,r,xsetup)
+   if xsetup['segmentationMode']=='NRRD':
+      return loadSegmentationNrrd(db,fb,r,xsetup)
+   
+
+def getNCTxt(r,xsetup):
    sName=getSegmentationFileName(r,xsetup)
    fName=getData.getLocalPath(r,xsetup,sName)
    x=numpy.loadtxt(fName)
@@ -165,14 +191,18 @@ def loadSegmentation(db,fb,r,setup):
    sName=getSegmentationFileName(r,setup)
    fName=getData.getLocalPath(r,setup,sName)
    if not os.path.isfile(fName):
-      fURL=getData.getURL(fb,r,setup,fName)
+      qName=sName
+      if setup['segmentationMode']=='NRRD':
+         qName='/'.join(['Segmentations',sName])
+      fURL=getData.getURL(fb,r,setup,qName)
       if fb.entryExists(fURL):
-         copyFromServer(fb,r,setup,sName)
+         getData.copyFromServer(fb,r,setup,[qName])
       else:
          #this creates local and global file
          writeSegmentation(db,fb,r,setup)
-   return numpy.loadtxt(fName)
 
+   if setup['segmentationMode']=='TXT':
+      return numpy.loadtxt(fName)
 
    
 def plotSegmentation(db,fb,r,setup,vmax=1000):