def __init__(self, parent=None):
        ScriptedLoadableModuleWidget.__init__(self, parent)
        settings = qt.QSettings()
        self.developerMode = SlicerUtil.IsDevelopment
        if not parent:
            self.parent = slicer.qMRMLWidget()
            self.parent.setLayout(qt.QVBoxLayout())
            self.parent.setMRMLScene(slicer.mrmlScene)
        else:
            self.parent = parent
        self.layout = self.parent.layout()
        if not parent:
            self.setup()
            self.parent.show()

        self.priority = 2
        self.calcificationType = 0
        self.ThresholdMin = 130.0
        self.ThresholdMax = 1000.0
        self.MinimumLesionSize = 1
        self.MaximumLesionSize = 500
        self.croppedVolumeNode = slicer.vtkMRMLScalarVolumeNode()
        self.threshImage = vtk.vtkImageData()
        self.marchingCubes = vtk.vtkDiscreteMarchingCubes()
        self.transformPolyData = vtk.vtkTransformPolyDataFilter()

        self.selectedLabelList = []
        self.labelScores = []
        self.selectedLabels = {}
        self.modelNodes = []
        self.voxelVolume = 1.
        self.sx = 1.
        self.sy = 1.
        self.sz = 1.
        self.selectedRGB = [1,0,0]
        self.observerTags = []
        self.xy = []

        self.summary_reports=["Agatston Score","Mass Score","Volume"]

        self.labelScores = dict()
        self.totalScores=dict()
        for sr in self.summary_reports:
            self.labelScores[sr]=[]
            self.totalScores[sr]=0
              
        self.columnsDict = OrderedDict()
        self.columnsDict["CaseID"] = "CaseID"
        for sr in self.summary_reports:
            self.columnsDict[sr.replace(" ","")]=sr
def run(input_fpath, output_fpath, input_node_name=None):
    assert _recent_opr_nodes == []
    input_node = None
    if input_node_name is not None:
        input_node = getNode(input_node_name)
    if input_node is None:
        input_node = _load_volume(input_fpath, input_node_name)

    atlas_volume, atlas_mask = _get_atlas_nodes()

    output_volume_node = slicer.vtkMRMLScalarVolumeNode()
    output_mask_node = slicer.vtkMRMLScalarVolumeNode()
    output_volume_node.SetName('{}-output'.format(input_node.GetName()))
    output_mask_node.SetName('{}-mask'.format(input_node.GetName()))
    slicer.mrmlScene.AddNode(output_volume_node)
    slicer.mrmlScene.AddNode(output_mask_node)
    output_mask_node.LabelMapOn()

    params = {
        'atlasMRIVolume': atlas_volume.GetID(),
        'atlasMaskVolume': atlas_mask.GetID(),
        'patientVolume': input_node.GetID(),
        'patientOutputVolume': output_volume_node.GetID(),
        'patientMaskLabel': output_mask_node.GetID()
    }

    cli_node = slicer.cli.run(slicer.modules.swissskullstripper,
                              None,
                              params,
                              wait_for_completion=True)
    # cli_node.AddObserver('ModifiedEvent', _on_status_modified)
    _recent_opr_nodes[:] = [
        input_node, output_volume_node, output_mask_node, output_fpath
    ]
    _on_finished()
  def computeFA(self, inputVolume):
    # Create intermediate output volumes
    dtiVolume = slicer.mrmlScene.AddNode(slicer.vtkMRMLDiffusionTensorVolumeNode())
    outputBaseline = slicer.mrmlScene.AddNode(slicer.vtkMRMLScalarVolumeNode())

    # Compute the DTI output volume using the "DWI to DTI estimation" CLI module
    module = slicer.modules.dwitodtiestimation
    self.delayDisplay(module.title)
    logging.info('"%s" started' % module.title)
    cliParams = {
      'inputVolume': inputVolume.GetID(),
      'outputTensor': dtiVolume.GetID(),
      'outputBaseline' : outputBaseline.GetID()
    }
    cliNode = slicer.cli.run(module, None, cliParams, wait_for_completion=True)
    logging.info('"%s" completed' % module.title)

    # Create output volume
    outputScalar = slicer.mrmlScene.AddNode(slicer.vtkMRMLScalarVolumeNode())

    # Compute FA output volume using "Diffusion Tensor Scalar Measurements" CLI module
    module = slicer.modules.diffusiontensorscalarmeasurements
    self.delayDisplay(module.title)
    logging.info('"%s" started' % module.title)
    cliParams = {
      'inputVolume': dtiVolume.GetID(),
      'outputScalar': outputScalar.GetID()
    }
    cliNode = slicer.cli.run(module, None, cliParams, wait_for_completion=True)
    logging.info('"%s" completed' % module.title)

    return (outputBaseline, outputScalar)
def run(input_fpath, output_fpath, input_node_name=None):
    assert _recent_opr_nodes == []
    input_node = None
    if input_node_name is not None:
        input_node = getNode(input_node_name)
    if input_node is None:
        input_node = _load_volume(input_fpath, input_node_name)

    atlas_volume, atlas_mask = _get_atlas_nodes()

    output_volume_node = slicer.vtkMRMLScalarVolumeNode()
    output_mask_node = slicer.vtkMRMLScalarVolumeNode()
    output_volume_node.SetName('{}-output'.format(input_node.GetName()))
    output_mask_node.SetName('{}-mask'.format(input_node.GetName()))
    slicer.mrmlScene.AddNode(output_volume_node)
    slicer.mrmlScene.AddNode(output_mask_node)
    output_mask_node.LabelMapOn()

    params = {
        'atlasMRIVolume': atlas_volume.GetID(),
        'atlasMaskVolume': atlas_mask.GetID(),
        'patientVolume': input_node.GetID(),
        'patientOutputVolume': output_volume_node.GetID(),
        'patientMaskLabel': output_mask_node.GetID()
    }

    cli_node = slicer.cli.run(slicer.modules.swissskullstripper, None, params,
                              wait_for_completion=True)
    # cli_node.AddObserver('ModifiedEvent', _on_status_modified)
    _recent_opr_nodes[:] = [
        input_node, output_volume_node, output_mask_node, output_fpath]
    _on_finished()
  def computeFA(self, inputVolume):
    # Create intermediate output volumes
    dtiVolume = slicer.mrmlScene.AddNode(slicer.vtkMRMLDiffusionTensorVolumeNode())
    outputBaseline = slicer.mrmlScene.AddNode(slicer.vtkMRMLScalarVolumeNode())

    # Compute the DTI output volume using the "DWI to DTI estimation" CLI module
    module = slicer.modules.dwitodtiestimation
    self.delayDisplay(module.title)
    logging.info('"%s" started' % module.title)
    cliParams = {
      'inputVolume': inputVolume.GetID(),
      'outputTensor': dtiVolume.GetID(),
      'outputBaseline' : outputBaseline.GetID()
    }
    cliNode = slicer.cli.run(module, None, cliParams, wait_for_completion=True)
    logging.info('"%s" completed' % module.title)

    # Create output volume
    outputScalar = slicer.mrmlScene.AddNode(slicer.vtkMRMLScalarVolumeNode())

    # Compute FA output volume using "Diffusion Tensor Scalar Measurements" CLI module
    module = slicer.modules.diffusiontensorscalarmeasurements
    self.delayDisplay(module.title)
    logging.info('"%s" started' % module.title)
    cliParams = {
      'inputVolume': dtiVolume.GetID(),
      'outputScalar': outputScalar.GetID()
    }
    cliNode = slicer.cli.run(module, None, cliParams, wait_for_completion=True)
    logging.info('"%s" completed' % module.title)

    return (outputBaseline, outputScalar)
  def TestSection_07_AccumulateDose(self):
    try:
      slicer.util.selectModule('DoseAccumulation')
      doseAccumulationWidget = slicer.modules.doseaccumulation.widgetRepresentation()
      doseAccumulationLogic = slicer.modules.doseaccumulation.logic()
      
      self.doseAccumulationParamNode = slicer.util.getNode('DoseAccumulation')
      self.assertIsNotNone( self.doseAccumulationParamNode )

      day1Dose = slicer.util.getNode(self.day1DoseName)
      inputFrame = slicer.util.findChildren(widget=doseAccumulationWidget, className='ctkCollapsibleButton', text='Input')[0]
      referenceVolumeCombobox = slicer.util.findChildren(widget=inputFrame, className='qMRMLNodeComboBox')[0]
      referenceVolumeCombobox.setCurrentNode(day1Dose)

      outputFrame = slicer.util.findChildren(widget=doseAccumulationWidget, className='ctkCollapsibleButton', text='Output')[0]
      outputMrmlNodeCombobox = slicer.util.findChildren(widget=outputFrame, className='qMRMLNodeComboBox')[0]

      self.assertIsNotNone( referenceVolumeCombobox )
      self.assertIsNotNone( outputMrmlNodeCombobox )

      # Create output volumes
      accumulatedDoseUnregistered = slicer.vtkMRMLScalarVolumeNode()
      accumulatedDoseUnregistered.SetName(self.accumulatedDoseUnregisteredName)
      slicer.mrmlScene.AddNode( accumulatedDoseUnregistered )

      accumulatedDoseRigid = slicer.vtkMRMLScalarVolumeNode()
      accumulatedDoseRigid.SetName(self.accumulatedDoseRigidName)
      slicer.mrmlScene.AddNode( accumulatedDoseRigid )

      doseAccumulationWidget.updateWidgetFromMRML()

      self.DoseAccumulationUtility_SelectDoseVolume(self.day1DoseName, True)

      # Accumulate Day 1 dose and untransformed Day 2 dose
      self.delayDisplay("Accumulate Day 1 dose with unregistered Day 2 dose",self.delayMs)
      self.DoseAccumulationUtility_SelectDoseVolume(self.day2DoseName, True)
      outputMrmlNodeCombobox.setCurrentNode(accumulatedDoseUnregistered)
      doseAccumulationLogic.AccumulateDoseVolumes(self.doseAccumulationParamNode)

      self.assertIsNotNone( accumulatedDoseUnregistered.GetImageData() )
      self.delayDisplay("Accumulate Day 1 dose with unregistered Day 2 dose finished",self.delayMs)

      self.delayDisplay("Accumulate Day 1 dose with Day 2 dose registered with rigid registration",self.delayMs)
      self.DoseAccumulationUtility_SelectDoseVolume(self.day2DoseName, False)
      self.DoseAccumulationUtility_SelectDoseVolume(self.day2DoseRigidName, True)
      outputMrmlNodeCombobox.setCurrentNode(accumulatedDoseRigid)
      doseAccumulationLogic.AccumulateDoseVolumes(self.doseAccumulationParamNode)
      
      self.assertIsNotNone( accumulatedDoseRigid.GetImageData() )

      self.delayDisplay("Accumulate Day 1 dose with Day 2 dose registered with rigid registration finished",self.delayMs)
      self.DoseAccumulationUtility_SelectDoseVolume(self.day2DoseRigidName, False)

    except Exception, e:
      import traceback
      traceback.print_exc()
      self.delayDisplay('Test caused exception!\n' + str(e),self.delayMs*2)
      raise Exception("Exception occurred, handled, thrown further to workflow level")
Exemple #7
0
    def section_CLI(self):
        self.delayDisplay("Test command-line interface", self.delayMs)

        shNode = slicer.mrmlScene.GetSubjectHierarchyNode()
        self.assertIsNotNone(shNode)

        # Get CT volume
        ctVolumeNode = shNode.GetItemDataNode(self.ctVolumeShItemID)
        self.assertIsNotNone(ctVolumeNode)

        # Create output volume
        resampledVolumeNode = slicer.vtkMRMLScalarVolumeNode()
        resampledVolumeNode.SetName(ctVolumeNode.GetName() +
                                    '_Resampled_10x10x10mm')
        slicer.mrmlScene.AddNode(resampledVolumeNode)

        # Resample
        resampleParameters = {
            'outputPixelSpacing': '24.5,24.5,11.5',
            'interpolationType': 'lanczos',
            'InputVolume': ctVolumeNode.GetID(),
            'OutputVolume': resampledVolumeNode.GetID()
        }
        slicer.cli.run(slicer.modules.resamplescalarvolume,
                       None,
                       resampleParameters,
                       wait_for_completion=True)
        self.delayDisplay("Wait for CLI logic to add result to same branch",
                          self.delayMs)

        # Check if output is also under the same study node
        resampledVolumeItemID = shNode.GetItemByDataNode(resampledVolumeNode)
        self.assertIsNotNone(resampledVolumeItemID)
        self.assertEqual(shNode.GetItemParent(resampledVolumeItemID),
                         self.studyItemID)
Exemple #8
0
    def createListFromVectorImage(self, inputVectorNode, list):
        print("Creating list from vectorNode")

        inputImage = inputVectorNode.GetImageData()

        listFeatureName = [
            "energy", "entropy", "correlation", "inv_diff_moment", "inertia",
            "cluster_shade", "cluster_prom", "har_correlation"
        ]

        for i in range(inputImage.GetNumberOfScalarComponents()):
            print("Processing return from vector to list: " + str(i) + "...")
            outputNode = slicer.vtkMRMLScalarVolumeNode()
            slicer.mrmlScene.AddNode(outputNode)

            ijkToRAS = vtk.vtkMatrix4x4()
            inputVectorNode.GetIJKToRASMatrix(ijkToRAS)
            outputNode.SetIJKToRASMatrix(ijkToRAS)

            extract = vtk.vtkImageExtractComponents()
            extract.SetInputConnection(
                inputVectorNode.GetImageDataConnection())
            extract.SetComponents(i)
            extract.Update()
            outputNode.SetImageDataConnection(extract.GetOutputPort())

            list.append((listFeatureName[i], outputNode))
 def createMaskedVolume(self, inputVolume, labelVolume):
   maskedVolume = slicer.vtkMRMLScalarVolumeNode()
   maskedVolume.SetName("maskedTemplateVolume")
   slicer.mrmlScene.AddNode(maskedVolume)
   params = {'InputVolume': inputVolume, 'MaskVolume': labelVolume, 'OutputVolume': maskedVolume}
   slicer.cli.run(slicer.modules.maskscalarvolume, None, params, wait_for_completion=True)
   return maskedVolume
Exemple #10
0
def warpImg(inImg, refImg, outImg, pixelT, tfmFile, intplMode, labelMap=False):
    '''Resample an image using an exisiting transform.
    inImg: full path to the input image (to be resampled);
    refImg: full path to the reference image;
    outImg: full path to the output image (resampled image);
    pixelT: pixel type, options include
            float, short, ushort, int, uint, uchar, binary
    tfmFile: full path to the transform image;
    intplMode: interpolation mode, options include
            Linear, NearestNeighbor, BSpline, WindowedSinc.
    labelMap: whether the output is a label map (Boolean).
    '''
    slicer.mrmlScene.Clear(0)
    if labelMap:
        inimg = slicer.util.loadLabelVolume(inImg)
        outVolume = slicer.vtkMRMLLabelMapVolumeNode()
    else:
        inimg = slicer.util.loadVolume(inImg)
        outVolume = slicer.vtkMRMLScalarVolumeNode()
    refimg = slicer.util.loadVolume(refImg)
    tfm = slicer.util.loadTransform(tfmFile)
    slicer.mrmlScene.AddNode(outVolume)
    cliModule = slicer.modules.brainsresample
    p = {}
    p['inputVolume'] = inimg.GetID()
    p['referenceVolume'] = refimg.GetID()
    p['outputVolume'] = outVolume.GetID()
    p['pixelType'] = pixelT
    p['warpTransform'] = tfm.GetID()
    p['interpolationMode'] = intplMode
    slicer.cli.run(cliModule, None, p, wait_for_completion=True)
    state = slicer.util.saveNode(outVolume, outImg)
    slicer.mrmlScene.Clear(0)
    return {outImg: state}
 def loadTCGAData(self):
   slicer.util.openAddVolumeDialog()
   red_logic = slicer.app.layoutManager().sliceWidget("Red").sliceLogic()
   red_cn = red_logic.GetSliceCompositeNode()
   fgrdVolID = red_cn.GetBackgroundVolumeID()
   fgrdNode = slicer.util.getNode(fgrdVolID)
   fMat=vtk.vtkMatrix4x4()
   fgrdNode.GetIJKToRASDirectionMatrix(fMat)
   bgrdName = fgrdNode.GetName() + '_gray'
   self.tilename = fgrdNode.GetName() + '_gray'
   self.parameterNode.SetParameter("SlicerPathology,tilename", self.tilename)
   # Create dummy grayscale image
   magnitude = vtk.vtkImageMagnitude()
   magnitude.SetInputData(fgrdNode.GetImageData())
   magnitude.Update()  
   bgrdNode = slicer.vtkMRMLScalarVolumeNode()
   bgrdNode.SetImageDataConnection(magnitude.GetOutputPort())
   bgrdNode.SetName(bgrdName)
   bgrdNode.SetIJKToRASDirectionMatrix(fMat)
   slicer.mrmlScene.AddNode(bgrdNode)
   bgrdVolID = bgrdNode.GetID()  
   red_cn.SetForegroundVolumeID(fgrdVolID)
   red_cn.SetBackgroundVolumeID(bgrdVolID)
   red_cn.SetForegroundOpacity(1)   
   self.checkAndSetLUT() 
   print bgrdName
   cv = slicer.util.getNode(bgrdName)
   self.volumesLogic = slicer.modules.volumes.logic()
   labelName = bgrdName+'-label'
   refLabel = self.volumesLogic.CreateAndAddLabelVolume(slicer.mrmlScene,cv,labelName)
   refLabel.GetDisplayNode().SetAndObserveColorNodeID(self.SlicerPathologyColorNode.GetID())
   self.editorWidget.helper.setMasterVolume(cv)
Exemple #12
0
  def test_Elastix1(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 the test")
    #
    # first, get some data
    #

    import SampleData
    sampleDataLogic = SampleData.SampleDataLogic()
    tumor1 = sampleDataLogic.downloadMRBrainTumor1()
    tumor2 = sampleDataLogic.downloadMRBrainTumor2()

    outputVolume = slicer.vtkMRMLScalarVolumeNode()
    slicer.mrmlScene.AddNode(outputVolume)
    outputVolume.CreateDefaultDisplayNodes()

    logic = ElastixLogic()
    parameterFilenames = logic.getRegistrationPresets()[0][RegistrationPresets_ParameterFilenames]
    logic.registerVolumes(tumor1, tumor2, parameterFilenames = parameterFilenames, outputVolumeNode = outputVolume)

    self.delayDisplay('Test passed!')
Exemple #13
0
def rigidReg(fixedImg, movingImg, outTfm, outImg=None, initTfm=None):
    '''Rigid registration using BRAINS Registration
    fixedImg: full path to the fixed image;
    movingImg: full path to the moving image;
    outImg: full path to the output co-registered image;
    outTfm: full path to the output transform file (.tfm).
    '''
    slicer.mrmlScene.Clear(0)
    fixed = slicer.util.loadVolume(fixedImg)
    moving = slicer.util.loadVolume(movingImg)
    cliModule = slicer.modules.brainsfit
    p = {}
    p['fixedVolume'] = fixed.GetID()
    p['movingVolume'] = moving.GetID()
    outVolume = slicer.vtkMRMLScalarVolumeNode()
    slicer.mrmlScene.AddNode(outVolume)
    p['outputVolume'] = outVolume.GetID()
    p['transformType'] = 'Rigid'
    tfm = slicer.vtkMRMLLinearTransformNode()
    slicer.mrmlScene.AddNode(tfm)
    p['outputTransform'] = tfm.GetID()
    if initTfm:
        _tfm = slicer.util.loadTransform(initTfm)
        p['initialTransform'] = _tfm.GetID()
    slicer.cli.run(cliModule, None, p, wait_for_completion=True)
    result = {}
    if outImg:
        state1 = slicer.util.saveNode(outVolume, outImg)
        result.update({outImg: state1})
    state2 = slicer.util.saveNode(tfm, outTfm)
    result.update({outTfm: state2})
    slicer.mrmlScene.Clear(0)
    return result
  def runWatershed(self, masterImageData, seedLabelmap, outputLabelmap):

    masterVolumeNode = slicer.vtkMRMLScalarVolumeNode()
    slicer.mrmlScene.AddNode(masterVolumeNode)
    slicer.vtkSlicerSegmentationsModuleLogic.CopyOrientedImageDataToVolumeNode(masterImageData, masterVolumeNode)

    seedLabelmapNode = slicer.vtkMRMLLabelMapVolumeNode()
    slicer.mrmlScene.AddNode(seedLabelmapNode)
    slicer.vtkSlicerSegmentationsModuleLogic.CopyOrientedImageDataToVolumeNode(seedLabelmap, seedLabelmapNode)

    # Read input data from Slicer into SimpleITK
    labelImage = sitk.ReadImage(sitkUtils.GetSlicerITKReadWriteAddress(seedLabelmapNode.GetName()))
    backgroundImage = sitk.ReadImage(sitkUtils.GetSlicerITKReadWriteAddress(masterVolumeNode.GetName()))
    # Run watershed filter
    featureImage = sitk.GradientMagnitudeRecursiveGaussian(backgroundImage, float(self.scriptedEffect.doubleParameter(FEATURE_SIZE_MM_PARAMETER_NAME)))
    del backgroundImage
    f = sitk.MorphologicalWatershedFromMarkersImageFilter()
    f.SetMarkWatershedLine(False)
    f.SetFullyConnected(False)
    labelImage = f.Execute(featureImage, labelImage)
    del featureImage
    # Pixel type of watershed output is the same as the input. Convert it to int16 now.
    if labelImage.GetPixelID() != sitk.sitkInt16:
      labelImage = sitk.Cast(labelImage, sitk.sitkInt16)
    # Write result from SimpleITK to Slicer. This currently performs a deep copy of the bulk data.
    sitk.WriteImage(labelImage, sitkUtils.GetSlicerITKReadWriteAddress(seedLabelmapNode.GetName()))

    # Update segmentation from labelmap node and remove temporary nodes
    outputLabelmap.ShallowCopy(seedLabelmapNode.GetImageData())
    outputLabelmap.SetExtent(masterImageData.GetExtent())

    slicer.mrmlScene.RemoveNode(masterVolumeNode)
    slicer.mrmlScene.RemoveNode(seedLabelmapNode)
Exemple #15
0
def createVolume(name,n_row,n_col,n_slice):
        imageSize = [n_row, n_col, n_slice]
        imageSpacing = [1.0, 1.0, 1.0]
        voxelType = vtk.VTK_FLOAT
        
        # Create an empty image volume
        imageData = vtk.vtkImageData()
        imageData.SetDimensions(imageSize)
        imageData.AllocateScalars(voxelType, 1)
        thresholder = vtk.vtkImageThreshold()
        thresholder.SetInputData(imageData)
        thresholder.SetInValue(0)
        thresholder.SetOutValue(0)
        
        # Create volume node
        volumeNode = slicer.vtkMRMLScalarVolumeNode()
        volumeNode.SetSpacing(imageSpacing)
        volumeNode.SetImageDataConnection(thresholder.GetOutputPort())
        
        # Add volume to scene
        slicer.mrmlScene.AddNode(volumeNode)
        displayNode = slicer.vtkMRMLScalarVolumeDisplayNode()
        slicer.mrmlScene.AddNode(displayNode)
        colorNode = slicer.util.getNode('Grey')
        displayNode.SetAndObserveColorNodeID(colorNode.GetID())
        volumeNode.SetAndObserveDisplayNodeID(displayNode.GetID())
        volumeNode.CreateDefaultStorageNode()
        volumeNode.SetName(name)
        
        return volumeNode
  def section_CLI(self):
    self.delayDisplay("Test command-line interface",self.delayMs)

    shNode = slicer.vtkMRMLSubjectHierarchyNode.GetSubjectHierarchyNode(slicer.mrmlScene)
    self.assertIsNotNone( shNode )

    # Get CT volume
    ctVolumeNode = shNode.GetItemDataNode(self.ctVolumeShItemID)
    self.assertIsNotNone( ctVolumeNode )

    # Create output volume
    resampledVolumeNode = slicer.vtkMRMLScalarVolumeNode()
    resampledVolumeNode.SetName(ctVolumeNode.GetName() + '_Resampled_10x10x10mm')
    slicer.mrmlScene.AddNode(resampledVolumeNode)

    # Resample
    resampleParameters = { 'outputPixelSpacing':'24.5,24.5,11.5', 'interpolationType':'lanczos',
      'InputVolume':ctVolumeNode.GetID(), 'OutputVolume':resampledVolumeNode.GetID() }
    slicer.cli.run(slicer.modules.resamplescalarvolume, None, resampleParameters, wait_for_completion=True)
    self.delayDisplay("Wait for CLI logic to add result to same branch",self.delayMs)

    # Check if output is also under the same study node
    resampledVolumeItemID = shNode.GetItemByDataNode(resampledVolumeNode)
    self.assertIsNotNone( resampledVolumeItemID )
    self.assertEqual( shNode.GetItemParent(resampledVolumeItemID), self.studyItemID )
Exemple #17
0
  def loadByPaths(self, paths, outputNode, properties={}):

    volumeArray = None
    sliceIndex = 0
    for path in paths:
      reader = sitk.ImageFileReader()
      reader.SetFileName(path)
      image = reader.Execute()
      sliceArray = sitk.GetArrayFromImage(image)
      if len(sliceArray.shape) == 3:
        sliceArray = sitk.GetArrayFromImage(image)[:,:,0]

      if volumeArray is None:
        shape = (len(paths), *sliceArray.shape)
        volumeArray = numpy.zeros(shape, dtype=sliceArray.dtype)
      volumeArray[sliceIndex] = sliceArray
      sliceIndex += 1

    if not outputNode:
      outputNode = slicer.vtkMRMLScalarVolumeNode()
      slicer.mrmlScene.AddNode(outputNode)

    if 'spacing' in properties:
      outputNode.SetSpacing(*properties['spacing'])

    slicer.util.updateVolumeFromArray(outputNode, volumeArray)
    slicer.util.setSliceViewerLayers(background=outputNode, fit=True)
def create_new_volume_from_array(array,size,spacing,name=None):
    """
    Creates a new slicer volume from a 3D numpy array
    :param array: Values in the new volume
    :param size: Physical size of the new image volume
    :param spacing: Spacing between the voxels in the image
    :param name: Name to be given to the created volume
    :return: vtkMRMLScalarVolumeNode created
    """
    nx, ny, nz = size
    dx, dy, dz = spacing
    imageOrigin = (-0.5 * (nx - 1) * dx, -0.5 * (ny - 1) * dy, -0.5 * (nz - 1) * dz)
    voxelType = vtk.VTK_DOUBLE
    # Create an empty image volume
    imageData = vtk.vtkImageData()
    imageData.SetDimensions(size)
    imageData.AllocateScalars(voxelType, 1)
    # Create volume node
    volumeNode = slicer.vtkMRMLScalarVolumeNode()
    volumeNode.SetSpacing(spacing)
    volumeNode.SetOrigin(imageOrigin)
    # Add volume to scene
    slicer.mrmlScene.AddNode(volumeNode)
    update_visualisation_settings(volumeNode,array)
    volumeNode.CreateDefaultStorageNode()
    if name is not None:
        volumeNode.SetName(name)
    slicer.util.updateVolumeFromArray(volumeNode, array)
    return volumeNode
    def loadByPaths(self, paths, outputNode, properties={}):
        """
    Load the files in paths to outputNode with optional properties.
    TODO: currently downsample is done with nearest neighbor filtering
    (i.e. skip slices and take every other row/column).
    It would be better to do a high order spline or other
    method, but there is no convenient streaming option for these.
    One option will be do to a box filter by averaging adjacent
    slices/row/columns which should be easy in numpy
    and give good results for a pixel aligned 50% scale operation.
    """

        spacing = (1, 1, 1)
        if 'spacing' in properties:
            spacing = properties['spacing']

        downsample = 'downsample' in properties and properties['downsample']
        if downsample:
            paths = paths[::2]
            spacing = [element * 2. for element in spacing]

        volumeArray = None
        sliceIndex = 0
        for path in paths:
            reader = sitk.ImageFileReader()
            reader.SetFileName(path)
            image = reader.Execute()
            sliceArray = sitk.GetArrayFromImage(image)
            if len(sliceArray.shape) == 3:
                sliceArray = sitk.GetArrayFromImage(image)[:, :, 0]

            if volumeArray is None:
                sliceShape = sliceArray.shape
                if downsample:
                    sliceShape = [
                        math.floor(element / 2) for element in sliceShape
                    ]
                shape = (len(paths), *sliceShape)
                volumeArray = numpy.zeros(shape, dtype=sliceArray.dtype)
            if downsample:
                sliceArray = sliceArray[::2, ::2]
            volumeArray[sliceIndex] = sliceArray
            sliceIndex += 1

        if not outputNode:
            outputNode = slicer.vtkMRMLScalarVolumeNode()
            slicer.mrmlScene.AddNode(outputNode)

        ijkToRAS = vtk.vtkMatrix4x4()
        ijkToRAS.Identity()
        for index in range(3):
            if (spacing[index] < 0):
                spacing[index] = -1. * spacing[index]
                ijkToRAS.SetElement(index, index, -1.)
        outputNode.SetSpacing(*spacing)
        outputNode.SetIJKToRASMatrix(ijkToRAS)

        slicer.util.updateVolumeFromArray(outputNode, volumeArray)
        slicer.util.setSliceViewerLayers(background=outputNode, fit=True)
  def mutate(self):
    red_logic = slicer.app.layoutManager().sliceWidget("Red").sliceLogic()
    red_cn = red_logic.GetSliceCompositeNode()
    fgrdVolID = red_cn.GetBackgroundVolumeID()
    fgrdNode = slicer.util.getNode("WEB")
    fgrdVolID = fgrdNode.GetID()
    fMat=vtk.vtkMatrix4x4()
    fgrdNode.GetIJKToRASDirectionMatrix(fMat)
    bgrdName = fgrdNode.GetName() + '_gray'
    magnitude = vtk.vtkImageMagnitude()
    magnitude.SetInputData(fgrdNode.GetImageData())
    magnitude.Update()  
    bgrdNode = slicer.vtkMRMLScalarVolumeNode()
    bgrdNode.SetImageDataConnection(magnitude.GetOutputPort())
    bgrdNode.SetName(bgrdName)
    bgrdNode.SetIJKToRASDirectionMatrix(fMat)
    slicer.mrmlScene.AddNode(bgrdNode)
    bgrdVolID = bgrdNode.GetID()  
    red_cn.SetForegroundVolumeID(fgrdVolID)
    red_cn.SetBackgroundVolumeID(bgrdVolID)
    red_cn.SetForegroundOpacity(1)   

    resourcesPath = os.path.join(slicer.modules.slicerpathology.path.replace("SlicerPathology.py",""), 'Resources')
    colorFile = os.path.join(resourcesPath, "Colors/SlicerPathology.csv")
    try:
        slicer.modules.EditorWidget.helper.structureListWidget.merge = None
    except AttributeError:
        pass

    allColorTableNodes = slicer.util.getNodes('vtkMRMLColorTableNode*').values()
    for ctn in allColorTableNodes:
        if ctn.GetName() == 'SlicerPathologyColor':
           slicer.mrmlScene.RemoveNode(ctn)
           break

    SlicerPathologyColorNode = slicer.vtkMRMLColorTableNode()
    colorNode = SlicerPathologyColorNode
    colorNode.SetName('SlicerPathologyColor')
    slicer.mrmlScene.AddNode(colorNode)
    colorNode.SetTypeToUser()
    with open(colorFile) as f:
        n = sum(1 for line in f)

    colorNode.SetNumberOfColors(n-1)
    colorNode.NamesInitialisedOn()
    import csv
    structureNames = []
    with open(colorFile, 'rb') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=',')
        for index,row in enumerate(reader):
            success = colorNode.SetColor(index ,row['Label'],float(row['R'])/255,float(row['G'])/255,float(row['B'])/255,float(row['A']))
            if not success:
                print "color %s could not be set" % row['Label']
            structureNames.append(row['Label'])
    volumesLogic = slicer.modules.volumes.logic()
    labelName = bgrdName+'-label'
    refLabel = volumesLogic.CreateAndAddLabelVolume(slicer.mrmlScene,bgrdNode,labelName)
    refLabel.GetDisplayNode().SetAndObserveColorNodeID(SlicerPathologyColorNode.GetID())
    self.editorWidget.helper.setMasterVolume(bgrdNode)
Exemple #21
0
  def __init__(self, inputVolumes, outputVolume):
    """Configure outputVolume and an iterationVolume to match
    the first inputVolume."""

    self.inputVolumes = inputVolumes
    self.outputVolume = outputVolume

    if len(inputVolumes) < 1:
      raise "Must have at least one input volume"
    self.volume0 = inputVolumes[0]
    if not self.volume0.GetImageData():
      raise "Must have a valid input volume with image data"

    # TODO: caller should be required to specify all scratch volumes
    iterationName = '%s-iteration' % self.outputVolume.GetName()
    try:
      self.iterationVolume = slicer.util.getNode(iterationName)
    except slicer.util.MRMLNodeNotFoundException:
      self.iterationVolume = None
    if not self.iterationVolume:
      self.iterationVolume = slicer.vtkMRMLScalarVolumeNode()
      self.iterationVolume.SetName(iterationName)
      slicer.mrmlScene.AddNode(self.iterationVolume)

    rasToIJK = vtk.vtkMatrix4x4()
    self.volume0.GetRASToIJKMatrix(rasToIJK)
    for volume in [self.iterationVolume, self.outputVolume]:
      volume.SetRASToIJKMatrix(rasToIJK)
      volume.SetAndObserveTransformNodeID(self.volume0.GetTransformNodeID())
      image = vtk.vtkImageData()
      image.SetDimensions(self.volume0.GetImageData().GetDimensions())
      image.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 4) # TODO: needs to be RGBA for rendering
      volume.SetAndObserveImageData(image)

    self.header = """
      #version 150

      vec3 transformPoint(const in vec3 samplePoint)
      {
        return samplePoint; // identity
      }
    """

    self.vertexShaderTemplate = """
      #version 150
      in vec3 vertexCoordinate;
      in vec2 textureCoordinate;
      out vec3 interpolatedTextureCoordinate;
      void main()
      {
        interpolatedTextureCoordinate = vec3(textureCoordinate, .5);
        gl_Position = vec4(vertexCoordinate, 1.);
      }
    """

    self.readBackToVolumeNode = False
    self.dummyImage = vtk.vtkImageData()
    self.dummyImage.SetDimensions(5,5,5)
    self.dummyImage.AllocateScalars(vtk.VTK_SHORT, 1)
Exemple #22
0
    def computePreviewLabelmap(self, mergedImage, outputLabelmap):

        import vtkSegmentationCorePython as vtkSegmentationCore
        import vtkSlicerSegmentationsModuleLogicPython as vtkSlicerSegmentationsModuleLogic

        # This can be a long operation - indicate it to the user
        qt.QApplication.setOverrideCursor(qt.Qt.WaitCursor)

        masterVolumeNode = slicer.vtkMRMLScalarVolumeNode()
        slicer.mrmlScene.AddNode(masterVolumeNode)
        slicer.vtkSlicerSegmentationsModuleLogic.CopyOrientedImageDataToVolumeNode(
            self.clippedMasterImageData, masterVolumeNode)

        mergedLabelmapNode = slicer.vtkMRMLLabelMapVolumeNode()
        slicer.mrmlScene.AddNode(mergedLabelmapNode)
        slicer.vtkSlicerSegmentationsModuleLogic.CopyOrientedImageDataToVolumeNode(
            mergedImage, mergedLabelmapNode)

        outputRasToIjk = vtk.vtkMatrix4x4()
        mergedImage.GetImageToWorldMatrix(outputRasToIjk)
        outputExtent = mergedImage.GetExtent()

        # Run segmentation algorithm
        import SimpleITK as sitk
        import sitkUtils
        # Read input data from Slicer into SimpleITK
        labelImage = sitk.ReadImage(
            sitkUtils.GetSlicerITKReadWriteAddress(
                mergedLabelmapNode.GetName()))
        backgroundImage = sitk.ReadImage(
            sitkUtils.GetSlicerITKReadWriteAddress(masterVolumeNode.GetName()))
        # Run watershed filter
        featureImage = sitk.GradientMagnitudeRecursiveGaussian(
            backgroundImage,
            float(self.scriptedEffect.doubleParameter("ObjectScaleMm")))
        del backgroundImage
        f = sitk.MorphologicalWatershedFromMarkersImageFilter()
        f.SetMarkWatershedLine(False)
        f.SetFullyConnected(False)
        labelImage = f.Execute(featureImage, labelImage)
        del featureImage
        # Pixel type of watershed output is the same as the input. Convert it to int16 now.
        if labelImage.GetPixelID() != sitk.sitkInt16:
            labelImage = sitk.Cast(labelImage, sitk.sitkInt16)
        # Write result from SimpleITK to Slicer. This currently performs a deep copy of the bulk data.
        sitk.WriteImage(
            labelImage,
            sitkUtils.GetSlicerITKReadWriteAddress(
                mergedLabelmapNode.GetName()))

        # Update segmentation from labelmap node and remove temporary nodes
        outputLabelmap.ShallowCopy(mergedLabelmapNode.GetImageData())
        outputLabelmap.SetImageToWorldMatrix(outputRasToIjk)
        outputLabelmap.SetExtent(outputExtent)

        slicer.mrmlScene.RemoveNode(masterVolumeNode)
        slicer.mrmlScene.RemoveNode(mergedLabelmapNode)

        qt.QApplication.restoreOverrideCursor()
 def _configure_scene(scene):
     nodes = [slicer.vtkMRMLScalarVolumeNode() for idx in range(4)]
     scene.AddNode(nodes[0]).SetName("Volume1")
     scene.AddNode(nodes[1]).SetName("Volume2")
     scene.AddNode(nodes[2]).SetName("Volume")
     scene.AddNode(nodes[3]).SetName("Volume")
     nodes[0].SetHideFromEditors(1)
     return nodes
 def _configure_scene(scene):
     nodes = [slicer.vtkMRMLScalarVolumeNode() for idx in range(4)]
     scene.AddNode(nodes[0]).SetName("Volume1")
     scene.AddNode(nodes[1]).SetName("Volume2")
     scene.AddNode(nodes[2]).SetName("Volume")
     scene.AddNode(nodes[3]).SetName("Volume")
     nodes[0].SetHideFromEditors(1)
     return nodes
Exemple #25
0
 def readFrame(self, file):
     sNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
     sNode.ResetFileNameList()
     sNode.SetFileName(file)
     sNode.SetSingleFile(0)
     frame = slicer.vtkMRMLScalarVolumeNode()
     success = sNode.ReadData(frame)
     return (success, frame)
  def onApply(self):

    # Get list of visible segment IDs, as the effect ignores hidden segments.
    segmentationNode = self.scriptedEffect.parameterSetNode().GetSegmentationNode()
    visibleSegmentIds = vtk.vtkStringArray()
    segmentationNode.GetDisplayNode().GetVisibleSegmentIDs(visibleSegmentIds)
    if visibleSegmentIds.GetNumberOfValues() == 0:
      logging.info("Smoothing operation skipped: there are no visible segments")
      return

    # This can be a long operation - indicate it to the user
    qt.QApplication.setOverrideCursor(qt.Qt.WaitCursor)

    # Allow users revert to this state by clicking Undo
    self.scriptedEffect.saveStateForUndo()

    # Export master image data to temporary new volume node.
    # Note: Although the original master volume node is already in the scene, we do not use it here,
    # because the master volume may have been resampled to match segmentation geometry.
    import vtkSegmentationCorePython as vtkSegmentationCore
    masterVolumeNode = slicer.vtkMRMLScalarVolumeNode()
    slicer.mrmlScene.AddNode(masterVolumeNode)
    masterVolumeNode.SetAndObserveTransformNodeID(segmentationNode.GetTransformNodeID())
    slicer.vtkSlicerSegmentationsModuleLogic.CopyOrientedImageDataToVolumeNode(self.scriptedEffect.masterVolumeImageData(), masterVolumeNode)
    # Generate merged labelmap of all visible segments, as the filter expects a single labelmap with all the labels.
    mergedLabelmapNode = slicer.vtkMRMLLabelMapVolumeNode()
    slicer.mrmlScene.AddNode(mergedLabelmapNode)
    slicer.vtkSlicerSegmentationsModuleLogic.ExportSegmentsToLabelmapNode(segmentationNode, visibleSegmentIds, mergedLabelmapNode, masterVolumeNode)

    # Run segmentation algorithm
    import SimpleITK as sitk
    import sitkUtils
    # Read input data from Slicer into SimpleITK
    labelImage = sitk.ReadImage(sitkUtils.GetSlicerITKReadWriteAddress(mergedLabelmapNode.GetName()))
    backgroundImage = sitk.ReadImage(sitkUtils.GetSlicerITKReadWriteAddress(masterVolumeNode.GetName()))
    # Run watershed filter
    featureImage = sitk.GradientMagnitudeRecursiveGaussian(backgroundImage, float(self.scriptedEffect.doubleParameter("ObjectScaleMm")))
    del backgroundImage
    f = sitk.MorphologicalWatershedFromMarkersImageFilter()
    f.SetMarkWatershedLine(False)
    f.SetFullyConnected(False)
    labelImage = f.Execute(featureImage, labelImage)
    del featureImage
    # Pixel type of watershed output is the same as the input. Convert it to int16 now.
    if labelImage.GetPixelID() != sitk.sitkInt16:
      labelImage = sitk.Cast(labelImage, sitk.sitkInt16)
    # Write result from SimpleITK to Slicer. This currently performs a deep copy of the bulk data.
    sitk.WriteImage(labelImage, sitkUtils.GetSlicerITKReadWriteAddress(mergedLabelmapNode.GetName()))
    mergedLabelmapNode.GetImageData().Modified()
    mergedLabelmapNode.Modified()

    # Update segmentation from labelmap node and remove temporary nodes
    slicer.vtkSlicerSegmentationsModuleLogic.ImportLabelmapToSegmentationNode(mergedLabelmapNode, segmentationNode, visibleSegmentIds)
    slicer.mrmlScene.RemoveNode(masterVolumeNode)
    slicer.mrmlScene.RemoveNode(mergedLabelmapNode)

    qt.QApplication.restoreOverrideCursor()
  def onApply(self):

    # Get list of visible segment IDs, as the effect ignores hidden segments.
    segmentationNode = self.scriptedEffect.parameterSetNode().GetSegmentationNode()
    visibleSegmentIds = vtk.vtkStringArray()
    segmentationNode.GetDisplayNode().GetVisibleSegmentIDs(visibleSegmentIds)
    if visibleSegmentIds.GetNumberOfValues() == 0:
      logging.info("Smoothing operation skipped: there are no visible segments")
      return

    # This can be a long operation - indicate it to the user
    qt.QApplication.setOverrideCursor(qt.Qt.WaitCursor)

    # Allow users revert to this state by clicking Undo
    self.scriptedEffect.saveStateForUndo()

    # Export master image data to temporary new volume node.
    # Note: Although the original master volume node is already in the scene, we do not use it here,
    # because the master volume may have been resampled to match segmentation geometry.
    import vtkSegmentationCorePython as vtkSegmentationCore
    masterVolumeNode = slicer.vtkMRMLScalarVolumeNode()
    slicer.mrmlScene.AddNode(masterVolumeNode)
    masterVolumeNode.SetAndObserveTransformNodeID(segmentationNode.GetTransformNodeID())
    slicer.vtkSlicerSegmentationsModuleLogic.CopyOrientedImageDataToVolumeNode(self.scriptedEffect.masterVolumeImageData(), masterVolumeNode)
    # Generate merged labelmap of all visible segments, as the filter expects a single labelmap with all the labels.
    mergedLabelmapNode = slicer.vtkMRMLLabelMapVolumeNode()
    slicer.mrmlScene.AddNode(mergedLabelmapNode)
    slicer.vtkSlicerSegmentationsModuleLogic.ExportSegmentsToLabelmapNode(segmentationNode, visibleSegmentIds, mergedLabelmapNode, masterVolumeNode)

    # Run segmentation algorithm
    import SimpleITK as sitk
    import sitkUtils
    # Read input data from Slicer into SimpleITK
    labelImage = sitk.ReadImage(sitkUtils.GetSlicerITKReadWriteAddress(mergedLabelmapNode.GetName()))
    backgroundImage = sitk.ReadImage(sitkUtils.GetSlicerITKReadWriteAddress(masterVolumeNode.GetName()))
    # Run watershed filter
    featureImage = sitk.GradientMagnitudeRecursiveGaussian(backgroundImage, float(self.scriptedEffect.doubleParameter("ObjectScaleMm")))
    del backgroundImage
    f = sitk.MorphologicalWatershedFromMarkersImageFilter()
    f.SetMarkWatershedLine(False)
    f.SetFullyConnected(False)
    labelImage = f.Execute(featureImage, labelImage)
    del featureImage
    # Pixel type of watershed output is the same as the input. Convert it to int16 now.
    if labelImage.GetPixelID() != sitk.sitkInt16:
      labelImage = sitk.Cast(labelImage, sitk.sitkInt16)
    # Write result from SimpleITK to Slicer. This currently performs a deep copy of the bulk data.
    sitk.WriteImage(labelImage, sitkUtils.GetSlicerITKReadWriteAddress(mergedLabelmapNode.GetName()))
    mergedLabelmapNode.GetImageData().Modified()
    mergedLabelmapNode.Modified()

    # Update segmentation from labelmap node and remove temporary nodes
    slicer.vtkSlicerSegmentationsModuleLogic.ImportLabelmapToSegmentationNode(mergedLabelmapNode, segmentationNode, visibleSegmentIds)
    slicer.mrmlScene.RemoveNode(masterVolumeNode)
    slicer.mrmlScene.RemoveNode(mergedLabelmapNode)

    qt.QApplication.restoreOverrideCursor()
Exemple #28
0
  def __init__(self, inputVolumes, outputVolume):
    """Configure outputVolume and an iterationVolume to match
    the first inputVolume."""

    self.inputVolumes = inputVolumes
    self.outputVolume = outputVolume

    if len(inputVolumes) < 1:
      raise "Must have at least one input volume"
    self.volume0 = inputVolumes[0]
    if not self.volume0.GetImageData():
      raise "Must have a valid input volume with image data"

    # TODO: caller should be required to specify all scratch volumes
    iterationName = '%s-iteration' % self.outputVolume.GetName()
    self.iterationVolume = slicer.util.getNode(iterationName)
    if not self.iterationVolume:
      self.iterationVolume = slicer.vtkMRMLScalarVolumeNode()
      self.iterationVolume.SetName(iterationName)
      slicer.mrmlScene.AddNode(self.iterationVolume)

    rasToIJK = vtk.vtkMatrix4x4()
    self.volume0.GetRASToIJKMatrix(rasToIJK)
    for volume in [self.iterationVolume, self.outputVolume]:
      volume.SetRASToIJKMatrix(rasToIJK)
      volume.SetAndObserveTransformNodeID(self.volume0.GetTransformNodeID())
      image = vtk.vtkImageData()
      image.SetDimensions(self.volume0.GetImageData().GetDimensions())
      image.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 4) # TODO: needs to be RGBA for rendering
      volume.SetAndObserveImageData(image)

    self.header = """
      #version 120

      vec3 transformPoint(const in vec3 samplePoint)
      {
        return samplePoint; // identity
      }
    """

    self.vertexShaderTemplate = """
      #version 120
      attribute vec3 vertexAttribute;
      attribute vec2 textureCoordinateAttribute;
      varying vec3 interpolatedTextureCoordinate;
      void main()
      {
        interpolatedTextureCoordinate = vec3(textureCoordinateAttribute, .5);
        gl_Position = vec4(vertexAttribute, 1.);
      }
    """

    self.readBackToVolumeNode = False
    self.dummyImage = vtk.vtkImageData()
    self.dummyImage.SetDimensions(5,5,5)
    self.dummyImage.AllocateScalars(vtk.VTK_SHORT, 1)
Exemple #29
0
    def onApplyButton(self):
        print("Transducer parameters >> /n")
        print("ROC:" + str(self.ROC.value))
        print("Width:" + str(self.width.value))
        print("ROC:" + str(self.freq.value))

        skull, skull_actor = hlp.read_skull_vtk(
            "/Users/home/Desktop/Simulation/Simulation/SMA_matlab_skull_transform0.vtk",
            0.5, [0.8, 0.8, 0.8])

        model = slicer.vtkMRMLModelNode()
        model.SetAndObservePolyData(skull)

        ## set model node properties
        modelDisplay = slicer.vtkMRMLModelDisplayNode()
        modelDisplay.SetColor(0.8, 0.8, 0.8)
        modelDisplay.BackfaceCullingOff()
        modelDisplay.SetOpacity(0.5)
        modelDisplay.SetPointSize(3)

        ## mode node display
        modelDisplay.SetSliceIntersectionVisibility(True)
        modelDisplay.SetVisibility(True)
        slicer.mrmlScene.AddNode(modelDisplay)
        model.SetAndObserveDisplayNodeID(modelDisplay.GetID())
        modelDisplay.SetInputPolyDataConnection(model.GetPolyDataConnection())

        ## model node set name
        slicer.mrmlScene.AddNode(model).SetName("Skull")

        ## read vtk object convert to vtkimage
        result_image = hlp.vtk_grid2image(
            "/Users/home/Desktop/Simulation/Simulation/SMA_full_0.vtk")
        result_volume = slicer.vtkMRMLScalarVolumeNode()
        result_volume.SetAndObserveImageData(result_image)

        ## image to 2D scene
        defaultVolumeDisplayNode = slicer.mrmlScene.CreateNodeByClass(
            "vtkMRMLScalarVolumeDisplayNode")
        defaultVolumeDisplayNode.AutoWindowLevelOn()
        defaultVolumeDisplayNode.SetVisibility(True)
        defaultVolumeDisplayNode.AddWindowLevelPresetFromString(
            "ColdToHotRainbow")
        slicer.mrmlScene.AddDefaultNode(defaultVolumeDisplayNode)
        result_volume.SetAndObserveDisplayNodeID(
            defaultVolumeDisplayNode.GetID())
        defaultVolumeDisplayNode.SetInputImageDataConnection(
            result_volume.GetImageDataConnection())

        ## volume node set name
        slicer.mrmlScene.AddNode(result_volume).SetName("simulation_result")

        ## volume rendering
        hlp.showVolumeRendering(result_volume)
        slicer.mrmlScene.AddObserver(slicer.vtkMRMLScene.NodeAddedEvent,
                                     hlp.onNodeAdded)
Exemple #30
0
  def applyOtsuFilter(volume):
    outputVolume = slicer.vtkMRMLScalarVolumeNode()
    outputVolume.SetName('ZFrame_Otsu_Output')
    slicer.mrmlScene.AddNode(outputVolume)
    params = {'inputVolume': volume.GetID(),
              'outputVolume': outputVolume.GetID(),
              'insideValue': 0, 'outsideValue': 1}

    slicer.cli.run(slicer.modules.otsuthresholdimagefilter, None, params, wait_for_completion=True)
    return outputVolume
Exemple #31
0
    def generateZScore(self, inputVolumeNode, listFeatures,
                       thicknessVolumeNode, listZFeatures):
        print("Doing features step:")
        print("Registration:")
        # Load feature templates

        # To hold transform
        regMNItoRefTransform = slicer.vtkMRMLBSplineTransformNode()
        slicer.mrmlScene.AddNode(regMNItoRefTransform)

        print("Registering flair image...")
        outputFlair = slicer.vtkMRMLScalarVolumeNode()
        slicer.mrmlScene.AddNode(outputFlair)
        self.registerAndExtractZ(inputVolumeNode, outputFlair, "flair",
                                 regMNItoRefTransform, True)

        for featureNode in listFeatures:
            print("Registering " + featureNode[0] + "...")

            output = slicer.vtkMRMLScalarVolumeNode()
            slicer.mrmlScene.AddNode(output)
            self.registerAndExtractZ(featureNode[1], output, featureNode[0],
                                     regMNItoRefTransform, False)

            # Add to vectorFeatureNodes
            # vectorFeatureNodes.append(output)
            listZFeatures.append((featureNode[0] + "_z", output))

        # vectorFeatureNodes.append(inputVolumeNode)
        # vectorFeatureNodes.append(outputFlair)
        listFeatures.append(("flair", inputVolumeNode))
        listZFeatures.append(("flair_z", outputFlair))

        if thicknessVolumeNode is not None:
            print("Processing thickness...")
            outputThick = slicer.vtkMRMLScalarVolumeNode()
            slicer.mrmlScene.AddNode(outputThick)
            self.registerAndExtractZ(thicknessVolumeNode, outputThick,
                                     "thickness", regMNItoRefTransform, False)

            listFeatures.append(("thickness", thicknessVolumeNode))
            listZFeatures.append(("thickness_z", outputThick))
Exemple #32
0
  def test_GLFilters1(self):
    """Test a multi-input filter"""
    import ShaderComputation
    nodes = ShaderComputation.ShaderComputationTest().amigoMRUSPreIntraData()

    outputNode = slicer.vtkMRMLScalarVolumeNode()
    outputNode.SetName('output')
    slicer.mrmlScene.AddNode(outputNode)

    logic = GLFiltersLogic()
    logic.run(nodes[0], outputNode, 1)
Exemple #33
0
  def applyBiasCorrection(self):
    outputVolume = slicer.vtkMRMLScalarVolumeNode()
    outputVolume.SetName('VOLUME-PREOP-N4')
    slicer.mrmlScene.AddNode(outputVolume)
    params = {'inputImageName': self.session.data.initialVolume.GetID(),
              'maskImageName': self.session.data.initialLabel.GetID(),
              'outputImageName': outputVolume.GetID(),
              'numberOfIterations': '500,400,300'}

    slicer.cli.run(slicer.modules.n4itkbiasfieldcorrection, None, params, wait_for_completion=True)
    self.session.data.initialVolume = outputVolume
    self.session.data.preopData.usedERC = True
Exemple #34
0
 def createDummyVolume(self):
   imageData = vtk.vtkImageData()
   imageData.SetDimensions(10,10,10)
   imageData.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 1)
   volumeNode = slicer.vtkMRMLScalarVolumeNode()
   volumeNode.SetAndObserveImageData(imageData)
   displayNode = slicer.vtkMRMLScalarVolumeDisplayNode()
   slicer.mrmlScene.AddNode(volumeNode)
   slicer.mrmlScene.AddNode(displayNode)
   volumeNode.SetAndObserveDisplayNodeID(displayNode.GetID())
   displayNode.SetAndObserveColorNodeID('vtkMRMLColorTableNodeGrey')
   return volumeNode
  def registerVolumesElastix(self,fixedVolumeNode, movingVolumeNode, outputTransform,
    fixedVolumeMask, movingVolumeMask):

    outputVolume = slicer.vtkMRMLScalarVolumeNode()
    slicer.mrmlScene.AddNode(outputVolume)
    outputVolume.CreateDefaultDisplayNodes()

    logic = slicer.modules.elastix.logic()
    parameterFilenames = logic.getRegistrationPresets()[0][RegistrationPresets_ParameterFilenames]

    logic.registerVolumes(fixedVolumeNode, movingVolumeNode, parameterFilenames=parameterFilenames, outputVolumeNode=outputVolume,
                          outputTransformNode = outputTransform, fixedVolumeMaskNode = fixedVolumeMask, movingVolumeMaskNode = movingVolumeMask)

    self.delayDisplay('Volumes Registered!')
Exemple #36
0
    def onGradientInNewVolBtnClicked(self):
        # Result is not right!
        volumeNode = slicer.util.getNode("MRHead")
        ijkToRas = vtk.vtkMatrix4x4()
        volumeNode.GetIJKToRASMatrix(ijkToRas)
        imageData = volumeNode.GetImageData()
        extent = imageData.GetExtent()

        imageSize = imageData.GetDimensions()
        imageSpacing = imageData.GetSpacing()
        voxelType = vtk.VTK_FLOAT

        # Create empty image volume
        imageData_2 = vtk.vtkImageData()
        imageData_2.SetDimensions(imageSize[0] / 2, imageSize[1] / 2, imageSize[2] / 2)
        imageData_2.SetSpacing(imageSpacing)
        imageData_2.AllocateScalars(voxelType, 0)

        thresholder = vtk.vtkImageThreshold()
        thresholder.SetInputData(imageData_2)
        thresholder.SetInValue(0)
        thresholder.SetOutValue(0)

        volumeNode_2 = slicer.vtkMRMLScalarVolumeNode()
        volumeNode_2.SetSpacing(imageSpacing)
        volumeNode_2.SetImageDataConnection(thresholder.GetOutputPort())

        # Add volume to scene
        scene = slicer.mrmlScene
        scene.AddNode(volumeNode_2)
        displayNode = slicer.vtkMRMLScalarVolumeDisplayNode()
        scene.AddNode(displayNode)
        colorNode = slicer.util.getNode("Grey")
        displayNode.SetAndObserveColorNodeID(colorNode.GetID())
        volumeNode_2.SetAndObserveDisplayNodeID(displayNode.GetID())
        volumeNode_2.CreateDefaultStorageNode()

        # npData = slicer.util.array('MRHead')
        impVol = vtk.vtkImplicitVolume()
        impVol.SetVolume(imageData)

        for k in xrange(extent[4], extent[5] / 2 + 1):
            for j in xrange(extent[2], extent[3] / 2 + 1):
                for i in xrange(extent[0], extent[1] / 2 + 1):
                    g = impVol.FunctionGradient(i, j, k)
                    gradient = math.sqrt(g[0] ** 2 + g[1] ** 2 + g[2] ** 2)
                    imageData_2.SetScalarComponentFromFloat(i, j, k, 0, gradient)

        imageData_2.Modified()
 def createMaskedVolume(inputVolume, labelVolume, outputVolumeName=None):
     maskedVolume = slicer.vtkMRMLScalarVolumeNode()
     if outputVolumeName:
         maskedVolume.SetName(outputVolumeName)
     slicer.mrmlScene.AddNode(maskedVolume)
     params = {
         'InputVolume': inputVolume,
         'MaskVolume': labelVolume,
         'OutputVolume': maskedVolume
     }
     slicer.cli.run(slicer.modules.maskscalarvolume,
                    None,
                    params,
                    wait_for_completion=True)
     return maskedVolume
    def AddVolumeNode(self):
        # Create empty volume node
        volumeNode = slicer.mrmlScene.GetNthNodeByClass(1, 'vtkMRMLScalarVolumeNode')
        if volumeNode == None:
            volumeNode = slicer.vtkMRMLScalarVolumeNode()
            slicer.mrmlScene.AddNode(volumeNode)

        displayNode = slicer.mrmlScene.GetNthNodeByClass(1,'vtkMRMLScalarVolumeDisplayNode')
        if displayNode == None:
            displayNode = slicer.vtkMRMLScalarVolumeDisplayNode()
        colorNode = slicer.util.getNode('Grey')
        displayNode.SetAndObserveColorNodeID(colorNode.GetID())
        volumeNode.SetAndObserveDisplayNodeID(displayNode.GetID())
        volumeNode.CreateDefaultStorageNode()
        volumeNode.SetName("Volume Node")
def applyBiasCorrection(volume, label):
    outputVolume = slicer.vtkMRMLScalarVolumeNode()
    outputVolume.SetName('{}-N4'.format(volume.GetName()))
    slicer.mrmlScene.AddNode(outputVolume)
    params = {
        'inputImageName': volume.GetID(),
        'maskImageName': label.GetID(),
        'outputImageName': outputVolume.GetID(),
        'numberOfIterations': '500,400,300'
    }

    slicer.cli.run(slicer.modules.n4itkbiasfieldcorrection,
                   None,
                   params,
                   wait_for_completion=True)
    return outputVolume
    def applyOtsuFilter(volume):
        outputVolume = slicer.vtkMRMLScalarVolumeNode()
        outputVolume.SetName('ZFrame_Otsu_Output')
        slicer.mrmlScene.AddNode(outputVolume)
        params = {
            'inputVolume': volume.GetID(),
            'outputVolume': outputVolume.GetID(),
            'insideValue': 0,
            'outsideValue': 1
        }

        slicer.cli.run(slicer.modules.otsuthresholdimagefilter,
                       None,
                       params,
                       wait_for_completion=True)
        return outputVolume
Exemple #41
0
  def test_BRAINSFitRigidRegistrationCrashIssue4139(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 the test")

    logic = BRAINSFitRigidRegistrationCrashIssue4139Logic()

    import SampleData
    from SampleData import SampleDataLogic
    sampleDatalogic = SampleDataLogic()

    fixed = sampleDatalogic.downloadMRBrainTumor1()
    self.assertIsNotNone(logic.hasImageData(fixed))

    moving = sampleDatalogic.downloadMRBrainTumor2()
    self.assertIsNotNone(logic.hasImageData(moving))

    self.delayDisplay('Finished with download and loading')

    outputTransform = slicer.vtkMRMLLinearTransformNode()
    slicer.mrmlScene.AddNode(outputTransform)

    outputVolume = slicer.vtkMRMLScalarVolumeNode()
    slicer.mrmlScene.AddNode(outputVolume)

    parameters = {
      'fixedVolume' : fixed,
      'movingVolume' : moving,
      'linearTransform' : outputTransform,
      'outputVolume' : outputVolume,
      'useRigid' : True
    }
    cmdLineNode = slicer.cli.runSync(slicer.modules.brainsfit, parameters=parameters)
    self.assertIsNotNone(cmdLineNode)

    # If test reach this point without crashing it is a success

    self.delayDisplay('Test passed!')
Exemple #42
0
    def onNewVolBtnClicked(self):
        imageSize = [128] * 3
        imageSpacing = [1.0] * 3
        voxelType = vtk.VTK_UNSIGNED_CHAR

        # Create an empty image volume
        imageData = vtk.vtkImageData()
        imageData.SetDimensions(imageSize)
        imageData.AllocateScalars(voxelType, 64)

        thresholder = vtk.vtkImageThreshold()
        thresholder.SetInputData(imageData)
        thresholder.SetInValue(0)
        thresholder.SetOutValue(0)

        # Create volume node
        volumeNode = slicer.vtkMRMLScalarVolumeNode()
        volumeNode.SetSpacing(imageSpacing)
        volumeNode.SetImageDataConnection(thresholder.GetOutputPort())

        # Add volume to scene
        scene = slicer.mrmlScene
        scene.AddNode(volumeNode)
        displayNode = slicer.vtkMRMLScalarVolumeDisplayNode()
        scene.AddNode(displayNode)
        colorNode = slicer.util.getNode("Grey")
        displayNode.SetAndObserveColorNodeID(colorNode.GetID())
        volumeNode.SetAndObserveDisplayNodeID(displayNode.GetID())
        volumeNode.CreateDefaultStorageNode()

        # Show the new volume in the Slice view
        applicationLogic = slicer.app.applicationLogic()
        selectionNode = applicationLogic.GetSelectionNode()
        selectionNode.SetSecondaryVolumeID(volumeNode.GetID())
        applicationLogic.PropagateForegroundVolumeSelection(0)

        # Center the 3D View on the scene
        # It works only after showing the 3D scene
        layoutManager = slicer.app.layoutManager()
        threeDWidget = layoutManager.threeDWidget(0)
        threeDView = threeDWidget.threeDView()
        threeDView.resetFocalPoint()
 def loademup(self):
   self.dirty=True
   import EditorLib
   editUtil = EditorLib.EditUtil.EditUtil()
   imsainode = editUtil.getBackgroundVolume()
   imsai = imsainode.GetImageData()
   if imsai.GetNumberOfScalarComponents() > 3:
     lala = self.Four2ThreeChannel(imsai)
     print lala.GetNumberOfScalarComponents()
     imsainode.SetAndObserveImageData(lala)
     imsainode.Modified()
   red_logic = slicer.app.layoutManager().sliceWidget("Red").sliceLogic()
   red_cn = red_logic.GetSliceCompositeNode()
   fgrdVolID = red_cn.GetBackgroundVolumeID()
   fgrdNode = slicer.util.getNode(fgrdVolID)
   fMat=vtk.vtkMatrix4x4()
   fgrdNode.GetIJKToRASDirectionMatrix(fMat)
   bgrdName = fgrdNode.GetName() + '_gray'
   self.tilename = fgrdNode.GetName() + '_gray'
   self.parameterNode.SetParameter("SlicerPathology,tilename", self.tilename)
   # Create dummy grayscale image
   magnitude = vtk.vtkImageMagnitude()
   magnitude.SetInputData(fgrdNode.GetImageData())
   magnitude.Update()  
   bgrdNode = slicer.vtkMRMLScalarVolumeNode()
   bgrdNode.SetImageDataConnection(magnitude.GetOutputPort())
   bgrdNode.SetName(bgrdName)
   bgrdNode.SetIJKToRASDirectionMatrix(fMat)
   slicer.mrmlScene.AddNode(bgrdNode)
   bgrdVolID = bgrdNode.GetID()  
   red_cn.SetForegroundVolumeID(fgrdVolID)
   red_cn.SetBackgroundVolumeID(bgrdVolID)
   red_cn.SetForegroundOpacity(1)   
   self.checkAndSetLUT() 
   cv = slicer.util.getNode(bgrdName)
   self.volumesLogic = slicer.modules.volumes.logic()
   labelName = bgrdName+'-label'
   refLabel = self.volumesLogic.CreateAndAddLabelVolume(slicer.mrmlScene,cv,labelName)
   refLabel.GetDisplayNode().SetAndObserveColorNodeID(self.SlicerPathologyColorNode.GetID())
   self.editorWidget.helper.setMasterVolume(cv)
 def setUp(self):
     slicer.mrmlScene.AddNode(slicer.vtkMRMLScalarVolumeNode()).SetName("Volume1")
     slicer.mrmlScene.AddNode(slicer.vtkMRMLScalarVolumeNode()).SetName("Volume2")
Exemple #45
0
 def createScalarVolumeNode(name):
   volume = slicer.vtkMRMLScalarVolumeNode()
   volume.SetName(name)
   slicer.mrmlScene.AddNode(volume)
   return volume
Exemple #46
0
  def load(self,loadable):
    """Load the selection as a MultiVolume, if multivolume attribute is
    present
    """

    mvNode = ''
    try:
      mvNode = loadable.multivolume
    except AttributeError:
      return None

    nFrames = int(mvNode.GetAttribute('MultiVolume.NumberOfFrames'))
    files = string.split(mvNode.GetAttribute('MultiVolume.FrameFileList'),',')
    nFiles = len(files)
    filesPerFrame = nFiles/nFrames
    frames = []

    mvImage = vtk.vtkImageData()
    mvImageArray = None

    scalarVolumePlugin = slicer.modules.dicomPlugins['DICOMScalarVolumePlugin']()
    instanceUIDs = ""
    for file in files:
      uid = slicer.dicomDatabase.fileValue(file,self.tags['instanceUID'])
      if uid == "":
        uid = "Unknown"
      instanceUIDs += uid+" "
    instanceUIDs = instanceUIDs[:-1]
    mvNode.SetAttribute("DICOM.instanceUIDs", instanceUIDs)

    # read each frame into scalar volume
    for frameNumber in range(nFrames):

      sNode = slicer.vtkMRMLVolumeArchetypeStorageNode()
      sNode.ResetFileNameList();

      frameFileList = files[frameNumber*filesPerFrame:(frameNumber+1)*filesPerFrame]
      # sv plugin will sort the filenames by geometric order
      svLoadables = scalarVolumePlugin.examine([frameFileList])

      if len(svLoadables) == 0:
        return None
      for f in svLoadables[0].files:
        sNode.AddFileName(f)

      sNode.SetFileName(frameFileList[0]) # only used when num files/frame = 1
      sNode.SetSingleFile(0)
      frame = slicer.vtkMRMLScalarVolumeNode()
      sNode.ReadData(frame)

      if frame.GetImageData() == None:
        logging.error('Failed to read a multivolume frame!')
        return None

      if frameNumber == 0:
        frameImage = frame.GetImageData()
        frameExtent = frameImage.GetExtent()
        frameSize = frameExtent[1]*frameExtent[3]*frameExtent[5]

        mvImage.SetExtent(frameExtent)
        if vtk.VTK_MAJOR_VERSION <= 5:
          mvImage.SetNumberOfScalarComponents(nFrames)
          mvImage.SetScalarType(frame.GetImageData().GetScalarType())
          mvImage.AllocateScalars()
        else:
          mvImage.AllocateScalars(frame.GetImageData().GetScalarType(), nFrames)

        mvImageArray = vtk.util.numpy_support.vtk_to_numpy(mvImage.GetPointData().GetScalars())

        mvNode.SetScene(slicer.mrmlScene)

        mat = vtk.vtkMatrix4x4()
        frame.GetRASToIJKMatrix(mat)
        mvNode.SetRASToIJKMatrix(mat)
        frame.GetIJKToRASMatrix(mat)
        mvNode.SetIJKToRASMatrix(mat)

      frameImage = frame.GetImageData()
      frameImageArray = vtk.util.numpy_support.vtk_to_numpy(frameImage.GetPointData().GetScalars())

      mvImageArray.T[frameNumber] = frameImageArray

    mvDisplayNode = slicer.mrmlScene.CreateNodeByClass('vtkMRMLMultiVolumeDisplayNode')
    mvDisplayNode.SetReferenceCount(mvDisplayNode.GetReferenceCount()-1)
    mvDisplayNode.SetScene(slicer.mrmlScene)
    mvDisplayNode.SetDefaultColorMap()
    slicer.mrmlScene.AddNode(mvDisplayNode)

    mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID())
    mvNode.SetAndObserveImageData(mvImage)
    mvNode.SetNumberOfFrames(nFrames)
    mvNode.SetName(loadable.name)
    slicer.mrmlScene.AddNode(mvNode)

    #
    # automatically select the volume to display
    #
    appLogic = slicer.app.applicationLogic()
    selNode = appLogic.GetSelectionNode()
    selNode.SetReferenceActiveVolumeID(mvNode.GetID())
    appLogic.PropagateVolumeSelection()

    # file list is no longer needed - remove the attribute
    mvNode.RemoveAttribute('MultiVolume.FrameFileList')

    return mvNode
  def TestSection_1_RunPlastimatchProtonDoseEngine(self):
    logging.info('Test section 1: Run Plastimatch proton dose engine')

    engineLogic = slicer.qSlicerDoseEngineLogic()
    engineLogic.setMRMLScene(slicer.mrmlScene)

    # Get input
    ctVolumeNode = slicer.util.getNode('TinyPatient_CT')
    segmentationNode = slicer.util.getNode('TinyPatient_Structures')
    self.assertIsNotNone(ctVolumeNode)
    self.assertIsNotNone(segmentationNode)
    
    # Create node for output dose
    totalDoseVolumeNode = slicer.vtkMRMLScalarVolumeNode()
    totalDoseVolumeNode.SetName('TotalDose')
    slicer.mrmlScene.AddNode(totalDoseVolumeNode)
    
    # Setup plan
    planNode = slicer.vtkMRMLRTPlanNode()
    planNode.SetName('TestProtonPlan')
    slicer.mrmlScene.AddNode(planNode)
    
    planNode.SetAndObserveReferenceVolumeNode(ctVolumeNode);
    planNode.SetAndObserveSegmentationNode(segmentationNode);
    planNode.SetAndObserveOutputTotalDoseVolumeNode(totalDoseVolumeNode);
    planNode.SetTargetSegmentID("Tumor_Contour");
    planNode.SetIsocenterToTargetCenter();
    planNode.SetDoseEngineName("Plastimatch proton")

    # Add first beam
    firstBeamNode = engineLogic.createBeamInPlan(planNode)
    firstBeamNode.SetX1Jaw(-50.0)
    firstBeamNode.SetX2Jaw(50.0)
    firstBeamNode.SetY1Jaw(-50.0)
    firstBeamNode.SetY2Jaw(75.0)

    #TODO: For some reason the instance() function cannot be called as a class function although it's static
    engineHandler = slicer.qSlicerDoseEnginePluginHandler()
    engineHandlerSingleton = engineHandler.instance()
    plastimatchProtonEngine = engineHandlerSingleton.doseEngineByName('Plastimatch proton')
    plastimatchProtonEngine.setParameter(firstBeamNode, 'EnergyResolution', 4.0)
    plastimatchProtonEngine.setParameter(firstBeamNode, 'RangeCompensatorSmearingRadius', 0.0)
    plastimatchProtonEngine.setParameter(firstBeamNode, 'ProximalMargin', 0.0)
    plastimatchProtonEngine.setParameter(firstBeamNode, 'DistalMargin', 0.0)
    
    # Calculate dose
    import time
    startTime = time.time()
    
    errorMessage = engineLogic.calculateDose(planNode)
    self.assertNotEqual(errorMessage, "")
    
    calculationTime = time.time() - startTime
    logging.info('Dose computation time: ' + str(calculationTime) + ' s')
    
    # Check computed output
    imageAccumulate = vtk.vtkImageAccumulate()
    imageAccumulate.SetInputConnection(totalDoseVolumeNode.GetImageDataConnection())
    imageAccumulate.Update()

    doseMax = imageAccumulate.GetMax()[0]
    doseMean = imageAccumulate.GetMean()[0]
    doseStdDev = imageAccumulate.GetStandardDeviation()[0]
    doseVoxelCount = imageAccumulate.GetVoxelCount()
    logging.info("Dose volume properties:\n  Max=" + str(doseMax) + ", Mean=" + str(doseMean) + ", StdDev=" + str(doseStdDev) + ", NumberOfVoxels=" + str(doseVoxelCount))

    self.assertTrue(self.isEqualWithTolerance(doseMax, 1.05797))
    self.assertTrue(self.isEqualWithTolerance(doseMean, 0.0251127))
    self.assertTrue(self.isEqualWithTolerance(doseStdDev, 0.144932))
    self.assertTrue(self.isEqualWithTolerance(doseVoxelCount, 1000))