コード例 #1
0
    def parse_formulas(self, text):
        self.parameters_dictionary.clear()

        is_empty = False

        try:
            congruence.checkEmptyString(text, "")
        except:
            is_empty = True

        if not is_empty:
            lines = text.splitlines()

            for i in range(len(lines)):
                is_line_empty = False
                try:
                    congruence.checkEmptyString(lines[i], "")
                except:
                    is_line_empty = True

                if not is_line_empty:
                    data = lines[i].strip().split("=")

                    if len(data) != 2: raise ValueError("Free Output Parameters, malformed line:" + str(i+1))

                    name       = data[0].strip()
                    expression = data[1].strip()

                    self.set_parameter_expression(name, expression)
コード例 #2
0
    def create_fitter(cls,
                      fitter_name=FitterName.MINPACK,
                      additional_data=None):
        congruence.checkEmptyString(fitter_name, "Fitter Name")

        if fitter_name == FitterName.MINPACK:
            return FitterMinpack()
        else:
            raise ValueError("Fitter name <" + fitter_name +
                             "> not recognized")
コード例 #3
0
    def append_fit_initialization(self):
        if self.use_structure == 0:
            crystal_structure = CrystalStructure.init_cube(a0=self.widget.populate_parameter_in_widget(self, "a", self.get_parameters_prefix()),
                                                           symmetry=self.cb_symmetry.currentText(),
                                                           progressive=self.get_parameter_progressive())

            self.widget.fit_global_parameters.fit_initialization.crystal_structures.append(crystal_structure)
            self.widget.fit_global_parameters.evaluate_functions() # in case that a is a function of other parameters

            crystal_structure.parse_reflections(self.reflections, progressive=self.get_parameter_progressive())

        elif self.use_structure == 1:
            crystal_structure = CrystalStructure.init_cube(a0=self.widget.populate_parameter_in_widget(self, "a", self.get_parameters_prefix()),
                                                           symmetry=self.cb_symmetry.currentText(),
                                                           use_structure=True,
                                                           formula=congruence.checkEmptyString(self.formula, "Chemical Formula"),
                                                           intensity_scale_factor=self.widget.populate_parameter_in_widget(self, "intensity_scale_factor", self.get_parameters_prefix()),
                                                           progressive=self.get_parameter_progressive())

            self.widget.fit_global_parameters.fit_initialization.crystal_structures.append(crystal_structure)
            self.widget.fit_global_parameters.evaluate_functions() # in case that a is a function of other parameters

            crystal_structure.parse_reflections(self.reflections, progressive=self.get_parameter_progressive())

            #intensities will be ignored
            for reflection in crystal_structure.get_reflections():
                reflection.intensity.fixed = True

        if not self.widget.fit_global_parameters.fit_initialization is None \
           and not self.widget.fit_global_parameters.fit_initialization.diffraction_patterns is None:

            diffraction_pattern = self.widget.fit_global_parameters.fit_initialization.diffraction_patterns[self.index]

            if not diffraction_pattern.wavelength.function:
                wavelength = diffraction_pattern.wavelength.value
                s_min = diffraction_pattern.get_diffraction_point(0).s
                s_max = diffraction_pattern.get_diffraction_point(-1).s

                excluded_reflections = crystal_structure.get_congruence_check(wavelength=wavelength,
                                                                              min_value=s_min,
                                                                              max_value=s_max)

                if not excluded_reflections is None:
                    text_before = "The following reflections lie outside the diffraction pattern nr " + str(self.index+1) + ":"

                    text = ""
                    for reflection in excluded_reflections:
                        text += "[" + str(reflection.h) + ", " + str(reflection.k) + ", " + str(reflection.l) +"]\n"

                    text_after = "Proceed anyway?"

                    if not ConfirmTextDialog.confirm_text("Confirm Structure", text,
                                                          text_after=text_after, text_before=text_before,
                                                          width=350, parent=self): return

        return crystal_structure
コード例 #4
0
    def set_data(self, crystal_structure):
        self.widget.populate_fields_in_widget(self, "a", crystal_structure.a)
        self.use_structure = 1 if crystal_structure.use_structure else 0

        if self.use_structure == 0:
            existing_crystal_structure = CrystalStructure.init_cube(
                a0=self.widget.populate_parameter_in_widget(
                    self, "a", self.get_parameters_prefix()),
                symmetry=self.cb_symmetry.currentText(),
                progressive=self.get_parameter_progressive())

        elif self.use_structure == 1:
            self.widget.populate_fields_in_widget(
                self, "intensity_scale_factor",
                crystal_structure.intensity_scale_factor)

            existing_crystal_structure = CrystalStructure.init_cube(
                a0=self.widget.populate_parameter_in_widget(
                    self, "a", self.get_parameters_prefix()),
                symmetry=self.cb_symmetry.currentText(),
                use_structure=True,
                formula=congruence.checkEmptyString(self.formula,
                                                    "Chemical Formula"),
                intensity_scale_factor=self.widget.
                populate_parameter_in_widget(self, "intensity_scale_factor",
                                             self.get_parameters_prefix()),
                progressive=self.get_parameter_progressive())

        if not self.text_area.toPlainText().strip() == "":
            existing_crystal_structure.parse_reflections(
                self.text_area.toPlainText(),
                progressive=self.get_parameter_progressive())

        simmetries = Symmetry.tuple()
        for index in range(0, len(simmetries)):
            if simmetries[index] == crystal_structure.symmetry:
                self.symmetry = index

        for reflection in crystal_structure.get_reflections():
            existing_reflection = existing_crystal_structure.existing_reflection(
                reflection.h, reflection.k, reflection.l)

            if existing_reflection is None:
                existing_crystal_structure.add_reflection(reflection)
            else:
                existing_reflection.intensity.value = reflection.intensity.value

        text = ""

        for reflection in existing_crystal_structure.get_reflections():
            text += reflection.to_row() + "\n"

        self.text_area.setText(text)
コード例 #5
0
    def parse_reflections(self, text, progressive=""):
        congruence.checkEmptyString(text, "Reflections")

        lines = text.splitlines()

        reflections = []

        for i in range(len(lines)):
            congruence.checkEmptyString(lines[i],
                                        "Reflections: line " + str(i + 1))

            if not lines[i].strip().startswith("#"):
                data = lines[i].strip().split(",")

                if len(data) < 4:
                    raise ValueError("Reflections, malformed line: " +
                                     str(i + 1))

                h = int(data[0].strip())
                k = int(data[1].strip())
                l = int(data[2].strip())

                if ":=" in data[3].strip():
                    intensity_data = data[3].strip().split(":=")

                    if len(intensity_data) == 2:
                        intensity_name = intensity_data[0].strip()
                        function_value = intensity_data[1].strip()
                    else:
                        intensity_name = None
                        function_value = data[3].strip()

                    if intensity_name is None:
                        intensity_name = CrystalStructure.get_parameters_prefix(
                        ) + progressive + "I" + str(h) + str(k) + str(l)
                    elif not intensity_name.startswith(
                            CrystalStructure.get_parameters_prefix()):
                        intensity_name = CrystalStructure.get_parameters_prefix(
                        ) + progressive + intensity_name

                    reflection = Reflection(h,
                                            k,
                                            l,
                                            intensity=FitParameter(
                                                parameter_name=intensity_name,
                                                function=True,
                                                function_value=function_value))
                else:

                    intensity_data = data[3].strip().split()

                    if len(intensity_data) == 2:
                        intensity_name = intensity_data[0].strip()
                        intensity_value = float(intensity_data[1])
                    else:
                        intensity_name = None
                        intensity_value = float(data[3])

                    boundary = None
                    fixed = False

                    if len(data) > 4:
                        min_value = PARAM_HWMIN
                        max_value = PARAM_HWMAX

                        for j in range(4, len(data)):
                            boundary_data = data[j].strip().split()

                            if boundary_data[0] == "min":
                                min_value = float(boundary_data[1].strip())
                            elif boundary_data[0] == "max":
                                max_value = float(boundary_data[1].strip())
                            elif boundary_data[0] == "fixed":
                                fixed = True

                        if not fixed:
                            if min_value != PARAM_HWMIN or max_value != PARAM_HWMAX:
                                boundary = Boundary(min_value=min_value,
                                                    max_value=max_value)
                            else:
                                boundary = Boundary()

                    if intensity_name is None:
                        intensity_name = CrystalStructure.get_parameters_prefix(
                        ) + progressive + "I" + str(h) + str(k) + str(l)
                    elif not intensity_name.startswith(
                            CrystalStructure.get_parameters_prefix()):
                        intensity_name = CrystalStructure.get_parameters_prefix(
                        ) + progressive + intensity_name

                    reflection = Reflection(h,
                                            k,
                                            l,
                                            intensity=FitParameter(
                                                parameter_name=intensity_name,
                                                value=intensity_value,
                                                fixed=fixed,
                                                boundary=boundary))
                reflections.append(reflection)

        self.reflections = reflections
        self.update_reflections()