Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/sas/qtgui/Calculators/SldPanel.py

    r5c0e717 raed0532  
    66 
    77from periodictable import formula as Formula 
    8 from periodictable.xsf import xray_energy, xray_sld 
     8from periodictable.xsf import xray_energy, xray_sld_from_atoms 
    99from periodictable.nsf import neutron_scattering 
    1010 
     
    2121    'MOLECULAR_FORMULA', 
    2222    'MASS_DENSITY', 
    23     'NEUTRON_WAVELENGTH', 
     23    'WAVELENGTH', 
    2424    'NEUTRON_SLD_REAL', 
    2525    'NEUTRON_SLD_IMAG', 
    26     'XRAY_WAVELENGTH', 
    27     'XRAY_SLD_REAL', 
    28     'XRAY_SLD_IMAG', 
     26    'CU_KA_SLD_REAL', 
     27    'CU_KA_SLD_IMAG', 
     28    'MO_KA_SLD_REAL', 
     29    'MO_KA_SLD_IMAG', 
    2930    'NEUTRON_INC_XS', 
    3031    'NEUTRON_ABS_XS', 
     
    3334 
    3435class SldResult(object): 
    35     def __init__(self, molecular_formula, mass_density, 
    36         neutron_wavelength, neutron_sld_real, neutron_sld_imag, 
    37         xray_wavelength, xray_sld_real, xray_sld_imag, 
     36    def __init__(self, molecular_formula, mass_density, wavelength, 
     37        neutron_sld_real, neutron_sld_imag, 
     38        cu_ka_sld_real, cu_ka_sld_imag, 
     39        mo_ka_sld_real, mo_ka_sld_imag, 
    3840        neutron_inc_xs, neutron_abs_xs, neutron_length): 
    3941 
    4042        self.molecular_formula = molecular_formula 
    4143        self.mass_density = mass_density 
    42         self.neutron_wavelength = neutron_wavelength 
     44        self.wavelength = wavelength 
    4345        self.neutron_sld_real = neutron_sld_real 
    4446        self.neutron_sld_imag = neutron_sld_imag 
    45         self.xray_wavelength = xray_wavelength 
    46         self.xray_sld_real = xray_sld_real 
    47         self.xray_sld_imag = xray_sld_imag 
     47        self.cu_ka_sld_real = cu_ka_sld_real 
     48        self.cu_ka_sld_imag = cu_ka_sld_imag 
     49        self.mo_ka_sld_real = mo_ka_sld_real 
     50        self.mo_ka_sld_imag = mo_ka_sld_imag 
    4851        self.neutron_inc_xs = neutron_inc_xs 
    4952        self.neutron_abs_xs = neutron_abs_xs 
    5053        self.neutron_length = neutron_length 
    5154 
    52 def sldAlgorithm(molecular_formula, mass_density, neutron_wavelength, xray_wavelength): 
    53  
    54     xray_sld_real, xray_sld_imag = xray_sld( 
    55             compound=molecular_formula, 
     55def sldAlgorithm(molecular_formula, mass_density, wavelength): 
     56 
     57    sld_formula = Formula(molecular_formula, density=mass_density) 
     58 
     59    def calculate_sld(formula): 
     60        if len(formula.atoms) != 1: 
     61            raise NotImplementedError() 
     62        energy = xray_energy(list(formula.atoms.keys())[0].K_alpha) 
     63        return xray_sld_from_atoms( 
     64            sld_formula.atoms, 
    5665            density=mass_density, 
    57             wavelength=xray_wavelength) 
    58  
    59     (neutron_sld_real, neutron_sld_imag, _), (_, neutron_abs_xs, neutron_inc_xs), neutron_length = \ 
     66            energy=energy) 
     67 
     68    cu_real, cu_imag = calculate_sld(Formula("Cu")) 
     69    mo_real, mo_imag = calculate_sld(Formula("Mo")) 
     70 
     71    (sld_real, sld_imag, _), (_, neutron_abs_xs, neutron_inc_xs), neutron_length = \ 
    6072        neutron_scattering( 
    6173            compound=molecular_formula, 
    6274            density=mass_density, 
    63             wavelength=neutron_wavelength) 
     75            wavelength=wavelength) 
    6476 
    6577    SCALE = 1e-6 
    6678 
    6779    # neutron sld 
    68     scaled_neutron_sld_real = SCALE * neutron_sld_real 
    69     scaled_neutron_sld_imag = SCALE * abs(neutron_sld_imag) 
    70  
    71     # xray sld 
    72     scaled_xray_sld_real = SCALE * xray_sld_real 
    73     scaled_xray_sld_imag = SCALE * abs(xray_sld_imag) 
    74  
     80    neutron_sld_real = SCALE * sld_real 
     81    neutron_sld_imag = SCALE * abs(sld_imag) 
     82 
     83    # Cu sld 
     84    cu_ka_sld_real = SCALE * cu_real 
     85    cu_ka_sld_imag = SCALE * abs(cu_imag) 
     86 
     87    # Mo sld 
     88    mo_ka_sld_real = SCALE * mo_real 
     89    mo_ka_sld_imag = SCALE * abs(mo_imag) 
    7590 
    7691    return SldResult( 
    77         molecular_formula, mass_density, 
    78         neutron_wavelength, scaled_neutron_sld_real, scaled_neutron_sld_imag, 
    79         xray_wavelength, scaled_xray_sld_real, scaled_xray_sld_imag, 
     92        molecular_formula, mass_density, wavelength, 
     93        neutron_sld_real, neutron_sld_imag, 
     94        cu_ka_sld_real, cu_ka_sld_imag, 
     95        mo_ka_sld_real, mo_ka_sld_imag, 
    8096        neutron_inc_xs, neutron_abs_xs, neutron_length) 
    8197 
     
    96112            MODEL.NEUTRON_SLD_REAL: self.ui.editNeutronSldReal, 
    97113            MODEL.NEUTRON_SLD_IMAG: self.ui.editNeutronSldImag, 
    98             MODEL.XRAY_SLD_REAL: self.ui.editXraySldReal, 
    99             MODEL.XRAY_SLD_IMAG: self.ui.editXraySldImag, 
     114            MODEL.CU_KA_SLD_REAL: self.ui.editCuKaSldReal, 
     115            MODEL.CU_KA_SLD_IMAG: self.ui.editCuKaSldImag, 
     116            MODEL.MO_KA_SLD_REAL: self.ui.editMoKaSldReal, 
     117            MODEL.MO_KA_SLD_IMAG: self.ui.editMoKaSldImag, 
    100118            MODEL.NEUTRON_INC_XS: self.ui.editNeutronIncXs, 
    101119            MODEL.NEUTRON_ABS_XS: self.ui.editNeutronAbsXs, 
     
    113131        rx = QtCore.QRegExp("[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?") 
    114132        self.ui.editMassDensity.setValidator(QtGui.QRegExpValidator(rx, self.ui.editMassDensity)) 
    115         self.ui.editNeutronWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editNeutronWavelength)) 
    116         self.ui.editXrayWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editXrayWavelength)) 
     133        self.ui.editWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editWavelength)) 
    117134 
    118135        # signals 
    119         self.ui.helpButton.clicked.connect(self.displayHelp) 
    120         self.ui.closeButton.clicked.connect(self.closePanel) 
    121         self.ui.recalculateButton.clicked.connect(self.calculateSLD) 
    122  
    123     def calculateSLD(self): 
    124         self.recalculateSLD() 
     136        self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Reset).clicked.connect(self.modelReset) 
     137        self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Help).clicked.connect(self.displayHelp) 
    125138 
    126139    def setupModel(self): 
    127140        self.model = QtGui.QStandardItemModel(self) 
    128         self.model.setItem(MODEL.MOLECULAR_FORMULA , QtGui.QStandardItem()) 
    129         self.model.setItem(MODEL.MASS_DENSITY      , QtGui.QStandardItem()) 
    130         self.model.setItem(MODEL.NEUTRON_WAVELENGTH, QtGui.QStandardItem()) 
    131         self.model.setItem(MODEL.XRAY_WAVELENGTH   , QtGui.QStandardItem()) 
     141        self.model.setItem(MODEL.MOLECULAR_FORMULA, QtGui.QStandardItem()) 
     142        self.model.setItem(MODEL.MASS_DENSITY     , QtGui.QStandardItem()) 
     143        self.model.setItem(MODEL.WAVELENGTH       , QtGui.QStandardItem()) 
    132144 
    133145        for key in list(self._getOutputs().keys()): 
     
    135147 
    136148        self.model.dataChanged.connect(self.dataChanged) 
    137  
    138         self.ui.editMassDensity.textEdited.connect(self.recalculateSLD) 
    139         self.ui.editMolecularFormula.textEdited.connect(self.recalculateSLD) 
    140         self.ui.editNeutronWavelength.textEdited.connect(self.recalculateSLD) 
    141         self.ui.editXrayWavelength.textEdited.connect(self.recalculateSLD) 
    142149 
    143150        self.modelReset() 
     
    147154        self.mapper.setModel(self.model) 
    148155        self.mapper.setOrientation(QtCore.Qt.Vertical) 
    149         self.mapper.addMapping(self.ui.editMolecularFormula , MODEL.MOLECULAR_FORMULA) 
    150         self.mapper.addMapping(self.ui.editMassDensity      , MODEL.MASS_DENSITY) 
    151         self.mapper.addMapping(self.ui.editNeutronWavelength, MODEL.NEUTRON_WAVELENGTH) 
    152         self.mapper.addMapping(self.ui.editXrayWavelength   , MODEL.XRAY_WAVELENGTH) 
     156        self.mapper.addMapping(self.ui.editMolecularFormula, MODEL.MOLECULAR_FORMULA) 
     157        self.mapper.addMapping(self.ui.editMassDensity     , MODEL.MASS_DENSITY) 
     158        self.mapper.addMapping(self.ui.editWavelength      , MODEL.WAVELENGTH) 
    153159 
    154160        for key, edit in self._getOutputs().items(): 
     
    160166        update = False 
    161167        for index in range(top.row(), bottom.row() + 1): 
    162             if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL.NEUTRON_WAVELENGTH) or (index == MODEL.XRAY_WAVELENGTH): 
     168            if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL.WAVELENGTH): 
    163169                update = True 
    164170 
    165         # calculation 
     171        # calcualtion 
    166172        if update: 
    167             self.recalculateSLD() 
    168  
    169     def recalculateSLD(self): 
    170         formula = self.ui.editMolecularFormula.text() 
    171         density = self.ui.editMassDensity.text() 
    172         neutronWavelength = self.ui.editNeutronWavelength.text() 
    173         xrayWavelength = self.ui.editXrayWavelength.text() 
    174  
    175         if len(formula) > 0 and len(density) > 0 and len(neutronWavelength) > 0 and len(xrayWavelength) > 0: 
    176             try: 
    177                 results = sldAlgorithm(str(formula), float(density), float(neutronWavelength), float(xrayWavelength)) 
    178  
    179                 def format(value): 
    180                     return ("%-5.3g" % value).strip() 
    181  
    182                 self.model.item(MODEL.NEUTRON_SLD_REAL).setText(format(results.neutron_sld_real)) 
    183                 self.model.item(MODEL.NEUTRON_SLD_IMAG).setText(format(results.neutron_sld_imag)) 
    184  
    185                 self.model.item(MODEL.XRAY_SLD_REAL).setText(format(results.xray_sld_real)) 
    186                 self.model.item(MODEL.XRAY_SLD_IMAG).setText(format(results.xray_sld_imag)) 
    187  
    188                 self.model.item(MODEL.NEUTRON_INC_XS).setText(format(results.neutron_inc_xs)) 
    189                 self.model.item(MODEL.NEUTRON_ABS_XS).setText(format(results.neutron_abs_xs)) 
    190                 self.model.item(MODEL.NEUTRON_LENGTH).setText(format(results.neutron_length)) 
    191  
    192                 return 
    193  
    194             except Exception as e: 
    195                 pass 
    196  
    197         for key in list(self._getOutputs().keys()): 
    198             self.model.item(key).setText("") 
     173            formula = self.model.item(MODEL.MOLECULAR_FORMULA).text() 
     174            density = self.model.item(MODEL.MASS_DENSITY).text() 
     175            wavelength = self.model.item(MODEL.WAVELENGTH).text() 
     176            if len(formula) > 0 and len(density) > 0 and len(wavelength) > 0: 
     177                try: 
     178                    results = sldAlgorithm(str(formula), float(density), float(wavelength)) 
     179 
     180                    def format(value): 
     181                        return ("%-5.3g" % value).strip() 
     182 
     183                    self.model.item(MODEL.NEUTRON_SLD_REAL).setText(format(results.neutron_sld_real)) 
     184                    self.model.item(MODEL.NEUTRON_SLD_IMAG).setText(format(results.neutron_sld_imag)) 
     185 
     186                    self.model.item(MODEL.CU_KA_SLD_REAL).setText(format(results.cu_ka_sld_real)) 
     187                    self.model.item(MODEL.CU_KA_SLD_IMAG).setText(format(results.cu_ka_sld_imag)) 
     188 
     189                    self.model.item(MODEL.MO_KA_SLD_REAL).setText(format(results.mo_ka_sld_real)) 
     190                    self.model.item(MODEL.MO_KA_SLD_IMAG).setText(format(results.mo_ka_sld_imag)) 
     191 
     192                    self.model.item(MODEL.NEUTRON_INC_XS).setText(format(results.neutron_inc_xs)) 
     193                    self.model.item(MODEL.NEUTRON_ABS_XS).setText(format(results.neutron_abs_xs)) 
     194                    self.model.item(MODEL.NEUTRON_LENGTH).setText(format(results.neutron_length)) 
     195 
     196                    return 
     197             
     198                except Exception as e: 
     199                    pass 
     200 
     201            for key in list(self._getOutputs().keys()): 
     202                self.model.item(key).setText("") 
    199203 
    200204    def modelReset(self): 
    201205        #self.model.beginResetModel() 
    202206        try: 
    203             self.model.item(MODEL.MOLECULAR_FORMULA ).setText("H2O") 
    204             self.model.item(MODEL.MASS_DENSITY      ).setText("1.0") 
    205             self.model.item(MODEL.NEUTRON_WAVELENGTH).setText("6.0") 
    206             self.model.item(MODEL.XRAY_WAVELENGTH   ).setText("1.0") 
    207             self.recalculateSLD() 
     207            self.model.item(MODEL.MOLECULAR_FORMULA).setText("H2O") 
     208            self.model.item(MODEL.MASS_DENSITY     ).setText("1") 
     209            self.model.item(MODEL.WAVELENGTH       ).setText("6") 
    208210        finally: 
    209211            pass 
     
    215217 
    216218 
    217     def closePanel(self): 
    218         """ 
    219         close the window containing this panel 
    220         """ 
    221         self.close() 
    222  
Note: See TracChangeset for help on using the changeset viewer.