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
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
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())
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!')
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!")
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()