Пример #1
0
    def populateStats(self):
        if not self.logic:
            return
        displayNode = self.labelNode.GetDisplayNode()
        colorNode = displayNode.GetColorNode()
        lut = colorNode.GetLookupTable()
        self.items = []
        self.model = qt.QStandardItemModel()
        self.view.setModel(self.model)
        self.view.verticalHeader().visible = False
        row = 0
        for i in self.logic.labelStats["Labels"]:
            color = qt.QColor()
            rgb = lut.GetTableValue(i)
            color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255)
            item = qt.QStandardItem()
            item.setData(color, qt.Qt.DecorationRole)
            item.setToolTip(colorNode.GetColorName(i))
            self.model.setItem(row, 0, item)
            self.items.append(item)
            col = 1
            for k in self.logic.keys:
                item = qt.QStandardItem()
                # set data as float with Qt::DisplayRole
                item.setData(float(self.logic.labelStats[i, k]),
                             qt.Qt.DisplayRole)
                item.setToolTip(colorNode.GetColorName(i))
                self.model.setItem(row, col, item)
                self.items.append(item)
                col += 1
            row += 1

        self.view.setColumnWidth(0, 30)
        self.model.setHeaderData(0, 1, " ")
        col = 1
        for k in self.logic.keys:
            self.view.setColumnWidth(col, 15 * len(k))
            self.model.setHeaderData(col, 1, k)
            col += 1
Пример #2
0
    def populateStats(self):
        if not self.logic:
            return
        #displayNode = self.labelNode.GetNthDataNode(0).GetDisplayNode()
        #colorNode = displayNode.GetColorNode()
        #lut = colorNode.GetLookupTable()
        self.items = []
        self.model = qt.QStandardItemModel()
        self.view.setModel(self.model)
        self.view.verticalHeader().visible = False
        row = 0
        for i in self.logic.labelStats["Labels"]:
            color = qt.QColor()
            # rgb = lut.GetTableValue(i)
            color.setRgb(255, 0, 0)
            item = qt.QStandardItem()
            item.setData(color, 1)
            # item.setToolTip(colorNode.GetColorName(i))
            self.model.setItem(row, 0, item)
            self.items.append(item)
            col = 1
            for k in self.logic.keys:
                item = qt.QStandardItem()
                item.setText(str(self.logic.labelStats[i, k]))
                # item.setToolTip(colorNode.GetColorName(i))
                self.model.setItem(row, col, item)
                self.items.append(item)
                col += 1
            row += 1

        self.view.setColumnWidth(0, 30)
        self.model.setHeaderData(0, 1, " ")
        col = 1
        for k in self.logic.keys:
            self.view.setColumnWidth(col, 15 * len(k))
            self.model.setHeaderData(col, 1, k)
            col += 1
Пример #3
0
 def populateStatistics(self, FeatureVectors):
   if not (FeatureVectors):
     return
     
   self.items = []
   self.model = qt.QStandardItemModel()
   self.view.setModel(self.model)
   self.view.verticalHeader().visible = False
   row = 0
   col = 0
   
   wholeNumberKeys = ['Voxel Count', 'Gray Levels', 'Minimum Intensity', 'Maximum Intensity', 'Median Intensity', 'Range']
   precisionOnlyKeys = ['Entropy', 'Volume mm^3', 'Volume cc', 'Mean Intensity', 'Mean Deviation', 'Root Mean Square', 'Standard Deviation', 'Surface Area mm^3']
   
   for featureVector in FeatureVectors:
     col = 0    
     for feature in featureVector:
       item = qt.QStandardItem()   
       value = featureVector[feature]       
       featureFormatted = value
       # add formatting here
       item.setText(str(featureFormatted))
       item.setToolTip(feature)
       self.model.setItem(row,col,item)
       self.items.append(item)
       col += 1
     row += 1
   
   self.view.setColumnWidth(0,30)
   self.model.setHeaderData(0,1," ")
   
   # set table headers
   col = 0
   for feature in FeatureVectors[0]:
     self.view.setColumnWidth(col,15*len(feature))
     self.model.setHeaderData(col,1,feature)
     col += 1
Пример #4
0
    def updateTable(self):
        self.portsTableModel = qt.QStandardItemModel()
        self.portsTable.setModel(self.portsTableModel)
        self.transformSliders.reset()
        self.removePortButton.enabled = False
        self.transformSliders.setMRMLTransformNode(None)

        node = self.logic.markupsNode

        if node is None:
            return

        self.itemPortIdxMap = {}
        for i in range(node.GetNumberOfFiducials()):
            item = qt.QStandardItem()
            item.setText(self.logic.getPortName(i))
            self.portsTableModel.setItem(i, 0, item)
            self.itemPortIdxMap[item] = i

            item = qt.QStandardItem()
            item.setText('Visible')
            item.setCheckable(True)
            if self.logic.isToolVisible(i):
                checkState = 2  # checked enum
            else:
                checkState = 0  # unchecked enum
            item.setCheckState(checkState)
            self.portsTableModel.setItem(i, 1, item)
            self.itemPortIdxMap[item] = i
        self.portsTableModel.setHeaderData(0, 1, "Port Fiducial Name")
        self.portsTableModel.setHeaderData(1, 1, " ")
        self.portsTable.setColumnWidth(0, 15 * len("Port Fiducial Name"))

        self.portsTableModel.itemChanged.connect(self.onTableItemChanged)
        self.portsTable.selectionModel().currentRowChanged.connect(
            self.onCurrentToolChanged)
Пример #5
0
  def setup(self):
    # Instantiate and connect widgets ...

    # #
    # # Reload and Test area
    # #
    # reloadCollapsibleButton = ctk.ctkCollapsibleButton()
    # reloadCollapsibleButton.text = "Reload && Test"
    # self.layout.addWidget(reloadCollapsibleButton)
    # reloadFormLayout = qt.QFormLayout(reloadCollapsibleButton)

    # # reload button
    # # (use this during development, but remove it when delivering
    # #  your module to users)
    # self.reloadButton = qt.QPushButton("Reload")
    # self.reloadButton.toolTip = "Reload this module."
    # self.reloadButton.name = "PortPlacement Reload"
    # reloadFormLayout.addWidget(self.reloadButton)
    # self.reloadButton.connect('clicked()', self.onReload)

    # # reload and test button
    # # (use this during development, but remove it when delivering
    # #  your module to users)
    # self.reloadAndTestButton = qt.QPushButton("Reload and Test")
    # self.reloadAndTestButton.toolTip = "Reload this module and then run the self tests."
    # reloadFormLayout.addWidget(self.reloadAndTestButton)
    # self.reloadAndTestButton.connect('clicked()', self.onReloadAndTest)

    #
    # Ports Area
    #
    portsCollapsibleButton = ctk.ctkCollapsibleButton()
    portsCollapsibleButton.text = "Surgical Ports"
    self.layout.addWidget(portsCollapsibleButton)
    portsFormLayout = qt.QFormLayout(portsCollapsibleButton)

    #
    # port fiducial list selector
    #
    self.portListSelector = slicer.qMRMLNodeComboBox()
    self.portListSelector.nodeTypes = ["vtkMRMLMarkupsFiducialNode"]
    self.portListSelector.addEnabled = False
    self.portListSelector.removeEnabled = False
    self.portListSelector.noneEnabled = True
    self.portListSelector.setMRMLScene(slicer.mrmlScene)
    self.portListSelector.setToolTip("Add surgical ports from a markups node.")
    portsFormLayout.addRow("Markups node of surgical ports", self.portListSelector)

    #
    # Add Port List button
    #
    self.addPortListButton = qt.QPushButton("Set Port Markups Node")
    self.addPortListButton.enabled = False
    portsFormLayout.addRow(self.addPortListButton)

    #
    # Port table
    #
    self.portsTable = qt.QTableView()
    self.portsTableModel = qt.QStandardItemModel()
    self.portsTable.setModel(self.portsTableModel)
    portsFormLayout.addRow(self.portsTable)

    #
    # Remove Port button
    #
    self.removePortButton = qt.QPushButton("Remove Selected Port")
    self.removePortButton.enabled = False
    portsFormLayout.addRow(self.removePortButton)

    #
    # Target area
    #
    targetCollapsibleButton = ctk.ctkCollapsibleButton()
    targetCollapsibleButton.text = "Surgical Target"
    self.layout.addWidget(targetCollapsibleButton)
    targetFormLayout = qt.QFormLayout(targetCollapsibleButton)

    #
    # target selector
    #
    self.targetSelector = slicer.qMRMLNodeComboBox()
    self.targetSelector.nodeTypes = ["vtkMRMLMarkupsFiducialNode"]
    self.targetSelector.addEnabled = False
    self.targetSelector.removeEnabled = False
    self.targetSelector.noneEnabled = True
    self.targetSelector.setMRMLScene(slicer.mrmlScene)
    self.targetSelector.setToolTip("Pick the surgical target that the tools should face.")
    targetFormLayout.addRow("Surgical Target Fiducial", self.targetSelector)

    #
    # Retarget button
    #
    self.retargetButton = qt.QPushButton("Aim Tools at Target")
    self.retargetButton.toolTip = "Reset tool orientations to face target fiducial"
    self.retargetButton.enabled = False
    targetFormLayout.addRow(self.retargetButton)

    #
    # Port Tool Display Options
    #
    toolsCollapsibleButton = ctk.ctkCollapsibleButton()
    toolsCollapsibleButton.text = "Port Tool Display Options"
    self.layout.addWidget(toolsCollapsibleButton)
    toolsFormLayout = qt.QFormLayout(toolsCollapsibleButton)

    #
    # Transform sliders
    #
    self.transformSliders = slicer.qMRMLTransformSliders()
    self.transformSliders.TypeOfTransform = slicer.qMRMLTransformSliders.ROTATION
    self.transformSliders.CoordinateReference = slicer.qMRMLTransformSliders.LOCAL
    self.transformSliders.Title = 'Tool Orientation'
    self.transformSliders.minMaxVisible = False
    toolsFormLayout.addRow(self.transformSliders)

    #
    # radius spin box
    #
    self.radiusSpinBox = qt.QDoubleSpinBox()
    self.radiusSpinBox.setMinimum(0.0)
    self.radiusSpinBox.setMaximum(10.0)
    self.radiusSpinBox.setValue(2.0)
    toolsFormLayout.addRow("Tool radius", self.radiusSpinBox)

    #
    # length spin box
    #
    self.lengthSpinBox = qt.QDoubleSpinBox()
    self.lengthSpinBox.setMinimum(0.0)
    self.lengthSpinBox.setMaximum(250.0)
    self.lengthSpinBox.setValue(150.0)
    toolsFormLayout.addRow("Tool length", self.lengthSpinBox)

    # connections
    self.portListSelector.connect('currentNodeChanged(bool)', self.onPortListSelectorChanged)
    self.targetSelector.connect('currentNodeChanged(bool)', self.onTargetSelectorChanged)
    self.addPortListButton.connect('clicked(bool)', self.onAddPortListButton)
    self.removePortButton.connect('clicked(bool)', self.onRemovePortButton)
    self.retargetButton.connect('clicked(bool)', self.onRetargetButton)
    self.radiusSpinBox.connect('valueChanged(double)', self.onToolShapeChanged)
    self.lengthSpinBox.connect('valueChanged(double)', self.onToolShapeChanged)

    # Add vertical spacer
    self.layout.addStretch(1)

    # Add observer to scene for removal of fiducial nodes
    self.sceneObserverTag = slicer.mrmlScene.AddObserver(slicer.mrmlScene.NodeRemovedEvent,
                                                         self.onNodeRemoved)

    # instantiate port placement module logic
    self.logic = PortPlacementLogic()

    self.currentMarkupsNode = None
    self.onMarkupAddedTag = None
Пример #6
0
    def updateStructures(self, caller=None, event=None):
        """re-build the Structures frame
    - optional caller and event ignored (for use as vtk observer callback)
    """

        if self.setMergeButton.destroyed():
            """ TODO: here the python class still exists but the 
      Qt widgets are gone - need to figure out when to remove observers 
      and free python code - probably the destroyed() signal.
      """
            self.cleanup()
            return

        self.setMergeButton.setDisabled(not self.master)

        # reset to a fresh model
        self.brushes = []
        self.items = []
        self.structures = qt.QStandardItemModel()
        self.structuresView.setModel(self.structures)

        # if no merge volume exists, disable everything - else enable
        merge = self.mergeVolume()
        self.addStructureButton.setDisabled(not merge)
        self.deleteStructuresButton.setDisabled(not merge)
        self.mergeButton.setDisabled(not merge)
        self.splitButton.setDisabled(not merge)
        self.mergeAndBuildButton.setDisabled(not merge)
        self.replaceModels.setDisabled(not merge)
        if self.mergeValidCommand:
            # will be passed current
            self.mergeValidCommand(merge)

        if not merge:
            return

        colorNode = merge.GetDisplayNode().GetColorNode()
        lut = colorNode.GetLookupTable()

        masterName = self.master.GetName()
        slicer.mrmlScene.InitTraversal()
        vNode = slicer.mrmlScene.GetNextNodeByClass("vtkMRMLScalarVolumeNode")
        self.row = 0
        while vNode:
            vName = vNode.GetName()
            # match something like "CT-lung-label1"
            regexp = "%s-.*-label" % masterName
            if re.match(regexp, vName):
                # figure out what name it is
                # - account for the fact that sometimes a number will be added to the end of the name
                start = 1 + len(masterName)
                end = vName.rfind("-label")
                structureName = vName[start:end]
                structureIndex = colorNode.GetColorIndexByName(structureName)
                structureColor = lut.GetTableValue(structureIndex)[0:3]
                brush = qt.QBrush()
                self.brushes.append(brush)
                color = qt.QColor()
                color.setRgb(structureColor[0] * 255, structureColor[1] * 255,
                             structureColor[2] * 255)
                brush.setColor(color)

                # label index
                item = qt.QStandardItem()
                item.setEditable(False)
                item.setText(str(structureIndex))
                self.structures.setItem(self.row, 0, item)
                self.items.append(item)
                # label color
                item = qt.QStandardItem()
                item.setEditable(False)
                item.setData(color, 1)
                self.structures.setItem(self.row, 1, item)
                self.items.append(item)
                # structure name
                item = qt.QStandardItem()
                item.setEditable(False)
                item.setText(structureName)
                self.structures.setItem(self.row, 2, item)
                self.items.append(item)
                # volumeName name
                item = qt.QStandardItem()
                item.setEditable(False)
                item.setText(vName)
                self.structures.setItem(self.row, 3, item)
                self.items.append(item)
                # sort order
                item = qt.QStandardItem()
                item.setEditable(True)
                item.setText("")
                self.structures.setItem(self.row, 4, item)
                self.items.append(item)
                self.row += 1

            vNode = slicer.mrmlScene.GetNextNodeByClass(
                "vtkMRMLScalarVolumeNode")

        self.structuresView.setColumnWidth(0, 70)
        self.structuresView.setColumnWidth(1, 50)
        self.structuresView.setColumnWidth(2, 60)
        self.structuresView.setColumnWidth(3, 100)
        self.structuresView.setColumnWidth(4, 10)
        self.structures.setHeaderData(0, 1, "Number")
        self.structures.setHeaderData(1, 1, "Color")
        self.structures.setHeaderData(2, 1, "Name")
        self.structures.setHeaderData(3, 1, "Label Volume")
        self.structures.setHeaderData(4, 1, "Order")
        self.structuresView.setModel(self.structures)
Пример #7
0
  def updateStructures(self,caller=None, event=None):
    """re-build the Structures frame
    - optional caller and event ignored (for use as vtk observer callback)
    """

    if slicer.mrmlScene.IsBatchProcessing():
      return

    if self.setMergeButton.destroyed():
      """ TODO: here the python class still exists but the
      Qt widgets are gone - need to figure out when to remove observers
      and free python code - probably the destroyed() signal.
      """
      self.cleanup()
      return

    self.setMergeButton.setDisabled(not self.master)

    # reset to a fresh model
    self.brushes = []
    self.items = []
    self.structures = qt.QStandardItemModel()
    self.structuresView.setModel(self.structures)

    # if no merge volume exists, disable everything - else enable
    merge = self.mergeVolume()
    self.addStructureButton.setDisabled(not merge)
    self.deleteStructuresButton.setDisabled(not merge)
    self.mergeButton.setDisabled(not merge)
    self.splitButton.setDisabled(not merge)
    self.mergeAndBuildButton.setDisabled(not merge)
    self.replaceModels.setDisabled(not merge)
    if self.mergeValidCommand:
      # will be passed current
      self.mergeValidCommand(merge)

    if not merge:
      return

    colorNode = merge.GetDisplayNode().GetColorNode()
    lut = colorNode.GetLookupTable()

    masterName = self.master.GetName()
    volumeNodes = self.structureVolumes()
    for vNode in volumeNodes:
      vName = vNode.GetName()
      # figure out what name it is
      # - account for the fact that sometimes a number will be added to the end of the name
      start = 1+len(masterName)
      end = vName.rfind("-label")
      structureName = vName[start:end]
      structureIndex = colorNode.GetColorIndexByName( structureName )
      structureColor = lut.GetTableValue(structureIndex)[0:3]
      brush = qt.QBrush()
      self.brushes.append(brush)
      color = qt.QColor()
      color.setRgb(structureColor[0]*255,structureColor[1]*255,structureColor[2]*255)
      brush.setColor(color)

      # label index
      item = qt.QStandardItem()
      item.setEditable(False)
      item.setText( "%03d"%int(structureIndex) )
      self.structures.setItem(self.row,0,item)
      self.items.append(item)
      # label color
      item = qt.QStandardItem()
      item.setEditable(False)
      item.setData(color,1)
      self.structures.setItem(self.row,1,item)
      self.items.append(item)
      # structure name
      item = qt.QStandardItem()
      item.setEditable(False)
      item.setText(structureName)
      self.structures.setItem(self.row,2,item)
      self.items.append(item)
      # volumeName name
      item = qt.QStandardItem()
      item.setEditable(False)
      item.setText(vName)
      self.structures.setItem(self.row,3,item)
      self.items.append(item)
      # sort order
      item = qt.QStandardItem()
      item.setEditable(True)
      item.setText("")
      self.structures.setItem(self.row,4,item)
      self.items.append(item)
      self.row += 1

    for i in range(5):
      self.structuresView.resizeColumnToContents(i)

    self.structures.setHeaderData(0,1,"Number")
    self.structures.setHeaderData(1,1,"Color")
    self.structures.setHeaderData(2,1,"Name")
    self.structures.setHeaderData(3,1,"Label Volume")
    self.structures.setHeaderData(4,1,"Order")
    self.structuresView.setModel(self.structures)
    self.structuresView.connect("activated(QModelIndex)", self.onStructuresClicked)
    self.structuresView.setProperty('SH_ItemView_ActivateItemOnSingleClick', 1)

    self.structureLabelNames = []
    rows = self.structures.rowCount()
    for row in xrange(rows):
      self.structureLabelNames.append(self.structures.item(row,2).text())
Пример #8
0
    def populateStats(self):
        if not self.logic:
            return
        displayNode = self.insplabelNode.GetDisplayNode()
        colorNode = displayNode.GetColorNode()
        lut = colorNode.GetLookupTable()
        self.items = []
        self.model = qt.QStandardItemModel()
        self.view.setModel(self.model)
        self.view.verticalHeader().visible = False
        row = 0

        cycle = ['insp']

        for i in cycle:
            for regionTag, regionValue in zip(self.logic.regionTags,
                                              self.logic.regionValues):
                color = qt.QColor()
                rgb = lut.GetTableValue(regionValue[0])
                color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255)
                item = qt.QStandardItem()
                item.setData(color, 1)
                item.setText(str(regionTag))
                item.setData(regionTag, 1)
                item.setToolTip(regionTag)
                self.model.setItem(row, 0, item)
                self.items.append(item)
                col = 1
                for k in self.logic.keys:
                    item = qt.QStandardItem()
                    item.setText("%.3f" %
                                 self.logic.labelStats[i, k, regionTag])
                    self.model.setItem(row, col, item)
                    self.items.append(item)
                    col += 1
                row += 1

        self.view.setColumnWidth(0, 30)
        self.model.setHeaderData(0, 1, "INSP")
        col = 1
        for k in self.logic.keys:
            self.view.setColumnWidth(col, 15 * len(k))
            self.model.setHeaderData(col, 1, k)
            col += 1

        self.itemsexp = []
        self.modelexp = qt.QStandardItemModel()
        self.viewexp.setModel(self.modelexp)
        self.viewexp.verticalHeader().visible = False
        row = 0

        cycle = ['exp']

        for i in cycle:
            for regionTag, regionValue in zip(self.logic.regionTags,
                                              self.logic.regionValues):
                color = qt.QColor()
                rgb = lut.GetTableValue(regionValue[0])
                color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255)
                item = qt.QStandardItem()
                item.setData(color, 1)
                item.setText(str(regionTag))
                item.setData(regionTag, 1)
                item.setToolTip(regionTag)
                self.modelexp.setItem(row, 0, item)
                self.itemsexp.append(item)
                col = 1
                for k in self.logic.keys:
                    item = qt.QStandardItem()
                    item.setText("%.3f" %
                                 self.logic.labelStats[i, k, regionTag])
                    self.modelexp.setItem(row, col, item)
                    self.itemsexp.append(item)
                    col += 1
                row += 1

        self.viewexp.setColumnWidth(0, 30)
        self.modelexp.setHeaderData(0, 1, "EXP")
        col = 1
        for k in self.logic.keys:
            self.viewexp.setColumnWidth(col, 15 * len(k))
            self.modelexp.setHeaderData(col, 1, k)
            col += 1
    def setup(self):

        #
        # Reload and Test area
        #
        reloadCollapsibleButton = ctk.ctkCollapsibleButton()
        reloadCollapsibleButton.text = "Reload && Test"
        self.layout.addWidget(reloadCollapsibleButton)
        reloadFormLayout = qt.QFormLayout(reloadCollapsibleButton)

        # reload button
        # (use this during development, but remove it when delivering
        #  your module to users)
        self.reloadButton = qt.QPushButton("Reload")
        self.reloadButton.toolTip = "Reload this module."
        self.reloadButton.name = "Radiomics Reload"
        reloadFormLayout.addWidget(self.reloadButton)
        self.reloadButton.connect('clicked()', self.onReload)

        # reload and test button
        # (use this during development, but remove it when delivering
        #  your module to users)
        self.reloadAndTestButton = qt.QPushButton("Reload and Test")
        self.reloadAndTestButton.toolTip = "Reload this module and then run the self tests."
        reloadFormLayout.addWidget(self.reloadAndTestButton)
        # self.reloadAndTestButton.connect('clicked()', self.onReloadAndTest)
        reloadCollapsibleButton.collapsed = True
        #---------------------------------------------------------

        #
        # Compute Radiomics area
        #
        self.computeRadiomicsCollapsibleButton = ctk.ctkCollapsibleButton()
        self.computeRadiomicsCollapsibleButton.text = "Slicer Radiomics Platform"
        self.layout.addWidget(self.computeRadiomicsCollapsibleButton)
        self.computeRadiomicsFormLayout = qt.QFormLayout(
            self.computeRadiomicsCollapsibleButton)

        #
        # Universal Advanced Settings Collapsible Button
        #

        self.AdvancedSettingsCollapsibleButton = ctk.ctkCollapsibleButton()
        self.AdvancedSettingsCollapsibleButton.text = "Advanced Settings"
        self.AdvancedSettingsCollapsibleButtonLayout = qt.QHBoxLayout()
        self.AdvancedSettingsCollapsibleButton.setLayout(qt.QHBoxLayout())
        self.computeRadiomicsFormLayout.addWidget(
            self.AdvancedSettingsCollapsibleButton)
        self.AdvancedSettingsCollapsibleButton.collapsed = True

        self.AdvancedSettingsFrame = qt.QFrame(
            self.AdvancedSettingsCollapsibleButton)
        self.AdvancedSettingsFrameLayout = qt.QFormLayout()
        self.AdvancedSettingsFrame.setLayout(self.AdvancedSettingsFrameLayout)
        self.AdvancedSettingsCollapsibleButton.layout().addWidget(
            self.AdvancedSettingsFrame)

        # Label Values
        self.inputLabelValues = qt.QLabel("Label Values:",
                                          self.AdvancedSettingsFrame)
        self.inputLabelValuesField = qt.QLineEdit("1",
                                                  self.AdvancedSettingsFrame)
        self.AdvancedSettingsFrameLayout.addRow(self.inputLabelValues,
                                                self.inputLabelValuesField)

        # Interpolation Settings
        self.settingsRadioButtonFrame = qt.QFrame(self.AdvancedSettingsFrame)
        self.settingsRadioButtonFrame.setLayout(qt.QHBoxLayout())
        self.interpolationsGroup = qt.QButtonGroup(
            self.settingsRadioButtonFrame)
        self.ipRawButton = qt.QRadioButton("Raw")
        self.ip1x1x1Button = qt.QRadioButton("(1,1,1)")
        self.ip2x2x2Button = qt.QRadioButton("(2,2,2)")
        self.ip3x3x3Button = qt.QRadioButton("(3,3,3)")
        self.ipRawButton.checked = True
        self.interpolationsGroup.addButton(self.ipRawButton)
        self.interpolationsGroup.addButton(self.ip1x1x1Button)
        self.interpolationsGroup.addButton(self.ip2x2x2Button)
        self.interpolationsGroup.addButton(self.ip3x3x3Button)
        self.settingsRadioButtonFrame.layout().addWidget(self.ipRawButton)
        self.settingsRadioButtonFrame.layout().addWidget(self.ip1x1x1Button)
        self.settingsRadioButtonFrame.layout().addWidget(self.ip2x2x2Button)
        self.settingsRadioButtonFrame.layout().addWidget(self.ip3x3x3Button)
        self.interpHeader = qt.QLabel("Interpolation:")
        self.AdvancedSettingsFrameLayout.addRow(self.interpHeader,
                                                self.settingsRadioButtonFrame)

        # Bin Width
        self.inputBinWidth = qt.QLabel("Bin Width:",
                                       self.AdvancedSettingsFrame)
        self.inputBinWidthField = qt.QLineEdit("25",
                                               self.AdvancedSettingsFrame)
        self.AdvancedSettingsFrameLayout.addRow(self.inputBinWidth,
                                                self.inputBinWidthField)

        # Modality Radio Buttons Frame
        self.ModalityRadioButtonFrame = qt.QFrame(self.AdvancedSettingsFrame)
        self.ModalityRadioButtonFrame.setLayout(qt.QHBoxLayout())
        self.ModalityFileFormatGroup = qt.QButtonGroup(
            self.ModalityRadioButtonFrame)
        self.CTButton = qt.QRadioButton("CT")
        self.CTButton.checked = True
        self.MRIButton = qt.QRadioButton("MRI")
        self.PETButton = qt.QRadioButton("PET")
        self.ModalityFileFormatGroup.addButton(self.CTButton)
        self.ModalityFileFormatGroup.addButton(self.MRIButton)
        self.ModalityFileFormatGroup.addButton(self.PETButton)
        self.ModalityRadioButtonFrame.layout().addWidget(self.CTButton)
        self.ModalityRadioButtonFrame.layout().addWidget(self.MRIButton)
        self.ModalityRadioButtonFrame.layout().addWidget(self.PETButton)
        self.ModalityInputLabel = qt.QLabel("Image Modality:",
                                            self.AdvancedSettingsFrame)
        self.AdvancedSettingsFrameLayout.addRow(self.ModalityInputLabel,
                                                self.ModalityRadioButtonFrame)
        #
        # End Universal Advanced Settings Collapsible Button
        #

        # Parent Tab Widget
        self.computeRadiomicsTabWidget = qt.QTabWidget()
        self.computeRadiomicsFormLayout.addWidget(
            self.computeRadiomicsTabWidget)

        #  Radiomics Current Mode
        self.tabComputeRadiomicsCurr = qt.QWidget()
        self.singleCaseInputFormLayout = qt.QFormLayout()
        self.tabComputeRadiomicsCurr.setLayout(self.singleCaseInputFormLayout)
        self.tabComputeRadiomicsCurrName = "Single Case Mode"
        self.computeRadiomicsTabWidget.addTab(self.tabComputeRadiomicsCurr,
                                              self.tabComputeRadiomicsCurrName)

        # Input 1: Input Image
        self.input1Frame = qt.QFrame(self.tabComputeRadiomicsCurr)
        self.input1Frame.setLayout(qt.QHBoxLayout())
        self.singleCaseInputFormLayout.addWidget(self.input1Frame)
        self.input1Selector = qt.QLabel("Input Image: ", self.input1Frame)
        self.input1Frame.layout().addWidget(self.input1Selector)
        self.input1Selector = slicer.qMRMLNodeComboBox(self.input1Frame)
        self.input1Selector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.input1Selector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap",
                                         0)
        self.input1Selector.addEnabled = False
        self.input1Selector.removeEnabled = False
        self.input1Selector.setMRMLScene(slicer.mrmlScene)
        self.input1Frame.layout().addWidget(self.input1Selector)

        # Input 2: Input Segmentation
        self.input2Frame = qt.QFrame(self.tabComputeRadiomicsCurr)
        self.input2Frame.setLayout(qt.QHBoxLayout())
        self.singleCaseInputFormLayout.addWidget(self.input2Frame)
        self.input2Selector = qt.QLabel("Input Label:  ", self.input2Frame)
        self.input2Frame.layout().addWidget(self.input2Selector)
        self.input2Selector = slicer.qMRMLNodeComboBox(self.input2Frame)
        self.input2Selector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.input2Selector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap",
                                         1)
        self.input2Selector.addEnabled = False
        self.input2Selector.removeEnabled = False
        self.input2Selector.setMRMLScene(slicer.mrmlScene)
        self.input2Frame.layout().addWidget(self.input2Selector)

        # Settings Collapsible Button
        self.SettingsCollapsibleButtonCurr = ctk.ctkCollapsibleButton()
        self.SettingsCollapsibleButtonCurr.text = "Settings"
        self.SettingsCollapsibleButtonCurrLayout = qt.QHBoxLayout()
        self.SettingsCollapsibleButtonCurr.setLayout(
            self.SettingsCollapsibleButtonCurrLayout)
        self.singleCaseInputFormLayout.addWidget(
            self.SettingsCollapsibleButtonCurr)
        self.SettingsCollapsibleButtonCurr.collapsed = False
        self.SettingsFrameCurr = qt.QFrame(self.SettingsCollapsibleButtonCurr)
        self.SettingsFrameCurr.setLayout(qt.QFormLayout())
        self.SettingsCollapsibleButtonCurrLayout.addWidget(
            self.SettingsFrameCurr)

        # Settings
        self.para2curr = qt.QCheckBox("Use MatlabBridge",
                                      self.tabComputeRadiomicsCurr)
        self.para2curr.toolTip = "When checked: Matlab features extracted"
        self.para2curr.checked = False
        self.SettingsFrameCurr.layout().addRow(self.para2curr)

        # Apply Radiomics button
        self.RadiomicCurrButtonsFrame = qt.QFrame(self.tabComputeRadiomicsCurr)
        self.RadiomicCurrButtonsFrame.setLayout(qt.QHBoxLayout())
        self.singleCaseInputFormLayout.addWidget(self.RadiomicCurrButtonsFrame)

        self.radiomicsCurrButton = qt.QPushButton(
            "Compute Radiomics Features (Single Case)",
            self.RadiomicCurrButtonsFrame)
        self.radiomicsCurrButton.enabled = True
        self.radiomicsCurrButton.toolTip = "Run the feature extraction for a single case."
        self.RadiomicCurrButtonsFrame.layout().addWidget(
            self.radiomicsCurrButton)

        # Chart
        self.RadiomicsTableFrame = qt.QFrame(self.tabComputeRadiomicsCurr)
        self.RadiomicsTableFrameLayout = qt.QHBoxLayout()
        self.RadiomicsTableFrame.setLayout(self.RadiomicsTableFrameLayout)
        self.singleCaseInputFormLayout.addWidget(self.RadiomicsTableFrame)

        self.RadiomicsTableView = qt.QTableView(self.RadiomicsTableFrame)
        self.RadiomicsTableView.sortingEnabled = True
        self.RadiomicsTableView.minimumHeight = 175
        self.RadiomicsTableView.verticalHeader().visible = False
        self.RadiomicsTableView.setColumnWidth(0, 30)
        self.RadiomicsTableFrameLayout.addWidget(self.RadiomicsTableView)
        self.RadiomicsTableModel = qt.QStandardItemModel()

        # Save Table Button
        self.saveButton = qt.QPushButton("Save Table to CSV File",
                                         self.RadiomicCurrButtonsFrame)
        self.saveButton.toolTip = "Save Radiomics Feature from table to CSV file"
        self.saveButton.enabled = False
        self.singleCaseInputFormLayout.layout().addWidget(self.saveButton)
        """
    #
    # The interface we use for batch mode (not part of this module)
    #
    
    #---------------------------------------------------------
    # Radiomics Batch
    self.tabComputeRadiomicsBatch = qt.QWidget()
    self.RadiomicsFormLayout = qt.QFormLayout()
    self.tabComputeRadiomicsBatch.setLayout(self.RadiomicsFormLayout)
    self.tabComputeRadiomicsBatchName = "Batch Mode"
    self.computeRadiomicsTabWidget.addTab(self.tabComputeRadiomicsBatch, self.tabComputeRadiomicsBatchName)
    
    # Input 3: Database selection
    self.input3Frame = qt.QFrame(self.tabComputeRadiomicsBatch)
    self.input3Frame.setLayout(qt.QHBoxLayout())
    self.RadiomicsFormLayout.addWidget(self.input3Frame)
    self.DatabaseButton = qt.QPushButton("Set Root Patient Directory")
    self.DatabaseButton.toolTip = "Set the main Patient Data location"
    self.DatabaseButton.enabled = True
    self.input3Frame.layout().addWidget(self.DatabaseButton)
    self.PatientSelector = qt.QComboBox()
    self.PatientSelector.enabled = False
    self.input3Frame.layout().addWidget(self.PatientSelector)
    
    # Settings Collapsible Button
    self.SettingsCollapsibleButton = ctk.ctkCollapsibleButton()
    self.SettingsCollapsibleButton.text = "Settings"
    self.SettingsCollapsibleButtonLayout = qt.QHBoxLayout()
    self.SettingsCollapsibleButton.setLayout(self.SettingsCollapsibleButtonLayout)    
    self.RadiomicsFormLayout.addWidget(self.SettingsCollapsibleButton)
    self.SettingsCollapsibleButton.collapsed = False
    self.SettingsFrame = qt.QFrame(self.SettingsCollapsibleButton)
    self.SettingsFrame.setLayout(qt.QFormLayout())
    self.SettingsCollapsibleButtonLayout.addWidget(self.SettingsFrame)
    
    # Settings 
    self.para2 = qt.QCheckBox("Use MatlabBridge", self.SettingsFrame)
    self.para2.toolTip = "When checked: Matlab features extracted"
    self.para2.checked = True
    self.SettingsFrame.layout().addRow(self.para2)

    self.para3 = qt.QCheckBox("Clear Database", self.SettingsFrame)
    self.para3.toolTip = "When checked: old database is cleared"
    self.para3.checked = True
    self.SettingsFrame.layout().addRow(self.para3)

    # Keywords Collapsible Button
    self.KeywordsCollapsibleButton = ctk.ctkCollapsibleButton()
    self.KeywordsCollapsibleButton.text = "Keyword Matching"
    self.KeywordsCollapsibleButtonLayout = qt.QHBoxLayout()
    self.KeywordsCollapsibleButton.setLayout(self.KeywordsCollapsibleButtonLayout)    
    self.SettingsFrame.layout().addRow(self.KeywordsCollapsibleButton)
    self.KeywordsCollapsibleButton.collapsed = True
    
    self.keywordsFrame = qt.QFrame(self.KeywordsCollapsibleButton)
    self.keywordsFrame.setLayout(qt.QFormLayout())
    self.KeywordsCollapsibleButtonLayout.addWidget(self.keywordsFrame)
    self.keywordsHeader = qt.QLabel("Keyword Matching:", self.keywordsFrame)
    self.keywordsFrame.layout().addRow(self.keywordsHeader)
    
    # File Type Radio Buttons Frame
    self.radioButtonFrame = qt.QFrame(self.keywordsFrame)
    self.radioButtonFrame.setLayout(qt.QFormLayout())
    self.fileFormatGroup = qt.QButtonGroup(self.radioButtonFrame)
    self.nrrdButton = qt.QRadioButton("NRRD")
    self.nrrdButton.checked = True
    self.niftiButton = qt.QRadioButton("NIFTI")
    self.fileFormatGroup.addButton(self.nrrdButton)
    self.fileFormatGroup.addButton(self.niftiButton)
    self.radioButtonFrame.layout().addRow(self.nrrdButton, self.niftiButton)
    self.inputMaskHeader = qt.QLabel("Input Image File Type:", self.keywordsFrame)
    self.keywordsFrame.layout().addRow(self.inputMaskHeader, self.radioButtonFrame)
    
    # Keywords Frame
    self.inputImageKeywords = qt.QLabel("Input Image Keywords:", self.keywordsFrame)
    self.inputImageKeywordsField = qt.QLineEdit("",self.keywordsFrame)
    self.keywordsFrame.layout().addRow(self.inputImageKeywords, self.inputImageKeywordsField )
    
    self.inputImageExclusionKeywords = qt.QLabel("Input Image Exclusion Keywords:", self.keywordsFrame)
    self.inputImageExclusionKeywordsField = qt.QLineEdit("",self.keywordsFrame)
    self.keywordsFrame.layout().addRow(self.inputImageExclusionKeywords, self.inputImageExclusionKeywordsField )
    
    self.inputLabelKeywords = qt.QLabel("Input Label Keywords:", self.keywordsFrame)
    self.inputLabelKeywordsField = qt.QLineEdit("",self.keywordsFrame)
    self.keywordsFrame.layout().addRow(self.inputLabelKeywords, self.inputLabelKeywordsField )
    
    self.inputLabelExclusionKeywords = qt.QLabel("Input Label Exclusion Keywords:", self.keywordsFrame)
    self.inputLabelExclusionKeywordsField = qt.QLineEdit("",self.keywordsFrame)
    self.keywordsFrame.layout().addRow(self.inputLabelExclusionKeywords, self.inputLabelExclusionKeywordsField )
    
    # Radiomic Mode Buttons
    self.RadiomicButtonsFrame = qt.QFrame(self.tabComputeRadiomicsBatch)
    self.RadiomicButtonsFrame.setLayout(qt.QHBoxLayout())
    self.RadiomicsFormLayout.addWidget(self.RadiomicButtonsFrame)
    self.radiomicsBatchButton = qt.QPushButton("Compute Radiomics Features (Batch Mode)")
    self.radiomicsBatchButton.toolTip = "Run the feature extraction for database batch."
    self.radiomicsBatchButton.enabled = True
    self.RadiomicButtonsFrame.layout().addWidget(self.radiomicsBatchButton)
    self.RadiomicButtonsFrame.enabled = True
    """

        #---------------------------------------------------------
        # Connections
        #self.DatabaseButton.connect('clicked(bool)', self.onDatabaseButton)
        self.radiomicsCurrButton.connect('clicked(bool)', self.onRadiomicsCurr)
        #self.radiomicsBatchButton.connect('clicked(bool)', self.onRadiomicsBatch)
        self.saveButton.connect('clicked()', self.onSave)

        self.layout.addStretch(1)  # Add vertical spacer