コード例 #1
0
    def parameter(self) -> Parameter:
        if not self._param:
            self._param = parameterTypes.GroupParameter(
                name='Rectangular ROI',
                children=[
                    parameterTypes.SimpleParameter(title='Width',
                                                   name='width',
                                                   value=self.width,
                                                   type='float',
                                                   units='px'),
                    parameterTypes.SimpleParameter(title='Height',
                                                   name='height',
                                                   value=self.height,
                                                   type='float',
                                                   units='px'),
                    parameterTypes.SimpleParameter(title='Horizontal Segments',
                                                   name='segments_h',
                                                   value=self.segments_h,
                                                   type='int'),
                    parameterTypes.SimpleParameter(title='Vertical Segments',
                                                   name='segments_v',
                                                   value=self.segments_v,
                                                   type='int')
                ])

            self._param.sigTreeStateChanged.connect(self.valueChanged)

        return self._param
コード例 #2
0
    def parameter(self):
        if not self._param:
            self._param = parameterTypes.GroupParameter(
                name='Arc ROI',
                children=[
                    parameterTypes.SimpleParameter(title='Q Minimum',
                                                   name='innerradius',
                                                   value=self.innerradius,
                                                   type='float',
                                                   units='Å⁻¹'),
                    parameterTypes.SimpleParameter(title='Q Maximum',
                                                   name='outerradius',
                                                   value=self.outerradius,
                                                   type='float',
                                                   units='Å⁻¹'),
                    parameterTypes.SimpleParameter(title='χ Width',
                                                   name='thetawidth',
                                                   value=self.thetawidth,
                                                   type='float',
                                                   units='°'),
                    parameterTypes.SimpleParameter(title='χ Center',
                                                   name='thetacenter',
                                                   value=self.thetacenter,
                                                   type='float',
                                                   siSuffix='°')
                ])

            self._param.sigTreeStateChanged.connect(self.valueChanged)

        return self._param
コード例 #3
0
    def parameter(self):
        if not self._param:
            self._param = parameterTypes.GroupParameter(
                name="Arc ROI",
                children=[
                    parameterTypes.SimpleParameter(
                        title=f"{self.radius_name} Minimum", name="innerradius", value=self.innerradius, type="float",
                        units=self.radius_units, min=0
                        # "Å⁻¹"
                    ),
                    parameterTypes.SimpleParameter(
                        title=f"{self.radius_name} Maximum", name="outerradius", value=self.outerradius, type="float",
                        units=self.radius_units, min=0
                    ),
                    parameterTypes.SimpleParameter(
                        title="χ Width", name="thetawidth", value=self.thetawidth, type="float", units="°"
                    ),
                    parameterTypes.SimpleParameter(
                        title="χ Center", name="thetacenter", value=self.thetacenter, type="float", siSuffix="°"
                    ),
                ],
            )

            self._param.sigTreeStateChanged.connect(self.valueChanged)

        return self._param
コード例 #4
0
    def parameter(self) -> Parameter:
        if not self._param:
            self._param = parameterTypes.GroupParameter(
                name='Line ROI',
                children=[
                    parameterTypes.SimpleParameter(title='Center X',
                                                   name='center_x',
                                                   value=self.center_x,
                                                   type='float',
                                                   units='px'),
                    parameterTypes.SimpleParameter(title='Center Y',
                                                   name='center_y',
                                                   value=self.center_y,
                                                   type='float',
                                                   units='px'),
                    parameterTypes.SimpleParameter(title='Rotation Angle',
                                                   name='rotation',
                                                   value=self.rotation,
                                                   type='float',
                                                   units='px'),
                    parameterTypes.SimpleParameter(title='Length',
                                                   name='length',
                                                   value=self.length,
                                                   type='float',
                                                   units='px'),
                    parameterTypes.SimpleParameter(title='Width',
                                                   name='width',
                                                   value=self.width,
                                                   type='float',
                                                   units='px'),
                ])

            self._param.sigTreeStateChanged.connect(self.valueChanged)

        return self._param
コード例 #5
0
    def __init__(self, model, **kwargs):
        scene = model.getScene()
        kwargs["type"] = "group"
        kwargs["name"] = "Scene.detrend"

        KiteParameterGroup.__init__(self, model=model, model_attr="scene", **kwargs)

        p = {
            "name": "demean",
            "type": "bool",
            "value": scene.deramp.config.demean,
            "tip": "substract mean of displacement",
        }
        self.demean = pTypes.SimpleParameter(**p)

        def toggle_demean(param, checked):
            self.model.getScene().deramp.set_demean(checked)

        self.demean.sigValueChanged.connect(toggle_demean)

        p = {
            "name": "applied",
            "type": "bool",
            "value": scene.deramp.config.applied,
            "tip": "detrend the scene",
        }
        self.applied = pTypes.SimpleParameter(**p)

        def toggle_applied(param, checked):
            self.model.getScene().deramp.set_enabled(checked)

        self.applied.sigValueChanged.connect(toggle_applied)

        self.pushChild(self.applied)
        self.pushChild(self.demean)
コード例 #6
0
    def parameter(self) -> Parameter:
        if not self._param:
            self._param = parameterTypes.GroupParameter(
                name="Rectangular ROI",
                children=[
                    parameterTypes.SimpleParameter(title="Width",
                                                   name="width",
                                                   value=self.width,
                                                   type="float",
                                                   units="px"),
                    parameterTypes.SimpleParameter(title="Height",
                                                   name="height",
                                                   value=self.height,
                                                   type="float",
                                                   units="px"),
                    parameterTypes.SimpleParameter(title="Horizontal Segments",
                                                   name="segments_h",
                                                   value=self.segments_h,
                                                   type="int"),
                    parameterTypes.SimpleParameter(title="Vertical Segments",
                                                   name="segments_v",
                                                   value=self.segments_v,
                                                   type="int"),
                ],
            )

            self._param.sigTreeStateChanged.connect(self.valueChanged)

        return self._param
コード例 #7
0
    def __init__(self, source_node, **kwargs):

        kwargs["title"] = "Input file"
        super().__init__(source_node, **kwargs)

        try:
            file_path = source_node.file_path
        except Exception:
            file_path = ""

        # Add LineEdit for choosing file
        file_path_str = parameterTypes.SimpleParameter(
            type="str", name=self.FILE_PATH_STR_NAME, value=file_path)

        file_path_str.setValue(file_path)
        file_path_str.sigValueChanged.connect(self._on_file_path_changed)

        self.file_path_str = self.addChild(file_path_str)

        # Add PushButton for choosing file
        file_path_button = parameterTypes.ActionParameter(
            type="action", name="Select data...")

        file_path_button.sigActivated.connect(self._choose_file)

        self.file_path_button = self.addChild(file_path_button)
コード例 #8
0
    def __init__(self, pipeline, **kwargs):

        kwargs['title'] = 'Input file'
        super().__init__(pipeline, **kwargs)

        try:
            file_path = pipeline.source.file_path
        except Exception:
            file_path = ''

        # Add LineEdit for choosing file
        file_path_str = parameterTypes.SimpleParameter(
            type='str', name=self.FILE_PATH_STR_NAME, value=file_path)

        file_path_str.sigValueChanged.connect(self._on_file_path_changed)

        self.file_path_str = self.addChild(file_path_str)

        # Add PushButton for choosing file
        file_path_button = parameterTypes.ActionParameter(
            type='action', name="Select data...")

        file_path_button.sigActivated.connect(self._choose_file)

        self.file_path_button = self.addChild(file_path_button)
コード例 #9
0
ファイル: outputs.py プロジェクト: logogriph2/cognigraph
 def _create_parameters(self):
     stream_name = self._output_node.stream_name
     stream_name_str = parameterTypes.SimpleParameter(
         type='str',
         name=self.STREAM_NAME_STR_NAME,
         value=stream_name,
         editable=False)
     stream_name_str.sigValueChanged.connect(self._on_stream_name_changed)
     self.stream_name_str = self.addChild(stream_name_str)
コード例 #10
0
 def _create_parameters(self):
     n_lines = parameterTypes.SimpleParameter(
         type="int",
         name="Number of connections",
         value=self._output_node.n_lines,
         readonly=False,
     )
     self.n_lines = self.addChild(n_lines)
     self.n_lines.sigValueChanged.connect(self._on_n_lines_changed)
コード例 #11
0
ファイル: batch.py プロジェクト: dmpelt/Xi-cam
    def __init__(self, *args, **kwargs):

        self.centerwidget = QtGui.QWidget()
        self.fileslistwidget = widgets.filesListWidget()
        self.centerwidget.setLayout(QtGui.QVBoxLayout())
        self.centerwidget.layout().addWidget(self.fileslistwidget)

        self.rightwidget = ParameterTree()
        self.remeshOption = pTypes.SimpleParameter(type='bool',
                                                   name='GIXS remeshing',
                                                   value=False)
        self.integrateOption = pTypes.SimpleParameter(
            type='bool', name='Azimuthal integration', value=True)
        self.roiOption = pTypes.SimpleParameter(type='bool',
                                                name='Integrate last ROI',
                                                value=True)
        self.logOption = pTypes.SimpleParameter(type='bool',
                                                name='Log scale image',
                                                value=False)
        self.cakeOption = pTypes.SimpleParameter(type='bool',
                                                 name='Cake (q/chi)',
                                                 value=False)
        self.exportformat = pTypes.ListParameter(
            type='list',
            name='Image export format',
            value=0,
            values=['EDF (.edf)', 'TIFF (.tif)', 'JPEG (.jpg)'])
        self.processButton = pTypes.ActionParameter(name='Process')
        # self.abortButton = pTypes.ActionParameter(name='Abort')
        params = [
            self.remeshOption, self.cakeOption, self.integrateOption,
            self.roiOption, self.logOption, self.exportformat,
            self.processButton
        ]
        paramgroup = Parameter.create(name='params',
                                      type='group',
                                      children=params)
        self.rightwidget.setParameters(paramgroup, showTop=False)

        self.processButton.sigActivated.connect(self.processfiles)

        super(BatchPlugin, self).__init__(*args, **kwargs)
コード例 #12
0
 def _add_disable_parameter(self):
     disabled_value = False  # TODO: change once disabling is implemented
     disabled = parameterTypes.SimpleParameter(
         type="bool",
         name=self.DISABLED_NAME,
         value=disabled_value,
         readonly=False,
     )
     disabled.sigValueChanged.connect(self._on_disabled_changed)
     self.disabled = self.addChild(disabled)
     self._source_node._signal_sender.disabled_changed.connect(
         self.disabled.setValue)
コード例 #13
0
    def __init__(self, name):
        super(spacegroup, self).__init__(name=name)

        self.alpha = pTypes.SimpleParameter(type='float',
                                            name=u'α',
                                            value=90,
                                            step=.01)
        self.beta = pTypes.SimpleParameter(type='float',
                                           name=u'β',
                                           value=90,
                                           step=.01)
        self.gamma = pTypes.SimpleParameter(type='float',
                                            name=u'γ',
                                            value=90,
                                            step=.01)
        self.a = pTypes.SimpleParameter(type='float',
                                        name='a',
                                        value=10.e-9,
                                        step=1.e-9,
                                        suffix='m',
                                        siPrefix=True)
        self.b = pTypes.SimpleParameter(type='float',
                                        name='b',
                                        value=10.e-9,
                                        step=1.e-9,
                                        suffix='m',
                                        siPrefix=True)
        self.c = pTypes.SimpleParameter(type='float',
                                        name='c',
                                        value=10.e-9,
                                        step=1.e-9,
                                        suffix='m',
                                        siPrefix=True)
        self.addChildren(
            [self.alpha, self.beta, self.gamma, self.a, self.b, self.c])
コード例 #14
0
ファイル: sources.py プロジェクト: kalenkovich/cognigraph
    def __init__(self, pipeline, **kwargs):

        kwargs['title'] = 'Brainvision file'
        super().__init__(pipeline, **kwargs)

        try:
            file_path = pipeline.source.file_path
        except:
            file_path = ''
        file_path_str = parameterTypes.SimpleParameter(
            type='str', name=self.FILE_PATH_STR_NAME, value=file_path)
        file_path_str.sigValueChanged.connect(self._on_file_path_changed)
        self.file_path_str = self.addChild(file_path_str)
コード例 #15
0
    def parameter(self) -> Parameter:
        if not self._param:
            self._param = parameterTypes.GroupParameter(
                name="Line ROI",
                children=[
                    parameterTypes.SimpleParameter(
                        title="Center X", name="center_x", value=self.center_x, type="float", units="px"
                    ),
                    parameterTypes.SimpleParameter(
                        title="Center Y", name="center_y", value=self.center_y, type="float", units="px"
                    ),
                    parameterTypes.SimpleParameter(
                        title="Rotation Angle", name="rotation", value=self.rotation, type="float", units="px"
                    ),
                    parameterTypes.SimpleParameter(
                        title="Length", name="length", value=self.length, type="float", units="px"
                    ),
                    parameterTypes.SimpleParameter(title="Width", name="width", value=self.width, type="float", units="px"),
                ],
            )

            self._param.sigTreeStateChanged.connect(self.valueChanged)

        return self._param
コード例 #16
0
ファイル: tab_scene.py プロジェクト: wuxyair/kite
    def __init__(self, model, **kwargs):
        scene = model.getScene()
        kwargs['type'] = 'group'
        kwargs['name'] = 'Scene.detrend'

        KiteParameterGroup.__init__(
            self, model=model, model_attr='scene', **kwargs)

        p = {
            'name': 'demean',
            'type': 'bool',
            'value': scene.deramp.config.demean,
            'tip': 'substract mean of displacement'
        }
        self.demean = pTypes.SimpleParameter(**p)

        def toggle_demean(param, checked):
            self.model.getScene().deramp.set_demean(checked)

        self.demean.sigValueChanged.connect(toggle_demean)

        p = {
            'name': 'applied',
            'type': 'bool',
            'value': scene.deramp.config.applied,
            'tip': 'detrend the scene'
        }
        self.applied = pTypes.SimpleParameter(**p)

        def toggle_applied(param, checked):
            self.model.getScene().deramp.set_enabled(checked)

        self.applied.sigValueChanged.connect(toggle_applied)

        self.pushChild(self.applied)
        self.pushChild(self.demean)
コード例 #17
0
    def _create_parameters(self):
        file_path = self._output_node.output_path
        file_path_str = parameterTypes.SimpleParameter(
            type="str", name=self.FILE_PATH_STR_NAME, value=file_path)

        file_path_str.sigValueChanged.connect(self._on_file_path_changed)

        self.file_path_str = self.addChild(file_path_str)

        # Add PushButton for choosing file
        file_path_button = parameterTypes.ActionParameter(
            type="action", name="Change output file")

        file_path_button.sigActivated.connect(self._choose_file)

        self.file_path_button = self.addChild(file_path_button)

        start_stop_button = parameterTypes.ActionParameter(type="action",
                                                           name="Start")

        start_stop_button.sigActivated.connect(self._on_start_stop_toggled)
        self.start_stop_button = self.addChild(start_stop_button)
コード例 #18
0
    def __init__(self, model, **kwargs):
        scene = model.getScene()
        kwargs["type"] = "group"
        kwargs["name"] = "Scene.APS (empirical)"

        KiteParameterGroup.__init__(self,
                                    model=model,
                                    model_attr="scene",
                                    **kwargs)

        p = {
            "name": "applied",
            "type": "bool",
            "value": scene.aps.config.applied,
            "tip": "detrend the scene",
        }
        self.applied = pTypes.SimpleParameter(**p)

        def toggle_applied(param, checked):
            self.model.getScene().aps.set_enabled(checked)

        self.applied.sigValueChanged.connect(toggle_applied)

        self.pushChild(self.applied)
コード例 #19
0
ファイル: tab_aps.py プロジェクト: wuxyair/kite
    def __init__(self, model, **kwargs):
        scene = model.getScene()
        kwargs['type'] = 'group'
        kwargs['name'] = 'Scene.APS (empirical)'

        KiteParameterGroup.__init__(self,
                                    model=model,
                                    model_attr='scene',
                                    **kwargs)

        p = {
            'name': 'applied',
            'type': 'bool',
            'value': scene.aps.config.applied,
            'tip': 'detrend the scene'
        }
        self.applied = pTypes.SimpleParameter(**p)

        def toggle_applied(param, checked):
            self.model.getScene().aps.set_enabled(checked)

        self.applied.sigValueChanged.connect(toggle_applied)

        self.pushChild(self.applied)
コード例 #20
0
    def _create_parameters(self):
        take_abs_bool = parameterTypes.SimpleParameter(
            type="bool",
            name=self.TAKE_ABS_BOOL_NAME,
            value=True,
            readonly=True,
        )
        take_abs_bool.sigValueChanged.connect(self._on_take_abs_toggled)
        self.take_abs_bool = self.addChild(take_abs_bool)

        limits_modes = self.OUTPUT_CLASS.LIMITS_MODES
        limits_mode_values = [
            limits_modes.LOCAL,
            limits_modes.GLOBAL,
            limits_modes.MANUAL,
        ]
        limits_mode_value = self._output_node.limits_mode
        limits_mode_combo = parameterTypes.ListParameter(
            name=self.LIMITS_MODE_COMBO_NAME,
            values=limits_mode_values,
            value=limits_mode_value,
        )
        limits_mode_combo.sigValueChanged.connect(self._on_limits_mode_changed)
        self.limits_mode_combo = self.addChild(limits_mode_combo)

        lock_limits_bool = parameterTypes.SimpleParameter(
            type="bool", name=self.LOCK_LIMITS_BOOL_NAME, value=False)
        lock_limits_bool.sigValueChanged.connect(self._on_lock_limits_toggled)
        self.lock_limits_bool = self.addChild(lock_limits_bool)

        buffer_length_value = self._output_node.buffer_length
        buffer_length_slider = SliderParameter(
            name=self.BUFFER_LENGTH_SLIDER_NAME,
            limits=(0.1, 10),
            value=buffer_length_value,
            prec=3,
            suffix=" s",
        )
        buffer_length_slider.sigValueChanged.connect(
            self._on_buffer_length_changed)
        self.buffer_length_slider = self.addChild(buffer_length_slider)

        lower_limit_value = self._output_node.colormap_limits.lower
        upper_limit_value = self._output_node.colormap_limits.upper
        lower_limit_spinbox = parameterTypes.SimpleParameter(
            type="float",
            name=self.LOWER_LIMIT_SPIN_BOX_NAME,
            decimals=3,
            limits=(None, upper_limit_value),
        )
        upper_limit_spinbox = parameterTypes.SimpleParameter(
            type="float",
            name=self.UPPER_LIMIT_SPIN_BOX_NAME,
            decimals=3,
            limits=(lower_limit_value, None),
        )
        lower_limit_spinbox.sigValueChanged.connect(
            self._on_lower_limit_changed)
        upper_limit_spinbox.sigValueChanged.connect(
            self._on_upper_limit_changed)
        self.lower_limit_spinbox = self.addChild(lower_limit_spinbox)
        self.upper_limit_spinbox = self.addChild(upper_limit_spinbox)
        self._on_limits_mode_changed(None, limits_mode_value)

        threshold_value = self._output_node.threshold_pct
        threshold_slider = SliderParameter(
            name=self.THRESHOLD_SLIDER_NAME,
            limits=(0, 99),
            value=threshold_value,
            prec=0,
            suffix="%",
        )
        threshold_slider.sigValueChanged.connect(self._on_threshold_changed)
        self.threshold_slider = self.addChild(threshold_slider)

        gif_button = parameterTypes.ActionParameter(type="action",
                                                    name="Record gif")
        gif_button.sigActivated.connect(self._toggle_gif_button)
        self.gif_button = self.addChild(gif_button)

        fps_text = parameterTypes.TextParameter(name="Refresh rate, FPS",
                                                readonly=True,
                                                value="0.0")
        self.fps_text = self.addChild(fps_text)
コード例 #21
0
ファイル: tab_covariance.py プロジェクト: shaharkadmiel/kite
    def __init__(self, model, **kwargs):
        kwargs['type'] = 'group'
        kwargs['name'] = 'Scene.covariance'

        self.sp = model

        self.parameters = OrderedDict([
            ('variance', None),
            ('covariance_model',
             lambda c: ', '.join('%g' % p for p in c.covariance_model)),
            ('covariance_model_rms', None),
            ('noise_patch_size_km2', None),
            ('noise_patch_coord',
             lambda c: ', '.join([str(f) for f in c.noise_coord.tolist()])),
        ])

        model.sigCovarianceChanged.connect(self.updateValues)
        KiteParameterGroup.__init__(self,
                                    model=model,
                                    model_attr='covariance',
                                    **kwargs)

        def changeSamplingMethod():
            model.covariance.setSamplingMethod(sampling_method.value())

        p = {
            'name': 'sampling_method',
            'values': {
                'spatial random': 'spatial',
                'spectral': 'spectral',
            },
            'value': model.covariance.config.sampling_method,
            'tip': CovarianceConfig.sampling_method.help,
        }
        sampling_method = pTypes.ListParameter(**p)
        sampling_method.sigValueChanged.connect(changeSamplingMethod)

        def changeSpatialBins():
            model.covariance.setSpatialBins(spatial_bins.value())

        p = {
            'name': 'spatial_bins',
            'value': model.covariance.config.spatial_bins,
            'type': 'int',
            'limits': (25, 500),
            'step': 5,
            'edditable': True,
            'tip': CovarianceConfig.spatial_bins.help
        }

        spatial_bins = pTypes.SimpleParameter(**p)
        spatial_bins.sigValueChanged.connect(changeSpatialBins)

        def changeSpatialPairs():
            model.covariance.setSpatialPairs(spatial_pairs.value())

        p = {
            'name': 'spatial_pairs',
            'value': model.covariance.config.spatial_pairs,
            'type': 'int',
            'limits': (0, 1000000),
            'step': 50000,
            'edditable': True,
            'tip': CovarianceConfig.spatial_pairs.help
        }

        spatial_pairs = pTypes.SimpleParameter(**p)
        spatial_pairs.sigValueChanged.connect(changeSpatialPairs)

        def changeModelFunction():
            model.covariance.setModelFunction(model_function.value())

        p = {
            'name': 'model_function',
            'values': {
                'exponential': 'exponential',
                'exp + cosine': 'exponential_cosine',
            },
            'value': model.covariance.config.model_function,
            'tip': CovarianceConfig.model_function.help
        }
        model_function = pTypes.ListParameter(**p)
        model_function.sigValueChanged.connect(changeModelFunction)

        self.pushChild(model_function)
        self.pushChild(spatial_bins)
        self.pushChild(spatial_pairs)
        self.pushChild(sampling_method)
コード例 #22
0
    def __init__(self, model, **kwargs):
        kwargs["type"] = "group"
        kwargs["name"] = "Scene.covariance"

        self.sp = model

        self.parameters = OrderedDict([
            ("variance", None),
            (
                "covariance_model",
                lambda c: ", ".join("%g" % p for p in c.covariance_model),
            ),
            ("covariance_model_rms", None),
            ("noise_patch_size_km2", None),
            (
                "noise_patch_coord",
                lambda c: ", ".join(
                    ["%.2f" % f for f in c.noise_coord.tolist()]),
            ),
        ])

        model.sigCovarianceChanged.connect(self.updateValues)
        KiteParameterGroup.__init__(self,
                                    model=model,
                                    model_attr="covariance",
                                    **kwargs)

        def changeSamplingMethod():
            model.covariance.setSamplingMethod(sampling_method.value())

        p = {
            "name": "sampling_method",
            "values": {
                "spatial random": "spatial",
                "spectral": "spectral",
            },
            "value": model.covariance.config.sampling_method,
            "tip": CovarianceConfig.sampling_method.help,
        }
        sampling_method = pTypes.ListParameter(**p)
        sampling_method.sigValueChanged.connect(changeSamplingMethod)

        def changeSpatialBins():
            model.covariance.setSpatialBins(spatial_bins.value())

        p = {
            "name": "spatial_bins",
            "value": model.covariance.config.spatial_bins,
            "type": "int",
            "limits": (1, 500),
            "step": 5,
            "edditable": True,
            "tip": CovarianceConfig.spatial_bins.help,
        }

        spatial_bins = pTypes.SimpleParameter(**p)
        spatial_bins.sigValueChanged.connect(changeSpatialBins)

        def changeSpatialPairs():
            model.covariance.setSpatialPairs(spatial_pairs.value())

        p = {
            "name": "spatial_pairs",
            "value": model.covariance.config.spatial_pairs,
            "type": "int",
            "limits": (1, 1000000),
            "step": 50000,
            "edditable": True,
            "tip": CovarianceConfig.spatial_pairs.help,
        }

        spatial_pairs = pTypes.SimpleParameter(**p)
        spatial_pairs.sigValueChanged.connect(changeSpatialPairs)

        def changeModelFunction():
            model.covariance.setModelFunction(model_function.value())

        p = {
            "name": "model_function",
            "values": {
                "exponential": "exponential",
                "exp + cosine": "exponential_cosine",
            },
            "value": model.covariance.config.model_function,
            "tip": CovarianceConfig.model_function.help,
        }
        model_function = pTypes.ListParameter(**p)
        model_function.sigValueChanged.connect(changeModelFunction)

        def toggle_adaptive_subsampling(param, checked):
            model.covariance.config.adaptive_subsampling = checked

        p = {
            "name": "adaptive_subsampling",
            "type": "bool",
            "value": model.covariance.config.adaptive_subsampling,
            "tip": "detrend the scene",
        }
        adaptive_subsampling = pTypes.SimpleParameter(**p)
        adaptive_subsampling.sigValueChanged.connect(
            toggle_adaptive_subsampling)

        self.pushChild(adaptive_subsampling)
        self.pushChild(model_function)
        self.pushChild(spatial_bins)
        self.pushChild(spatial_pairs)
        self.pushChild(sampling_method)
コード例 #23
0
ファイル: tab_quadtree.py プロジェクト: wsja/kite
    def __init__(self, model, plot, *args, **kwargs):
        self.plot = plot
        self.sig_guard = True
        self.sp = model

        kwargs['type'] = 'group'
        kwargs['name'] = 'Scene.quadtree'
        self.parameters = OrderedDict(
            [('nleaves', None),
             ('reduction_rms', None),
             ('reduction_efficiency', None),
             ('epsilon_min', None),
             ('nnodes', None),
             ])

        KiteParameterGroup.__init__(
            self,
            model=model,
            model_attr='quadtree',
            **kwargs)

        model.sigQuadtreeConfigChanged.connect(self.onConfigUpdate)
        model.sigQuadtreeChanged.connect(self.updateValues)

        self.sigEpsilon.connect(model.qtproxy.setEpsilon)
        self.sigNanFraction.connect(model.qtproxy.setNanFraction)
        self.sigTileMaximum.connect(model.qtproxy.setTileMaximum)
        self.sigTileMinimum.connect(model.qtproxy.setTileMinimum)

        def updateGuard(func):

            def wrapper(*args, **kwargs):
                if not self.sig_guard:
                    func()

            return wrapper

        # Epsilon control
        @updateGuard
        @QtCore.pyqtSlot()
        def updateEpsilon():
            self.sigEpsilon.emit(self.epsilon.value())

        eps_decimals = -math.floor(math.log10(model.quadtree.epsilon_min))
        eps_steps = round((model.quadtree.epsilon -
                           model.quadtree.epsilon_min)*.1, 3)

        p = {
            'name': 'epsilon',
            'type': 'float',
            'value': model.quadtree.epsilon,
            'default': model.quadtree._epsilon_init,
            'step': eps_steps,
            'limits': (model.quadtree.epsilon_min,
                       3*model.quadtree._epsilon_init),
            'editable': True,
            'decimals': eps_decimals,
            'slider_exponent': 2,
            'tip': QuadtreeConfig.epsilon.help
        }
        self.epsilon = pTypes.SimpleParameter(**p)
        self.epsilon.itemClass = SliderWidgetParameterItem
        self.epsilon.sigValueChanged.connect(updateEpsilon)

        @updateGuard
        @QtCore.pyqtSlot()
        def updateNanFrac():
            self.sigNanFraction.emit(self.nan_allowed.value())

        p = {
            'name': 'nan_allowed',
            'type': 'float',
            'value': model.quadtree.nan_allowed,
            'default': QuadtreeConfig.nan_allowed.default(),
            'step': 0.05,
            'limits': (0., 1.),
            'editable': True,
            'decimals': 2,
            'tip': QuadtreeConfig.nan_allowed.help
        }
        self.nan_allowed = pTypes.SimpleParameter(**p)
        self.nan_allowed.itemClass = SliderWidgetParameterItem
        self.nan_allowed.sigValueChanged.connect(updateNanFrac)

        # Tile size controls
        @updateGuard
        @QtCore.pyqtSlot()
        def updateTileSizeMin():
            self.sigTileMinimum.emit(self.tile_size_min.value())

        frame = model.frame
        max_px = max(frame.shape)
        max_pxd = max(frame.dE, frame.dN)
        limits = (max_pxd * model.quadtree.min_node_length_px,
                  max_pxd * (max_px / 4))

        tile_decimals = -math.floor(math.log10(model.quadtree.tile_size_min))

        p = {'name': 'tile_size_min',
             'type': 'float',
             'value': model.quadtree.tile_size_min,
             'default': QuadtreeConfig.tile_size_min.default(),
             'limits': limits,
             'step': 250,
             'slider_exponent': 2,
             'editable': True,
             'suffix': ' m' if frame.isMeter() else ' deg',
             'decimals': 0 if frame.isMeter() else tile_decimals,
             'tip': QuadtreeConfig.tile_size_min.help
             }
        self.tile_size_min = pTypes.SimpleParameter(**p)
        self.tile_size_min.itemClass = SliderWidgetParameterItem

        @updateGuard
        def updateTileSizeMax():
            self.sigTileMaximum.emit(self.tile_size_max.value())

        p.update({'name': 'tile_size_max',
                  'value': model.quadtree.tile_size_max,
                  'default': QuadtreeConfig.tile_size_max.default(),
                  'tip': QuadtreeConfig.tile_size_max.help
                  })
        self.tile_size_max = pTypes.SimpleParameter(**p)
        self.tile_size_max.itemClass = SliderWidgetParameterItem

        self.tile_size_min.sigValueChanged.connect(updateTileSizeMin)
        self.tile_size_max.sigValueChanged.connect(updateTileSizeMax)

        # Component control
        @QtCore.pyqtSlot()
        def changeComponent():
            self.plot.component = self.components.value()

        p = {'name': 'display',
             'values': {
                'QuadNode.mean': 'mean',
                'QuadNode.median': 'median',
                'QuadNode.weight': 'weight',
             },
             'value': 'mean',
             'tip': 'Change displayed component'
             }
        self.components = pTypes.ListParameter(**p)
        self.components.sigValueChanged.connect(changeComponent)

        @QtCore.pyqtSlot()
        def changeCorrection():
            model.quadtree.setCorrection(correction_method.value())
            self.updateEpsilonLimits()

        p = {'name': 'setCorrection',
             'values': {
                'Mean (Jonsson, 2002)': 'mean',
                'Median (Jonsson, 2002)': 'median',
                'Bilinear (Jonsson, 2002)': 'bilinear',
                'SD (Jonsson, 2002)': 'std',
                 },
             'value': model.quadtree.config.correction,
             'tip': QuadtreeConfig.correction.help
             }
        correction_method = pTypes.ListParameter(**p)
        correction_method.sigValueChanged.connect(changeCorrection)

        self.sig_guard = False
        self.pushChild(correction_method)
        self.pushChild(self.tile_size_max)
        self.pushChild(self.tile_size_min)
        self.pushChild(self.nan_allowed)
        self.pushChild(self.epsilon)
        self.pushChild(self.components)
コード例 #24
0
    def __init__(self, model, plot, *args, **kwargs):
        self.plot = plot
        self.sig_guard = True
        self.sp = model

        kwargs["type"] = "group"
        kwargs["name"] = "Scene.quadtree"
        self.parameters = OrderedDict(
            [
                ("nleaves", None),
                ("reduction_rms", None),
                # ('reduction_efficiency', None),
                # ('epsilon_min', None),
                ("nnodes", None),
            ]
        )

        KiteParameterGroup.__init__(self, model=model, model_attr="quadtree", **kwargs)

        model.sigQuadtreeConfigChanged.connect(self.onConfigUpdate)
        model.sigQuadtreeChanged.connect(self.updateValues)

        self.sigEpsilon.connect(model.qtproxy.setEpsilon)
        self.sigNanFraction.connect(model.qtproxy.setNanFraction)
        self.sigTileMaximum.connect(model.qtproxy.setTileMaximum)
        self.sigTileMinimum.connect(model.qtproxy.setTileMinimum)

        def updateGuard(func):
            def wrapper(*args, **kwargs):
                if not self.sig_guard:
                    func()

            return wrapper

        # Epsilon control
        @updateGuard
        @QtCore.pyqtSlot()
        def updateEpsilon():
            self.sigEpsilon.emit(self.epsilon.value())

        eps_decimals = -math.floor(math.log10(model.quadtree.epsilon_min or 1e-3))
        eps_steps = round(
            (model.quadtree.epsilon - model.quadtree.epsilon_min) * 0.1, 3
        )

        p = {
            "name": "epsilon",
            "type": "float",
            "value": model.quadtree.epsilon,
            "default": model.quadtree._epsilon_init,
            "step": eps_steps,
            "limits": (model.quadtree.epsilon_min, 3 * model.quadtree._epsilon_init),
            "editable": True,
            "decimals": eps_decimals,
            "slider_exponent": 2,
            "tip": QuadtreeConfig.epsilon.help,
        }
        self.epsilon = pTypes.SimpleParameter(**p)
        self.epsilon.itemClass = SliderWidgetParameterItem
        self.epsilon.sigValueChanged.connect(updateEpsilon)

        @updateGuard
        @QtCore.pyqtSlot()
        def updateNanFrac():
            self.sigNanFraction.emit(self.nan_allowed.value())

        p = {
            "name": "nan_allowed",
            "type": "float",
            "value": model.quadtree.nan_allowed,
            "default": QuadtreeConfig.nan_allowed.default(),
            "step": 0.05,
            "limits": (0.0, 1.0),
            "editable": True,
            "decimals": 2,
            "tip": QuadtreeConfig.nan_allowed.help,
        }
        self.nan_allowed = pTypes.SimpleParameter(**p)
        self.nan_allowed.itemClass = SliderWidgetParameterItem
        self.nan_allowed.sigValueChanged.connect(updateNanFrac)

        # Tile size controls
        @updateGuard
        @QtCore.pyqtSlot()
        def updateTileSizeMin():
            self.sigTileMinimum.emit(self.tile_size_min.value())

        frame = model.frame
        max_px = max(frame.shape)
        max_pxd = max(frame.dE, frame.dN)
        limits = (max_pxd * model.quadtree.min_node_length_px, max_pxd * (max_px / 4))

        tile_decimals = 2

        p = {
            "name": "tile_size_min",
            "type": "float",
            "value": model.quadtree.tile_size_min,
            "default": QuadtreeConfig.tile_size_min.default(),
            "limits": limits,
            "step": 250,
            "slider_exponent": 2,
            "editable": True,
            "suffix": " m" if frame.isMeter() else "°",
            "decimals": 0 if frame.isMeter() else tile_decimals,
            "tip": QuadtreeConfig.tile_size_min.help,
        }
        self.tile_size_min = pTypes.SimpleParameter(**p)
        self.tile_size_min.itemClass = SliderWidgetParameterItem

        @updateGuard
        def updateTileSizeMax():
            self.sigTileMaximum.emit(self.tile_size_max.value())

        p.update(
            {
                "name": "tile_size_max",
                "value": model.quadtree.tile_size_max,
                "default": QuadtreeConfig.tile_size_max.default(),
                "tip": QuadtreeConfig.tile_size_max.help,
            }
        )
        self.tile_size_max = pTypes.SimpleParameter(**p)
        self.tile_size_max.itemClass = SliderWidgetParameterItem

        self.tile_size_min.sigValueChanged.connect(updateTileSizeMin)
        self.tile_size_max.sigValueChanged.connect(updateTileSizeMax)

        # Component control
        @QtCore.pyqtSlot()
        def changeComponent():
            self.plot.component = self.components.value()

        p = {
            "name": "display",
            "values": {
                "QuadNode.mean": "mean",
                "QuadNode.median": "median",
                "QuadNode.weight": "weight",
            },
            "value": "mean",
            "tip": "Change displayed component",
        }
        self.components = pTypes.ListParameter(**p)
        self.components.sigValueChanged.connect(changeComponent)

        @QtCore.pyqtSlot()
        def changeCorrection():
            model.quadtree.setCorrection(correction_method.value())
            self.updateEpsilonLimits()

        p = {
            "name": "setCorrection",
            "values": {
                "Mean (Jonsson, 2002)": "mean",
                "Median (Jonsson, 2002)": "median",
                "Bilinear (Jonsson, 2002)": "bilinear",
                "SD (Jonsson, 2002)": "std",
            },
            "value": model.quadtree.config.correction,
            "tip": QuadtreeConfig.correction.help,
        }
        correction_method = pTypes.ListParameter(**p)
        correction_method.sigValueChanged.connect(changeCorrection)

        self.sig_guard = False
        self.pushChild(correction_method)
        self.pushChild(self.tile_size_max)
        self.pushChild(self.tile_size_min)
        self.pushChild(self.nan_allowed)
        self.pushChild(self.epsilon)
        self.pushChild(self.components)
コード例 #25
0
    def __init__(self, model, **kwargs):
        from datetime import datetime as dt
        kwargs['type'] = 'group'
        kwargs['name'] = '.meta'

        def str_to_time(d, fmt='%Y-%m-%d %H:%M:%S'):
            return dt.strftime(dt.fromtimestamp(d), fmt)

        self.parameters = OrderedDict([
            ('time_master',
             lambda sc: str_to_time(sc.meta.time_master)),
            ('time_slave',
             lambda sc: str_to_time(sc.meta.time_slave)),
            ('time_separation',
             lambda sc: '%s' % sc.meta.time_separation),
            ])

        model.sigConfigChanged.connect(self.updateValues)

        KiteParameterGroup.__init__(self,
                                    model=model,
                                    model_attr='scene',
                                    **kwargs)

        def update_meta_info(key, value):
            self.model.scene.meta.__setattr__(key, value)

        p = {'name': 'scene_title',
             'value': self.model.scene.meta.scene_title,
             'type': 'str',
             'tip': 'Title of the displacement scene'
             }

        self.scene_title = pTypes.SimpleParameter(**p)
        self.scene_title.sigValueChanged.connect(
            lambda v: update_meta_info('scene_title', v.value()))

        p = {'name': 'scene_id',
             'value': self.model.scene.meta.scene_id,
             'type': 'str'
             }

        self.scene_id = pTypes.SimpleParameter(**p)
        self.scene_id.sigValueChanged.connect(
            lambda v: update_meta_info('scene_id', v.value()))

        p = {'name': 'satellite_name',
             'value': self.model.scene.meta.satellite_name,
             'type': 'str',
             'tip': 'Name of the satellite'
             }

        self.satellite_name = pTypes.SimpleParameter(**p)
        self.satellite_name.sigValueChanged.connect(
            lambda v: update_meta_info('satellite_name', v.value()))

        p = {'name': 'orbital_node',
             'values': {
                'Ascending': 'Ascending',
                'Descending': 'Descending',
                'Undefined': 'Undefined',
             },
             'value': self.model.scene.meta.orbital_node,
             'tip': 'Satellite orbit direction'
             }
        self.orbital_node = pTypes.ListParameter(**p)
        self.orbital_node.sigValueChanged.connect(
            lambda v: update_meta_info('orbital_node', v.value()))

        self.pushChild(self.orbital_node)
        self.pushChild(self.satellite_name)
        self.pushChild(self.scene_id)
        self.pushChild(self.scene_title)
コード例 #26
0
    def __init__(self):
        super(spacegroupwidget, self).__init__()
        self.parameter = pTypes.GroupParameter(name='')
        self.setParameters(self.parameter, showTop=False)
        self.crystalsystem = pTypes.ListParameter(type='list',
                                                  name='Crystal System',
                                                  values=spacegrouptypes,
                                                  value=None)
        self.spacegroupparameter = pTypes.ListParameter(
            type='list',
            name='Space Group',
            values=spacegroupnames[0],
            value=None)
        self.rotationstyle = pTypes.ListParameter(type='list',
                                                  name='Rotation Mode',
                                                  values=[
                                                      'Sample-frame vector',
                                                      'Crystal-frame vector',
                                                      'Crystal plane'
                                                  ])
        self.rotationstyle.sigValueChanged.connect(self.rotationmodechanged)

        self.rotationxyz = VectorParameter(name='Vector (x,y,z)')
        self.rotationvectorsample = hideableGroup(
            name='Rotation (sample-frame vector)', children=[self.rotationxyz])
        self.rotationxyz.setValue([0, 0, 1])

        self.rotationuvw = VectorParameter(name='Vector (u,v,w)')
        self.rotationvectorcrystal = hideableGroup(
            name='Rotation (crystal-frame vector)',
            children=[self.rotationuvw])
        self.rotationuvw.setValue([0, 0, 1])

        self.rotationhkl = VectorParameter(name='Vector (h,k,l)')
        self.rotationplane = hideableGroup(name='Rotation (crystal plane)',
                                           children=[self.rotationhkl])
        self.rotationhkl.setValue([0, 0, 1])

        self.spacegroupeditors = [
            triclinicparameter(),
            monoclinicparameter(),
            orthorhombicparameter(),
            tetragonalparameter(),
            trigonalparameter(),
            hexagonalparameter(),
            cubicparameter()
        ]
        self.rotations = [
            self.rotationvectorsample, self.rotationvectorcrystal,
            self.rotationplane
        ]

        self.delta = pTypes.SimpleParameter(name=u'δ',
                                            type='float',
                                            value=2.67150153E-06)
        self.beta = pTypes.SimpleParameter(name=u'β',
                                           type='float',
                                           value=3.71373554E-09)
        self.refractiveindex = pTypes.GroupParameter(
            name='Refractive Index', children=[self.delta, self.beta])

        self.redrawsg = pTypes.ActionParameter(name='Overlay space group')
        self.redrawsg.sigActivated.connect(self.drawoverlay)

        self.parameter.addChildren(
            [self.crystalsystem, self.spacegroupparameter] +
            self.spacegroupeditors + [self.rotationstyle] + self.rotations +
            [self.refractiveindex, self.redrawsg])

        self.hidechildren()
        self.hiderotations()
        self.parameter.children()[2].show()
        self.rotations[0].show()
        self.crystalsystem.sigValueChanged.connect(self.crystalsystemchanged)
コード例 #27
0
    def __init__(self, model, **kwargs):
        from datetime import datetime as dt

        kwargs["type"] = "group"
        kwargs["name"] = ".meta"

        def str_to_time(d, fmt="%Y-%m-%d %H:%M:%S"):
            return dt.strftime(dt.fromtimestamp(d), fmt)

        self.parameters = OrderedDict(
            [
                ("time_master", lambda sc: str_to_time(sc.meta.time_master)),
                ("time_slave", lambda sc: str_to_time(sc.meta.time_slave)),
                ("time_separation", lambda sc: "%s" % sc.meta.time_separation),
            ]
        )

        model.sigConfigChanged.connect(self.updateValues)

        KiteParameterGroup.__init__(self, model=model, model_attr="scene", **kwargs)

        def update_meta_info(key, value):
            self.model.scene.meta.__setattr__(key, value)

        p = {
            "name": "scene_title",
            "value": self.model.scene.meta.scene_title,
            "type": "str",
            "tip": "Title of the displacement scene",
        }

        self.scene_title = pTypes.SimpleParameter(**p)
        self.scene_title.sigValueChanged.connect(
            lambda v: update_meta_info("scene_title", v.value())
        )

        p = {"name": "scene_id", "value": self.model.scene.meta.scene_id, "type": "str"}

        self.scene_id = pTypes.SimpleParameter(**p)
        self.scene_id.sigValueChanged.connect(
            lambda v: update_meta_info("scene_id", v.value())
        )

        p = {
            "name": "satellite_name",
            "value": self.model.scene.meta.satellite_name,
            "type": "str",
            "tip": "Name of the satellite",
        }

        self.satellite_name = pTypes.SimpleParameter(**p)
        self.satellite_name.sigValueChanged.connect(
            lambda v: update_meta_info("satellite_name", v.value())
        )

        p = {
            "name": "orbital_node",
            "values": {
                "Ascending": "Ascending",
                "Descending": "Descending",
                "Undefined": "Undefined",
            },
            "value": self.model.scene.meta.orbital_node,
            "tip": "Satellite orbit direction",
        }
        self.orbital_node = pTypes.ListParameter(**p)
        self.orbital_node.sigValueChanged.connect(
            lambda v: update_meta_info("orbital_node", v.value())
        )

        self.pushChild(self.orbital_node)
        self.pushChild(self.satellite_name)
        self.pushChild(self.scene_id)
        self.pushChild(self.scene_title)
コード例 #28
0
    def _create_parameters(self):

        take_abs_bool = parameterTypes.SimpleParameter(
            type='bool',
            name=self.TAKE_ABS_BOOL_NAME,
            value=True,
            readonly=True)
        take_abs_bool.sigValueChanged.connect(self._on_take_abs_toggled)
        self.take_abs_bool = self.addChild(take_abs_bool)

        limits_modes = self.OUTPUT_CLASS.LIMITS_MODES
        limits_mode_values = [
            limits_modes.LOCAL, limits_modes.GLOBAL, limits_modes.MANUAL
        ]
        limits_mode_value = self._output_node.limits_mode
        limits_mode_combo = parameterTypes.ListParameter(
            name=self.LIMITS_MODE_COMBO_NAME,
            values=limits_mode_values,
            value=limits_mode_value)
        limits_mode_combo.sigValueChanged.connect(self._on_limits_mode_changed)
        self.limits_mode_combo = self.addChild(limits_mode_combo)

        lock_limits_bool = parameterTypes.SimpleParameter(
            type='bool', name=self.LOCK_LIMITS_BOOL_NAME, value=False)
        lock_limits_bool.sigValueChanged.connect(self._on_lock_limits_toggled)
        self.lock_limits_bool = self.addChild(lock_limits_bool)

        buffer_length_value = self._output_node.buffer_length
        buffer_length_slider = SliderParameter(
            name=self.BUFFER_LENGTH_SLIDER_NAME,
            limits=(0.1, 10),
            value=buffer_length_value,
            prec=3,
            suffix=' s')
        buffer_length_slider.sigValueChanged.connect(
            self._on_buffer_length_changed)
        self.buffer_length_slider = self.addChild(buffer_length_slider)

        lower_limit_value = self._output_node.colormap_limits.lower
        upper_limit_value = self._output_node.colormap_limits.upper
        lower_limit_spinbox = parameterTypes.SimpleParameter(
            type='float',
            name=self.LOWER_LIMIT_SPIN_BOX_NAME,
            decimals=3,
            limits=(None, upper_limit_value))
        upper_limit_spinbox = parameterTypes.SimpleParameter(
            type='float',
            name=self.UPPER_LIMIT_SPIN_BOX_NAME,
            decimals=3,
            limits=(lower_limit_value, None))
        lower_limit_spinbox.sigValueChanged.connect(
            self._on_lower_limit_changed)
        upper_limit_spinbox.sigValueChanged.connect(
            self._on_upper_limit_changed)
        self.lower_limit_spinbox = self.addChild(
            lower_limit_spinbox)  # type: parameterTypes.SimpleParameter
        self.upper_limit_spinbox = self.addChild(
            upper_limit_spinbox)  # type: parameterTypes.SimpleParameter

        threshold_value = self._output_node.threshold_pct
        threshold_slider = SliderParameter(name=self.THRESHOLD_SLIDER_NAME,
                                           limits=(0, 99),
                                           value=threshold_value,
                                           prec=0,
                                           suffix='%')
        threshold_slider.sigValueChanged.connect(self._on_threshold_changed)
        self.threshold_slider = self.addChild(threshold_slider)
コード例 #29
0
ファイル: tab_quadtree.py プロジェクト: hvasbath/kite
    def __init__(self, model, plot, *args, **kwargs):
        self.plot = plot
        self.sig_guard = True
        self.sp = model

        kwargs['type'] = 'group'
        kwargs['name'] = 'Scene.quadtree'
        self.parameters = OrderedDict([
            ('nleaves', None),
            ('reduction_rms', None),
            ('reduction_efficiency', None),
            ('epsilon_min', None),
            ('nnodes', None),
        ])

        KiteParameterGroup.__init__(self,
                                    model=model,
                                    model_attr='quadtree',
                                    **kwargs)

        model.sigQuadtreeConfigChanged.connect(self.onConfigUpdate)
        model.sigQuadtreeChanged.connect(self.updateValues)

        self.sigEpsilon.connect(model.qtproxy.setEpsilon)
        self.sigNanFraction.connect(model.qtproxy.setNanFraction)
        self.sigTileMaximum.connect(model.qtproxy.setTileMaximum)
        self.sigTileMinimum.connect(model.qtproxy.setTileMinimum)

        def updateGuard(func):
            def wrapper(*args, **kwargs):
                if not self.sig_guard:
                    func()

            return wrapper

        # Epsilon control
        @updateGuard
        def updateEpsilon():
            self.sigEpsilon.emit(self.epsilon.value())

        p = {
            'name':
            'epsilon',
            'value':
            model.quadtree.epsilon,
            'type':
            'float',
            'default':
            model.quadtree._epsilon_init,
            'step':
            round((model.quadtree.epsilon - model.quadtree.epsilon_min) * .1,
                  3),
            'limits':
            (model.quadtree.epsilon_min, 3 * model.quadtree._epsilon_init),
            'editable':
            True
        }
        self.epsilon = pTypes.SimpleParameter(**p)
        self.epsilon.itemClass = SliderWidgetParameterItem
        self.epsilon.sigValueChanged.connect(updateEpsilon)

        # Epsilon control
        @updateGuard
        def updateNanFrac():
            self.sigNanFraction.emit(self.nan_allowed.value())

        p = {
            'name': 'nan_allowed',
            'value': model.quadtree.nan_allowed,
            'default': QuadtreeConfig.nan_allowed.default(),
            'type': 'float',
            'step': 0.05,
            'limits': (0., 1.),
            'editable': True,
        }
        self.nan_allowed = pTypes.SimpleParameter(**p)
        self.nan_allowed.itemClass = SliderWidgetParameterItem
        self.nan_allowed.sigValueChanged.connect(updateNanFrac)

        # Tile size controls
        @updateGuard
        def updateTileSizeMin():
            self.sigTileMinimum.emit(self.tile_size_min.value())

        p = {
            'name': 'tile_size_min',
            'value': model.quadtree.tile_size_min,
            'default': QuadtreeConfig.tile_size_min.default(),
            'type': 'int',
            'limits': (50, 50000),
            'step': 100,
            'editable': True,
            'suffix': 'm'
        }
        self.tile_size_min = pTypes.SimpleParameter(**p)
        self.tile_size_min.itemClass = SliderWidgetParameterItem

        @updateGuard
        def updateTileSizeMax():
            self.sigTileMaximum.emit(self.tile_size_max.value())

        p.update({
            'name': 'tile_size_max',
            'value': model.quadtree.tile_size_max,
            'default': QuadtreeConfig.tile_size_max.default()
        })
        self.tile_size_max = pTypes.SimpleParameter(**p)
        self.tile_size_max.itemClass = SliderWidgetParameterItem

        self.tile_size_min.sigValueChanged.connect(updateTileSizeMin)
        self.tile_size_max.sigValueChanged.connect(updateTileSizeMax)

        # Component control
        def changeComponent():
            self.plot.component = self.components.value()

        p = {
            'name': 'display',
            'values': {
                'QuadNode.mean': 'mean',
                'QuadNode.median': 'median',
                'QuadNode.weight': 'weight',
            },
            'value': 'mean'
        }
        self.components = pTypes.ListParameter(**p)
        self.components.sigValueChanged.connect(changeComponent)

        def changeCorrection():
            model.quadtree.setCorrection(correction_method.value())
            self.updateEpsilonLimits()

        p = {
            'name': 'setCorrection',
            'values': {
                'Mean (Jonsson, 2002)': 'mean',
                'Median (Jonsson, 2002)': 'median',
                'Bilinear (Jonsson, 2002)': 'bilinear',
                'SD (Jonsson, 2002)': 'std',
            },
            'value': QuadtreeConfig.correction.default()
        }
        correction_method = pTypes.ListParameter(**p)
        correction_method.sigValueChanged.connect(changeCorrection)

        self.sig_guard = False
        self.pushChild(correction_method)
        self.pushChild(self.tile_size_max)
        self.pushChild(self.tile_size_min)
        self.pushChild(self.nan_allowed)
        self.pushChild(self.epsilon)
        self.pushChild(self.components)