Source code for G2export_Bracket

#!/usr/bin/env python
# -*- coding: utf-8 -*-
########### SVN repository information ###################
# $Date: 2022-11-06 12:25:48 -0600 (Sun, 06 Nov 2022) $
# $Author: toby $
# $Revision: 5365 $
# $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/exports/G2export_Bracket.py $
# $Id: G2export_Bracket.py 5365 2022-11-06 18:25:48Z toby $
########### SVN repository information ###################

# This module initially written by Conrad Gillard. For any enquiries please contact conrad.gillard@gmail.com
# Export3col exporter adapted from Exportbracket by BHT
from __future__ import division, print_function
import wx
import GSASIIpath
GSASIIpath.SetVersionNumber("$Revision: 5365 $")
import GSASIIIO as G2IO
from collections import OrderedDict
from GSASIImath import ValEsd

[docs] class Exportbracket(G2IO.ExportBaseclass): '''Enables export of parameters that are commonly needed for publications, in bracket notation ''' def __init__(self, G2frame): G2IO.ExportBaseclass.__init__(self,G2frame=G2frame,formatName='Bracket notation CSV', extension='.csv',longFormatName='Export commonly needed parameters') self.exporttype = ['project'] def Exporter(self, event=None): # Define function to extract parameter and sigma from covariances, for later use def GetParamSig(phase_num, hist_num, keyword, display_name): param_index = None try: param_index = self.OverallParms['Covariance']['varyList'].index(phase_num + ':' + hist_num + keyword) except: pass if param_index is not None: param = self.OverallParms['Covariance']['variables'][param_index] # Extract parameter uncertainty param_sig = self.OverallParms['Covariance']['sig'][param_index] # Create dictionary entry containing parameter and sigma in bracket notation model_parameters[display_name] = ValEsd(param, param_sig) # # set up for export self.InitExport(event) if self.ExportSelect(): return # set export parameters; get file name self.OpenFile() wx.BeginBusyCursor() # Export model parameters in bracket notation try: # Initialise ordered dictionary to hold model parameters and uncertainties model_parameters = OrderedDict() # load all of the tree into a set of dicts self.loadTree() # create a dict with refined values and their uncertainties self.loadParmDict() # Initialise phase counter, for later use phase_num = 0 # Extract lattice parameters and uncertainties, and convert to bracket notation for phasedict in self.Phases.items(): phasenam = phasedict[0] cellList, cellSig = self.GetCell(phasenam) # Initialise lattice parameter letter lp_letter = "a" for i in range(0, len(cellList)): # for cell in cellList: if cellSig[i] > 0: # Formulate lattice parameter in bracket notation current_lp_bracket = ValEsd(cellList[i], cellSig[i]) # Write to dictionary that will later be exported to CSV model_parameters[phasenam + " " + lp_letter + " (Å)"] = current_lp_bracket # Increment lattice parameter letter lp_letter = chr(ord(lp_letter[0]) + 1) else: break # Get phase and weight fractions uncertainties, if they have been refined for hist_num,hist_name in enumerate(self.Histograms): try: # Get phase fraction uncertainty, if phase fractions have been refined phasefrac_unc = self.sigDict[str(phase_num) + ':' + str(hist_num) + ':Scale'] # Get name of histogram associated with this phase, for later use #hist_name = list(self.Histograms.keys())[hist_num] # Extract phase fraction value phasefrac = phasedict[1]['Histograms'][hist_name]['Scale'][0] # Write phase if there is more than one histogram, specify which one if len(self.Histograms) > 1: model_parameters[phasenam + " Phase Fraction in: " + hist_name] = ( ValEsd(phasefrac, phasefrac_unc)) # If there is only one histogram, no need to specify which histogram the fraction is based on else: model_parameters[phasenam + " Phase Fraction"] = ValEsd(phasefrac, phasefrac_unc) except: pass try: var = str(phase_num) + ':' + str(hist_num) + ':WgtFrac' depSigDict = self.OverallParms['Covariance'].get('depSigDict',{}) weight_frac,weight_frac_unc = depSigDict.get(var,[0,None]) # Write phase + weight fractions in bracket notation to dictionary, to be exported as a CSV # If there is more than one histogram, specify which one the fraction is based on if len(self.Histograms) > 1: model_parameters[phasenam + " Weight Fraction in: " + hist_name] = ( ValEsd(weight_frac, weight_frac_unc)) # If there is only one histogram, no need to specify which histogram the fraction is based on else: model_parameters[phasenam + " Weight Fraction"] = ValEsd(weight_frac, weight_frac_unc) except: pass # Get preferred orientation details for phase, if refined try: pref_orr_props = phasedict[1]['Histograms'][hist_name]['Pref.Ori.'] # Check if March Dollase has been refined if pref_orr_props[2] and pref_orr_props[0] == "MD": # If so, first extract MD axis and write to dictionary to be exported MD_axis = "\'" + ''.join(map(str, pref_orr_props[3])) model_parameters[phasenam + " March Dollase Axis"] = MD_axis # Next, extract MD ratio MD_ratio = pref_orr_props[1] MD_sig = self.sigDict[str(phase_num)+":" + str(hist_num) + ":MD"] # Formulate MD ratio in bracket notation MD_bracket = ValEsd(MD_ratio, MD_sig) # Write MD ratio to dictionary to be exported model_parameters[phasenam + " March Dollase Ratio"] = MD_bracket except: pass # Increment phase number counter phase_num += 1 # Extract sample displacements, zero offset and D(ij)s (if refined) for i,hist_name in enumerate(self.Histograms): hist_num = str(i) # Extract zero offset, if refined GetParamSig("", hist_num, ':Zero', "Zero Offset") # Extract Bragg-Brentano sample displacement, if refined GetParamSig("", hist_num, ':Shift', "Sample Displacement (micron)") # Extract Debye-Scherrer sample X displacement, if refined GetParamSig("", hist_num, ':DisplaceX', "Sample X Displacement (micron)") # Extract Debye-Scherrer sample Y displacement, if refined GetParamSig("", hist_num, ':DisplaceY', "Sample Y Displacement (micron)") # Extract hydrostatic strains, if refined for phase_num,phase_name in enumerate(self.Phases): for d_i in range(1, 4): for d_j in range(1, 4): GetParamSig(str(phase_num), hist_num, ':D' + str(d_i) + str(d_j), phase_name + ' D' + str(d_i) + str(d_j)) # Extract atomic parameters, if refined for phase_num,phase_name in enumerate(self.Phases): # atom_list = list(self.Phases.values())[phase_num]["Atoms"] atom_list = self.Phases[phase_name]["Atoms"] # same as above? for atom_num,atom in enumerate(atom_list): # Extract isotropic thermal parameters, if refined GetParamSig(str(phase_num), ':', 'AUiso:' + str(atom_num), phase_name + ' ' + atom[0] + ' Uiso') # Extract anisotropic thermal parameters (Uijs), if refined for Ui in range(1, 4): for Uj in range(1, 4): GetParamSig(str(phase_num), ':', 'AU' + str(Ui) + str(Uj) + ':' + str(atom_num), phase_name + ' ' + atom[0] + ' U' + str(Ui) + str(Uj)) # Extract fractional occupancies, if refined GetParamSig(str(phase_num), ':', 'Afrac:' + str(atom_num), phase_name + ' ' + atom[0] + ' Occupancy') # Extract atom X Y Z, if refined for atom_axis in ('x', 'y', 'z'): variable_code = str(phase_num) + ':' + ':' + 'dA' + atom_axis + ':' + str(atom_num) # Get sigma, if refined try: param_index = self.OverallParms['Covariance']['varyList'].index(variable_code) # Extract uncertainty atom_axis_sig = self.OverallParms['Covariance']['sig'][param_index] # Extract value atom_axis_val = list(self.Phases.values())[phase_num]["Atoms"][atom_num][ord(atom_axis)-117] # Convert to bracket notation and add to dictionary, which will be exported as a CSV model_parameters[phase_name + ' ' + atom[0] + ' ' + atom_axis] = \ ValEsd(atom_axis_val, atom_axis_sig) except: pass # Extract rWp rWP = self.OverallParms['Covariance']['Rvals']['Rwp'] # Write to dictionary to be printed, rounding to 3 significant figures for readability model_parameters["wR"] = str(ValEsd(rWP, -0.1)) + "%" # Write to CSV # parameter_names = "" # for parameter_name in model_parameters.keys(): # parameter_names = parameter_names + str(parameter_name) + ", " # self.Write(parameter_names[0:-2]) # parameter_values = "" # for parameter_value in model_parameters.values(): # parameter_values = parameter_values + str(parameter_value) + ", " # self.Write(parameter_values[0:-2]) for name in model_parameters: self.Write('%s, %s,'%(name,model_parameters[name])) finally: wx.EndBusyCursor() self.CloseFile()
[docs] class Export3col(G2IO.ExportBaseclass): '''Enables export of parameters that are commonly needed for publications, with esds in a separate column ''' def __init__(self, G2frame): G2IO.ExportBaseclass.__init__(self,G2frame=G2frame,formatName='common prm CSV', extension='.csv',longFormatName='Export commonly needed parameters with s.u. in a separate column') self.exporttype = ['project']
[docs] def ValEsd2col(self, param, param_sig): '''Return two values with the formated value as the first number and the standard uncertainty (if provided) as the second value. ''' col1 = ValEsd(param, -abs(param_sig)) col2 = '' if param_sig > 0: col2 = ValEsd(param_sig, -param_sig/100) return col1,col2
def Exporter(self, event=None): # Define function to extract parameter and sigma from covariances, for later use def GetParamSig(phase_num, hist_num, keyword, display_name): param_index = None try: param_index = self.OverallParms['Covariance']['varyList'].index(phase_num + ':' + hist_num + keyword) except: pass if param_index is not None: param = self.OverallParms['Covariance']['variables'][param_index] # Extract parameter uncertainty param_sig = self.OverallParms['Covariance']['sig'][param_index] # Create dictionary entry containing parameter and sigma in bracket notation model_parameters[display_name] = self.ValEsd2col(param, param_sig) # # set up for export self.InitExport(event) if self.ExportSelect(): return # set export parameters; get file name self.OpenFile() wx.BeginBusyCursor() # Export model parameters in bracket notation try: # Initialise ordered dictionary to hold model parameters and uncertainties model_parameters = OrderedDict() # load all of the tree into a set of dicts self.loadTree() # create a dict with refined values and their uncertainties self.loadParmDict() # Initialise phase counter, for later use phase_num = 0 # Extract lattice parameters and uncertainties, and convert to bracket notation for phasedict in self.Phases.items(): phasenam = phasedict[0] cellList, cellSig = self.GetCell(phasenam) # Initialise lattice parameter letter lp_letter = "a" for i in range(0, len(cellList)): # for cell in cellList: if cellSig[i] > 0: # Formulate lattice parameter model_parameters[phasenam + " " + lp_letter + " (Å)"] = self.ValEsd2col(cellList[i], cellSig[i]) # Increment lattice parameter letter lp_letter = chr(ord(lp_letter[0]) + 1) else: break # Get phase and weight fractions uncertainties, if they have been refined for hist_num,hist_name in enumerate(self.Histograms): try: # Get phase fraction uncertainty, if phase fractions have been refined phasefrac_unc = self.sigDict[str(phase_num) + ':' + str(hist_num) + ':Scale'] # Get name of histogram associated with this phase, for later use #hist_name = list(self.Histograms.keys())[hist_num] # Extract phase fraction value phasefrac = phasedict[1]['Histograms'][hist_name]['Scale'][0] # Write phase if there is more than one histogram, specify which one if len(self.Histograms) > 1: model_parameters[phasenam + " Phase Fraction in: " + hist_name] = ( self.ValEsd2col(phasefrac, phasefrac_unc)) # If there is only one histogram, no need to specify which histogram the fraction is based on else: model_parameters[phasenam + " Phase Fraction"] = self.ValEsd2col(phasefrac, phasefrac_unc) except: pass try: var = str(phase_num) + ':' + str(hist_num) + ':WgtFrac' depSigDict = self.OverallParms['Covariance'].get('depSigDict',{}) weight_frac,weight_frac_unc = depSigDict.get(var,[0,None]) # Write phase + weight fractions in bracket notation to dictionary, to be exported as a CSV # If there is more than one histogram, specify which one the fraction is based on if len(self.Histograms) > 1: model_parameters[phasenam + " Weight Fraction in: " + hist_name] = ( self.ValEsd2col(weight_frac, weight_frac_unc)) # If there is only one histogram, no need to specify which histogram the fraction is based on else: model_parameters[phasenam + " Weight Fraction"] = self.ValEsd2col(weight_frac, weight_frac_unc) except: pass # Get preferred orientation details for phase, if refined try: pref_orr_props = phasedict[1]['Histograms'][hist_name]['Pref.Ori.'] # Check if March Dollase has been refined if pref_orr_props[2] and pref_orr_props[0] == "MD": # If so, first extract MD axis and write to dictionary to be exported MD_axis = "\'" + ''.join(map(str, pref_orr_props[3])) model_parameters[phasenam + " March Dollase Axis"] = (MD_axis,'') # Next, extract MD ratio MD_ratio = pref_orr_props[1] MD_sig = self.sigDict[str(phase_num)+":" + str(hist_num) + ":MD"] # Formulate MD ratio in bracket notation MD_bracket = self.ValEsd2col(MD_ratio, MD_sig) # Write MD ratio to dictionary to be exported model_parameters[phasenam + " March Dollase Ratio"] = (MD_bracket,'') except: pass # Increment phase number counter phase_num += 1 # Extract sample displacements, zero offset and D(ij)s (if refined) for i,hist_name in enumerate(self.Histograms): hist_num = str(i) # Extract zero offset, if refined GetParamSig("", hist_num, ':Zero', "Zero Offset") # Extract Bragg-Brentano sample displacement, if refined GetParamSig("", hist_num, ':Shift', "Sample Displacement (micron)") # Extract Debye-Scherrer sample X displacement, if refined GetParamSig("", hist_num, ':DisplaceX', "Sample X Displacement (micron)") # Extract Debye-Scherrer sample Y displacement, if refined GetParamSig("", hist_num, ':DisplaceY', "Sample Y Displacement (micron)") # Extract hydrostatic strains, if refined for phase_num,phase_name in enumerate(self.Phases): for d_i in range(1, 4): for d_j in range(1, 4): GetParamSig(str(phase_num), hist_num, ':D' + str(d_i) + str(d_j), phase_name + ' D' + str(d_i) + str(d_j)) # Extract atomic parameters, if refined for phase_num,phase_name in enumerate(self.Phases): # atom_list = list(self.Phases.values())[phase_num]["Atoms"] atom_list = self.Phases[phase_name]["Atoms"] # same as above? for atom_num,atom in enumerate(atom_list): # Extract isotropic thermal parameters, if refined GetParamSig(str(phase_num), ':', 'AUiso:' + str(atom_num), phase_name + ' ' + atom[0] + ' Uiso') # Extract anisotropic thermal parameters (Uijs), if refined for Ui in range(1, 4): for Uj in range(1, 4): GetParamSig(str(phase_num), ':', 'AU' + str(Ui) + str(Uj) + ':' + str(atom_num), phase_name + ' ' + atom[0] + ' U' + str(Ui) + str(Uj)) # Extract fractional occupancies, if refined GetParamSig(str(phase_num), ':', 'Afrac:' + str(atom_num), phase_name + ' ' + atom[0] + ' Occupancy') # Extract atom X Y Z, if refined for atom_axis in ('x', 'y', 'z'): variable_code = str(phase_num) + ':' + ':' + 'dA' + atom_axis + ':' + str(atom_num) # Get sigma, if refined try: param_index = self.OverallParms['Covariance']['varyList'].index(variable_code) # Extract uncertainty atom_axis_sig = self.OverallParms['Covariance']['sig'][param_index] # Extract value atom_axis_val = list(self.Phases.values())[phase_num]["Atoms"][atom_num][ord(atom_axis)-117] # Convert to bracket notation and add to dictionary, which will be exported as a CSV model_parameters[phase_name + ' ' + atom[0] + ' ' + atom_axis] = \ self.ValEsd2col(atom_axis_val, atom_axis_sig) except: pass # Extract rWp rWP = self.OverallParms['Covariance']['Rvals']['Rwp'] # Write to dictionary to be printed, rounding to 3 significant figures for readability model_parameters["wR"] = (ValEsd(rWP, -0.1) + '%', '') # Write to CSV for name in model_parameters: self.Write('{:}, {:}, {:}'.format(name,*model_parameters[name])) finally: wx.EndBusyCursor() self.CloseFile()