Ver código fonte

Standardize CT display, PET colormap. Provide automatic conversion from labelmap to segmentation with correct labels

Andrej 4 anos atrás
pai
commit
efeca97a2e
1 arquivos alterados com 40 adições e 6 exclusões
  1. 40 6
      slicerModule/iraemmBrowser.py

+ 40 - 6
slicerModule/iraemmBrowser.py

@@ -48,7 +48,7 @@ class iraemmBrowserWidget(ScriptedLoadableModuleWidget):
     self.network.parseConfig(fconfig)
     self.network.initRemote()
     self.project="iPNUMMretro/Study"
-    self.dataset="Imaging"
+    self.dataset="Imaging1"
     self.reviewDataset="ImageReview"
 
 
@@ -192,6 +192,7 @@ class iraemmBrowserWidget(ScriptedLoadableModuleWidget):
       #delegate loading to logic
       #try:
       self.logic.loadImage(self.currentRow,self.keepCached.isChecked())
+      self.logic.compileSegmentation()
       #except AttributeError:
       #    print("Missing current row")
       #    return
@@ -254,7 +255,7 @@ class iraemmBrowserLogic(ScriptedLoadableModuleLogic):
              +row['patientCode']+'/'+row['visitCode']+'/'+row[y]\
              for (x,y) in fields.items()}
 
-      volumeNode={}
+      self.volumeNode={}
       for f in relativePaths:
           p=relativePaths[f]
           labkeyPath=self.net.GetLabkeyPathFromRelativePath(p)
@@ -269,11 +270,44 @@ class iraemmBrowserLogic(ScriptedLoadableModuleLogic):
           if f=="Segmentation":
               properties["labelmap"]=1
 
-          volumeNode[f]=self.net.loadNode(p,'VolumeFile',\
+          self.volumeNode[f]=self.net.loadNode(p,'VolumeFile',\
                   properties=properties,returnNode=True,keepCached=keepCached)
-          
-      slicer.util.setSliceViewerLayers(background=volumeNode['CT'],\
-          foreground=volumeNode['PET'],foregroundOpacity=0.5,fit=True)
+
+      #mimic abdominalCT standardized window setting
+      self.volumeNode['CT'].GetScalarVolumeDisplayNode().\
+              SetWindowLevel(1400, -500)
+      #set colormap for PET to PET-Heat (this is a verbatim setting from
+      #the Volumes->Display->Lookup Table colormap identifier)
+      self.volumeNode['PET'].GetScalarVolumeDisplayNode().\
+              SetAndObserveColorNodeID(\
+              slicer.util.getNode('PET-Heat').GetID())
+      slicer.util.setSliceViewerLayers(background=self.volumeNode['CT'],\
+          foreground=self.volumeNode['PET'],foregroundOpacity=0.5,fit=True)
+
+  def compileSegmentation(self):
+      try:
+          labelmapVolumeNode = self.volumeNode['Segmentation']
+      except KeyError:
+          print("No segmentaion volumeNode available")
+          return
+     
+      seg = slicer.mrmlScene.AddNewNodeByClass('vtkMRMLSegmentationNode')
+      slicer.modules.segmentations.logic().\
+              ImportLabelmapToSegmentationNode(labelmapVolumeNode, seg)
+      
+      segLabel={'1':'liver','2':'spleen','3':'lung','4':'thyroid',\
+              '5':'kidney','6':'pancreas','7':'gallbladder','8':'bladder',\
+              '9':'aorta','10':'trachea','11':'sternum','12':'vertebra L1',\
+              '13':'adrenal','14':'psoas major','15':'rectus',\
+              '16':'bowel','17':'stomach','18':'heart'}
+      
+      for i in range(seg.GetSegmentation().GetNumberOfSegments()):
+          segment=seg.GetSegmentation().GetNthSegment(i)
+          segment.SetName(segLabel[segment.GetName()])
+
+      #seg.CreateClosedSurfaceRepresentation()
+      slicer.mrmlScene.RemoveNode(labelmapVolumeNode)
+      self.volumeNode.pop('Segmentation',None)
 
   def clearVolumesAndSegmentations(self):
       nodes=slicer.util.getNodesByClass("vtkMRMLVolumeNode")