def createSampleLabelmapVolumeNode(self, volumeNode, name, label, colorNode=None):
    self.assertTrue( volumeNode != None )
    self.assertTrue( volumeNode.IsA('vtkMRMLScalarVolumeNode') )
    self.assertTrue( label > 0 )

    sampleLabelmapNode = slicer.vtkMRMLLabelMapVolumeNode()
    sampleLabelmapNode.SetName(name)
    sampleLabelmapNode = slicer.mrmlScene.AddNode(sampleLabelmapNode)
    sampleLabelmapNode.Copy(volumeNode)
    imageData = vtk.vtkImageData()
    imageData.DeepCopy(volumeNode.GetImageData())
    sampleLabelmapNode.SetAndObserveImageData(imageData)

    extent = imageData.GetExtent()
    for x in xrange(extent[0], extent[1]+1):
      for y in xrange(extent[2], extent[3]+1):
        for z in xrange(extent[4], extent[5]+1):
          if (x >= (extent[1]/4) and x <= (extent[1]/4) * 3) and (y >= (extent[3]/4) and y <= (extent[3]/4) * 3) and (z >= (extent[5]/4) and z <= (extent[5]/4) * 3):
            imageData.SetScalarComponentFromDouble(x,y,z,0,label)
          else:
            imageData.SetScalarComponentFromDouble(x,y,z,0,0)

    # Display labelmap
    labelmapVolumeDisplayNode = slicer.vtkMRMLLabelMapVolumeDisplayNode()
    slicer.mrmlScene.AddNode(labelmapVolumeDisplayNode)
    if colorNode == None:
      colorNode = slicer.util.getNode('GenericAnatomyColors')
      self.assertTrue( colorNode != None )
    labelmapVolumeDisplayNode.SetAndObserveColorNodeID(colorNode.GetID())
    labelmapVolumeDisplayNode.VisibilityOn()
    sampleLabelmapNodeName = slicer.mrmlScene.GenerateUniqueName(name)
    sampleLabelmapNode.SetName(sampleLabelmapNodeName)
    sampleLabelmapNode.SetAndObserveDisplayNodeID(labelmapVolumeDisplayNode.GetID())

    return sampleLabelmapNode
Example #2
0
  def createSampleLabelmapVolumeNode(self, volumeNode, name, label, colorNode=None):
    self.assertIsNotNone( volumeNode )
    self.assertTrue( volumeNode.IsA('vtkMRMLScalarVolumeNode') )
    self.assertTrue( label > 0 )

    sampleLabelmapNode = slicer.vtkMRMLLabelMapVolumeNode()
    sampleLabelmapNode.SetName(name)
    sampleLabelmapNode = slicer.mrmlScene.AddNode(sampleLabelmapNode)
    sampleLabelmapNode.Copy(volumeNode)
    imageData = sampleLabelmapNode.GetImageData()
    extent = imageData.GetExtent()
    for x in range(extent[0], extent[1]+1):
      for y in range(extent[2], extent[3]+1):
        for z in range(extent[4], extent[5]+1):
          if ( (x >= (extent[1]/4) and x <= (extent[1]/4) * 3) and
               (y >= (extent[3]/4) and y <= (extent[3]/4) * 3) and
               (z >= (extent[5]/4) and z <= (extent[5]/4) * 3) ):
            imageData.SetScalarComponentFromDouble(x,y,z,0,label)
          else:
            imageData.SetScalarComponentFromDouble(x,y,z,0,0)

    # Display labelmap
    labelmapVolumeDisplayNode = slicer.vtkMRMLLabelMapVolumeDisplayNode()
    slicer.mrmlScene.AddNode(labelmapVolumeDisplayNode)
    if colorNode is None:
      colorNode = slicer.util.getNode('GenericAnatomyColors')
      self.assertIsNotNone( colorNode )
    labelmapVolumeDisplayNode.SetAndObserveColorNodeID(colorNode.GetID())
    labelmapVolumeDisplayNode.VisibilityOn()
    sampleLabelmapName = slicer.mrmlScene.GenerateUniqueName(name)
    sampleLabelmapNode.SetName(sampleLabelmapName)
    sampleLabelmapNode.SetAndObserveDisplayNodeID(labelmapVolumeDisplayNode.GetID())

    return sampleLabelmapNode
Example #3
0
    def createStatsChart(self, labelNode, valueToPlot):
        """Make a MRML chart of the current stats
        """
        self.setChartLayout()
        chartViewNode = slicer.util.getNode('ChartView')

        arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode())
        array = arrayNode.GetArray()
        samples = len(self.regionTags)
        tuples = samples
        array.SetNumberOfTuples(tuples)
        tuple = 0

        for i in xrange(samples):
            index = self.regionTags[i]
            array.SetComponent(tuple, 0, i)
            array.SetComponent(tuple, 1, self.labelStats[valueToPlot, index])
            array.SetComponent(tuple, 2, 0)
            tuple += 1

        chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode())
        chartNode.AddArray(valueToPlot, arrayNode.GetID())

        chartViewNode.SetChartNodeID(chartNode.GetID())

        chartNode.SetProperty('default', 'title', 'Parenchyma Statistics')
        chartNode.SetProperty('default', 'xAxisLabel', 'Label')
        chartNode.SetProperty('default', 'yAxisLabel', valueToPlot)
        chartNode.SetProperty('default', 'type', 'Bar')
        chartNode.SetProperty('default', 'xAxisType', 'categorical')
        chartNode.SetProperty('default', 'showLegend', 'off')

        # series level properties
        if labelNode.GetDisplayNode() != None and labelNode.GetDisplayNode(
        ).GetColorNode() != None:
            colorNode = labelNode.GetDisplayNode().GetColorNode()

            newDisplayNode = slicer.vtkMRMLLabelMapVolumeDisplayNode()
            newDisplayNode.SetAndObserveColorNodeID(
                'vtkMRMLColorTableNodeFileGenericAnatomyColors.txt')
            slicer.mrmlScene.AddNode(newDisplayNode)
            newColorNode = newDisplayNode.GetColorNode()

            colorNumber = 0
            for tag in self.regionTags:
                c = [0, 0, 0, 0]
                value = self.valuesDictionary[tag]
                if value[0] == value[1]:
                    colorNode.SetColorName(value[0], tag)
                    colorNode.GetColor(value[0], c)
                    newColorNode.SetColor(colorNumber, c[0], c[1], c[2])

                newColorNode.SetColorName(colorNumber, tag)
                colorNumber += 1

            #      chartNode.SetProperty(valueToPlot, 'lookupTable', labelNode.GetDisplayNode().GetColorNodeID())
            chartNode.SetProperty(valueToPlot, 'lookupTable',
                                  newColorNode.GetID())
Example #4
0
  def test_USGeometry_CreateScanlines(self):
    """ Ideally you should have several levels of tests.  At the lowest level
    tests should exercise the functionality of the logic with different inputs
    (both valid and invalid).  At higher levels your tests should emulate the
    way the user would interact with your code and confirm that it still works
    the way you intended.
    One of the most important features of the tests is that it should alert other
    developers when their changes will have an impact on the behavior of your
    module.  For example, if a developer removes a feature that you depend on,
    your test should break so they know that the feature is needed.
    """

    self.delayDisplay("Starting CreateScanlines test")

    # Setup testing data
    import urllib
    xmlFileName = 'SpineUltrasound-Lumbar-C5_config.xml'
    testDataPath = 'https://raw.githubusercontent.com/Mattel/USBoneSegmentation/master/USGeometry/Testing/Data/Curvilinear/'
    downloads = (
        (testDataPath+'SpineUltrasound-Lumbar-C5-Trimmed.mha', 'SpineUltrasound-Lumbar-C5-Trimmed.mha', slicer.util.loadLabelVolume),
        (testDataPath+'SpineUltrasound-Lumbar-C5_config.xml', xmlFileName, None),
        (testDataPath+'GroundTruth/SpineUltrasound-Lumbar-C5_Scanline_GroundTruth.mha', 'Curvilinear_Scanline_GroundTruth.mha', slicer.util.loadLabelVolume)
        )

    # Load testing data
    for url,name,loader in downloads:
      filePath = slicer.app.temporaryPath + '/' + name
      if not os.path.exists(filePath) or os.stat(filePath).st_size == 0:
        logging.info('Requesting download %s from %s...\n' % (name, url))
        urllib.urlretrieve(url, filePath)
      if loader:
        logging.info('Loading %s...' % (name,))
        loader(filePath)
    self.delayDisplay('Finished with download and loading')

    volumeNode = slicer.util.getNode(pattern="SpineUltrasound-Lumbar-C5-Trimmed")
    groundTruthNode = slicer.util.getNode(pattern="Curvilinear_Scanline_GroundTruth")
    logic = USGeometryLogic(slicer.app.temporaryPath+'/'+xmlFileName, volumeNode)
    scanlineNode = slicer.vtkMRMLLabelMapVolumeNode()
    scanlineNode.SetName("Scanline_Test")
    slicer.mrmlScene.AddNode(scanlineNode)
    scanlineDisplayNode = slicer.vtkMRMLLabelMapVolumeDisplayNode()
    colorNode = slicer.util.getNode('GenericAnatomyColors')
    scanlineDisplayNode.SetAndObserveColorNodeID(colorNode.GetID())
    slicer.mrmlScene.AddNode(scanlineDisplayNode)
    scanlineNode.AddAndObserveDisplayNodeID(scanlineDisplayNode.GetID())
    self.delayDisplay("Running createScanlines...")
    logic.createScanlines(scanlineNode)

    volumeEqualityCheck = self.compareVolumes(groundTruthNode, scanlineNode)
    if volumeEqualityCheck == True:
      self.delayDisplay('Scanline test passed!')
    else:
      self.delayDisplay('Scanline test failed!')
Example #5
0
  def test_USGeometry_SumManualSegmentations(self):
    self.delayDisplay("Starting SumManualSegmentations test")

    import urllib
    xmlFileName = 'SpineUltrasound-Lumbar-C5_config.xml'
    testDataPath = 'https://raw.githubusercontent.com/Mattel/USBoneSegmentation/master/USGeometry/Testing/Data/Curvilinear/'
    downloads = (
      (testDataPath+'SpineUltrasound-Lumbar-C5-Trimmed.mha', 'SpineUltrasound-Lumbar-C5-Trimmed.mha', slicer.util.loadLabelVolume),
      (testDataPath+'SpineUltrasound-Lumbar-C5_config.xml', xmlFileName, None),
      (testDataPath+'TestManualSegmentations/SpineUltrasound-Lumbar-C5-TestSeg1.mha', 'TestManualSegmentations/SpineUltrasound-Lumbar-C5-TestSeg1.mha', slicer.util.loadLabelVolume),
      (testDataPath+'TestManualSegmentations/SpineUltrasound-Lumbar-C5-TestSeg2.mha', 'TestManualSegmentations/SpineUltrasound-Lumbar-C5-TestSeg2.mha', slicer.util.loadLabelVolume),
      (testDataPath+'TestManualSegmentations/SpineUltrasound-Lumbar-C5-TestSeg3.mha', 'TestManualSegmentations/SpineUltrasound-Lumbar-C5-TestSeg3.mha', slicer.util.loadLabelVolume),
      (testDataPath+'GroundTruth/SummedManualSegmentations_GroundTruth.mha','SummedManualSegmentations_GroundTruth.mha', slicer.util.loadLabelVolume)
      )

    for url,name,loader in downloads:
      filePath = slicer.app.temporaryPath + '/' + name
      if not os.path.exists(filePath) or os.stat(filePath).st_size == 0:
        directoryName = os.path.dirname(filePath)
        if not os.path.exists(directoryName):
          os.makedirs(directoryName)
        logging.info('Requesting download %s from %s...\n' % (name,url))
        urllib.urlretrieve(url, filePath)
      if loader:
        logging.info('Loading %s...' % (name,))
        loader(filePath)
    self.delayDisplay('Finished with downloading and loading')

    volumeNode = slicer.util.getNode(pattern="SpineUltrasound-Lumbar-C5-Trimmed")
    groundTruthNode = slicer.util.getNode(pattern="SummedManualSegmentations_GroundTruth")
    logic = USGeometryLogic(slicer.app.temporaryPath+'/'+xmlFileName, volumeNode)
    summedManualSegNode = slicer.vtkMRMLLabelMapVolumeNode()
    summedManualSegNode.SetName("SummedManualSegmentations_Test")
    slicer.mrmlScene.AddNode(summedManualSegNode)
    summedManualSegDisplayNode = slicer.vtkMRMLLabelMapVolumeDisplayNode()
    colorNode = slicer.util.getNode('GenericAnatomyColors')
    summedManualSegDisplayNode.SetAndObserveColorNodeID(colorNode.GetID())
    slicer.mrmlScene.AddNode(summedManualSegDisplayNode)
    summedManualSegNode.AddAndObserveDisplayNodeID(summedManualSegDisplayNode.GetID())

    self.delayDisplay("Running sumManualSegmentations...")
    logic.sumManualSegmentations(slicer.app.temporaryPath+'/TestManualSegmentations', summedManualSegNode)

    volumeEqualityCheck = self.compareVolumes(groundTruthNode, summedManualSegNode)
    if volumeEqualityCheck == True:
      self.delayDisplay("Summed manual segmentations test passed!")
    else:
      self.delayDisplay("Summed manual segmentations test failed!")
Example #6
0
  def loadVoi(self,filePath,segmentationNode,motionState=0,voi=None):
    
    if not segmentationNode:
       print "No segmentation node"
       return
    
    
    if voi.slicerNodeID[motionState]:
       return voi.slicerNodeID[motionState]
    
    binaryLabelmapReprName = vtkSegmentationCore.vtkSegmentationConverter.GetSegmentationBinaryLabelmapRepresentationName()
    segLogic = slicer.modules.segmentations.logic()
    segLogic.SetMRMLScene(slicer.mrmlScene)
    voi.slicerNodeID[motionState]=None
    
    if not filePath or not os.path.isfile(filePath):
      #Try to execute hed2nrrd.sh
      filePrefix, fileExtension = os.path.splitext(filePath)
      hed2nrrd = "/u/motion/share/bin/hed2nrrd.sh"
      dirName = os.path.dirname(os.path.realpath(filePath) )
      if os.path.isfile(hed2nrrd):
         #If you have write access, nrrd file is created
         if os.access(dirName, os.W_OK):
            os.system(hed2nrrd + " " + dirName)
         else:
            print "No write access to " + dirName +"\n Either create .nrrd files or get write permission."
            
    if not filePath or not os.path.isfile(filePath):        
       print "No file!" + filePath
       return None

    volumesLogic = slicer.vtkSlicerVolumesLogic()
    volumesLogic.SetMRMLScene(slicer.mrmlScene)
    slicerVolumeName = voi.name + "_" + str(motionState)
    slicerVolume = volumesLogic.AddArchetypeVolume(filePath,slicerVolumeName,1) 
    #success, midV = slicer.util.loadVolume(os.path.basename(filePath), 
                                           #properties = {'name' : "Helo", 'labelmap' : True}, returnNode = True)
    slicerVolume.SetOrigin(voi.getSlicerOrigin())
    if not slicerVolume:
      print "Can't load volume " + os.path.basename(filePath)
      return None
    
    colorNode = slicer.util.getNode("vtkMRMLColorTableNodeFileGenericAnatomyColors.txt")
    colorIndex = colorNode.GetColorIndexByName(voi.name.lower())
    
    color = [0,0,0,1]
    if colorIndex < 2:
       colorIndex = colorNode.GetColorIndexByName("region 11")
       
    if not colorNode.GetColor(colorIndex,color):
       print "Can't set color for " + voi.name.lower()
       color = [0,0,0,1]

    displayNode = slicer.vtkMRMLLabelMapVolumeDisplayNode()
    displayNode.SetAndObserveColorNodeID(colorNode.GetID())
    displayNode.SetColor(color[0:3])
    slicer.mrmlScene.AddNode(displayNode)
    slicerVolume.SetAndObserveDisplayNodeID(displayNode.GetID())


    try:
       array = slicer.util.array(slicerVolume.GetID())
    except AttributeError:
      import sys
      sys.stderr.write('Cannot get array.')
      
    array[:] = ( array[:] >> voi.motionStateBit[motionState] ) & 1
    if colorIndex > -1:
       array[:] *= colorIndex
    slicerVolume.GetImageData().Modified()
    if not slicer.vtkSlicerSegmentationsModuleLogic.ImportLabelmapToSegmentationNode(slicerVolume,segmentationNode):
       print "Can't load volume in segmentation"
       return None
    else:
       print "Added " + slicerVolume.GetName() + " to " + segmentationNode.GetName()
    
    return slicerVolume.GetID()