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)
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")
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
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)
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()