def build_ui(self):
        min_width = 150
        max_width = 200

        layout = QGridLayout()
        self.setLayout(layout)

        ####
        #
        # Build up the sim settings tab
        #
        #  Choose Sim: | ComboBox |
        #  Choose shock finder: | ComboBox |
        #
        ####

        layout.addWidget(QLabel('Choose sim'), 0, 0)
        self.sim_combo = QComboBox(self)
        self.update_sim_list()
        self.sim_combo.currentIndexChanged.connect(self.sim_selection_changed)
        layout.addWidget(self.sim_combo, 0, 1)

        layout.addWidget(QLabel('Choose Shock Finder'), 1, 0)
        self.shock_combo = QComboBox(self)
        self.update_shock_opts()
        self.shock_combo.currentIndexChanged.connect(self.shock_finder_changed)
        layout.addWidget(self.shock_combo, 1, 1)

        ####
        #
        #  prtl stride:
        #  | QLineEdit | | x | average 1D |
        #
        ####

        sim_ind = self.sim_selected.sim_num
        sim_params = self.main_params['sim_params'][sim_ind]

        layout.addWidget(QLabel('Prtl Stride'), 2, 0)

        self.prtl_stride_edit = QLineEdit(self)
        self.prtl_stride_edit.setText(str(sim_params['PrtlStride']))
        self.prtl_stride_edit.setMaximumWidth(max_width)
        self.prtl_stride_edit.setMinimumWidth(min_width)
        self.prtl_stride_edit.returnPressed.connect(self.stride_changed)
        layout.addWidget(self.prtl_stride_edit, 2, 1)
        self.average1D_cb = QCheckBox("Average1D")
        self.average1D_cb.setChecked(sim_params['Average1D'])
        self.average1D_cb.stateChanged.connect(self.avg_changed)

        layout.addWidget(self.average1D_cb, 3, 0)

        # radio buttons to choose plane.
        row = QHBoxLayout()
        row.addWidget(QLabel('Choose 2D-plane:'))

        self.slice_radio_btns = []
        radiobutton = QRadioButton("x-y")
        radiobutton.plane = 0
        radiobutton.toggled.connect(self.radio_clicked)
        self.slice_radio_btns.append(radiobutton)
        row.addWidget(radiobutton)

        radiobutton = QRadioButton("x-z")
        radiobutton.plane = 1
        radiobutton.toggled.connect(self.radio_clicked)
        self.slice_radio_btns.append(radiobutton)

        row.addWidget(radiobutton)

        radiobutton = QRadioButton("y-z")
        radiobutton.plane = 2
        radiobutton.toggled.connect(self.radio_clicked)
        self.slice_radio_btns.append(radiobutton)

        row.addWidget(radiobutton)
        layout.addLayout(row, 4, 0, 1, 2)

        # Now do the sliders

        self.sliders_dict = {}
        for i, ax in enumerate(['x', 'y', 'z']):
            row = QHBoxLayout()
            sld_obj = {}
            sld_obj['label'] = QLabel(self)
            sld_obj['sld'] = QSlider(Qt.Horizontal, self)
            sld_obj['sld'].ax = ax
            # update the text box whenever sld is change
            sld_obj['sld'].valueChanged.connect(self.scale_handler)
            # only update the plot when the user releases the mouse
            sld_obj['sld'].mouseReleaseEvent = partial(self.update_slice_val,
                                                       ax)

            # self.sld.setRange(self.param.minimum, self.param.maximum)
            sld_obj['sld'].setFocusPolicy(Qt.NoFocus)
            sld_obj['sld'].setPageStep(1)

            row.addWidget(QLabel(f'{ax}-slice'))
            row.addWidget(sld_obj['sld'])
            row.addWidget(sld_obj['label'])
            self.sliders_dict[ax] = sld_obj

            layout.addLayout(row, 5 + i, 0, 1, 2)

        self.update_slice_widgets()