Changeset 3522037 in sasview


Ignore:
Timestamp:
Sep 5, 2018 9:52:57 AM (13 months ago)
Author:
wojciech
Branches:
ESS_GUI, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
Children:
b1f6063
Parents:
6701a0b (diff), f6c19cf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'ESS_GUI' of https://github.com/SasView/sasview into ESS_GUI_Pr_fixes

Location:
src/sas
Files:
12 edited

Legend:

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

    raed0532 r5c0e717  
    66 
    77from periodictable import formula as Formula 
    8 from periodictable.xsf import xray_energy, xray_sld_from_atoms 
     8from periodictable.xsf import xray_energy, xray_sld 
    99from periodictable.nsf import neutron_scattering 
    1010 
     
    2121    'MOLECULAR_FORMULA', 
    2222    'MASS_DENSITY', 
    23     'WAVELENGTH', 
     23    'NEUTRON_WAVELENGTH', 
    2424    'NEUTRON_SLD_REAL', 
    2525    'NEUTRON_SLD_IMAG', 
    26     'CU_KA_SLD_REAL', 
    27     'CU_KA_SLD_IMAG', 
    28     'MO_KA_SLD_REAL', 
    29     'MO_KA_SLD_IMAG', 
     26    'XRAY_WAVELENGTH', 
     27    'XRAY_SLD_REAL', 
     28    'XRAY_SLD_IMAG', 
    3029    'NEUTRON_INC_XS', 
    3130    'NEUTRON_ABS_XS', 
     
    3433 
    3534class SldResult(object): 
    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, 
     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, 
    4038        neutron_inc_xs, neutron_abs_xs, neutron_length): 
    4139 
    4240        self.molecular_formula = molecular_formula 
    4341        self.mass_density = mass_density 
    44         self.wavelength = wavelength 
     42        self.neutron_wavelength = neutron_wavelength 
    4543        self.neutron_sld_real = neutron_sld_real 
    4644        self.neutron_sld_imag = neutron_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 
     45        self.xray_wavelength = xray_wavelength 
     46        self.xray_sld_real = xray_sld_real 
     47        self.xray_sld_imag = xray_sld_imag 
    5148        self.neutron_inc_xs = neutron_inc_xs 
    5249        self.neutron_abs_xs = neutron_abs_xs 
    5350        self.neutron_length = neutron_length 
    5451 
    55 def 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, 
     52def sldAlgorithm(molecular_formula, mass_density, neutron_wavelength, xray_wavelength): 
     53 
     54    xray_sld_real, xray_sld_imag = xray_sld( 
     55            compound=molecular_formula, 
    6556            density=mass_density, 
    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 = \ 
     57            wavelength=xray_wavelength) 
     58 
     59    (neutron_sld_real, neutron_sld_imag, _), (_, neutron_abs_xs, neutron_inc_xs), neutron_length = \ 
    7260        neutron_scattering( 
    7361            compound=molecular_formula, 
    7462            density=mass_density, 
    75             wavelength=wavelength) 
     63            wavelength=neutron_wavelength) 
    7664 
    7765    SCALE = 1e-6 
    7866 
    7967    # neutron sld 
    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) 
     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 
    9075 
    9176    return SldResult( 
    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, 
     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, 
    9680        neutron_inc_xs, neutron_abs_xs, neutron_length) 
    9781 
     
    11296            MODEL.NEUTRON_SLD_REAL: self.ui.editNeutronSldReal, 
    11397            MODEL.NEUTRON_SLD_IMAG: self.ui.editNeutronSldImag, 
    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, 
     98            MODEL.XRAY_SLD_REAL: self.ui.editXraySldReal, 
     99            MODEL.XRAY_SLD_IMAG: self.ui.editXraySldImag, 
    118100            MODEL.NEUTRON_INC_XS: self.ui.editNeutronIncXs, 
    119101            MODEL.NEUTRON_ABS_XS: self.ui.editNeutronAbsXs, 
     
    131113        rx = QtCore.QRegExp("[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?") 
    132114        self.ui.editMassDensity.setValidator(QtGui.QRegExpValidator(rx, self.ui.editMassDensity)) 
    133         self.ui.editWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editWavelength)) 
     115        self.ui.editNeutronWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editNeutronWavelength)) 
     116        self.ui.editXrayWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editXrayWavelength)) 
    134117 
    135118        # signals 
    136         self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Reset).clicked.connect(self.modelReset) 
    137         self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Help).clicked.connect(self.displayHelp) 
     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() 
    138125 
    139126    def setupModel(self): 
    140127        self.model = QtGui.QStandardItemModel(self) 
    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()) 
     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()) 
    144132 
    145133        for key in list(self._getOutputs().keys()): 
     
    147135 
    148136        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) 
    149142 
    150143        self.modelReset() 
     
    154147        self.mapper.setModel(self.model) 
    155148        self.mapper.setOrientation(QtCore.Qt.Vertical) 
    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) 
     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) 
    159153 
    160154        for key, edit in self._getOutputs().items(): 
     
    166160        update = False 
    167161        for index in range(top.row(), bottom.row() + 1): 
    168             if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL.WAVELENGTH): 
     162            if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL.NEUTRON_WAVELENGTH) or (index == MODEL.XRAY_WAVELENGTH): 
    169163                update = True 
    170164 
    171         # calcualtion 
     165        # calculation 
    172166        if update: 
    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("") 
     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("") 
    203199 
    204200    def modelReset(self): 
    205201        #self.model.beginResetModel() 
    206202        try: 
    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") 
     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() 
    210208        finally: 
    211209            pass 
     
    217215 
    218216 
     217    def closePanel(self): 
     218        """ 
     219        close the window containing this panel 
     220        """ 
     221        self.close() 
     222 
  • src/sas/qtgui/Calculators/UI/SldPanel.ui

    rcd2cc745 r5c0e717  
    77    <x>0</x> 
    88    <y>0</y> 
    9     <width>447</width> 
    10     <height>403</height> 
     9    <width>490</width> 
     10    <height>490</height> 
    1111   </rect> 
    1212  </property> 
     
    2525  </property> 
    2626  <layout class="QGridLayout" name="gridLayout_2"> 
     27   <item row="3" column="0"> 
     28    <spacer name="verticalSpacer"> 
     29     <property name="orientation"> 
     30      <enum>Qt::Vertical</enum> 
     31     </property> 
     32     <property name="sizeHint" stdset="0"> 
     33      <size> 
     34       <width>20</width> 
     35       <height>40</height> 
     36      </size> 
     37     </property> 
     38    </spacer> 
     39   </item> 
     40   <item row="4" column="0"> 
     41    <widget class="QWidget" name="widget" native="true"> 
     42     <property name="minimumSize"> 
     43      <size> 
     44       <width>466</width> 
     45       <height>32</height> 
     46      </size> 
     47     </property> 
     48     <widget class="QPushButton" name="recalculateButton"> 
     49      <property name="geometry"> 
     50       <rect> 
     51        <x>0</x> 
     52        <y>0</y> 
     53        <width>114</width> 
     54        <height>32</height> 
     55       </rect> 
     56      </property> 
     57      <property name="text"> 
     58       <string>Recalculate</string> 
     59      </property> 
     60     </widget> 
     61     <widget class="QPushButton" name="helpButton"> 
     62      <property name="geometry"> 
     63       <rect> 
     64        <x>176</x> 
     65        <y>0</y> 
     66        <width>114</width> 
     67        <height>32</height> 
     68       </rect> 
     69      </property> 
     70      <property name="text"> 
     71       <string>Help</string> 
     72      </property> 
     73     </widget> 
     74     <widget class="QPushButton" name="closeButton"> 
     75      <property name="geometry"> 
     76       <rect> 
     77        <x>352</x> 
     78        <y>0</y> 
     79        <width>114</width> 
     80        <height>32</height> 
     81       </rect> 
     82      </property> 
     83      <property name="text"> 
     84       <string>Close</string> 
     85      </property> 
     86     </widget> 
     87    </widget> 
     88   </item> 
    2789   <item row="0" column="0"> 
    2890    <widget class="QGroupBox" name="groupBoxInput"> 
     
    58120       <widget class="QLineEdit" name="editMassDensity"/> 
    59121      </item> 
     122      <item row="2" column="2"> 
     123       <widget class="QLabel" name="label_12"> 
     124        <property name="text"> 
     125         <string>à
     126</string> 
     127        </property> 
     128       </widget> 
     129      </item> 
     130      <item row="0" column="0"> 
     131       <widget class="QLabel" name="label_9"> 
     132        <property name="text"> 
     133         <string>Molecular Formula</string> 
     134        </property> 
     135       </widget> 
     136      </item> 
     137      <item row="2" column="0"> 
     138       <widget class="QLabel" name="label_11"> 
     139        <property name="text"> 
     140         <string>Neutron Wavelength</string> 
     141        </property> 
     142       </widget> 
     143      </item> 
    60144      <item row="2" column="1"> 
    61        <widget class="QLineEdit" name="editWavelength"> 
     145       <widget class="QLineEdit" name="editNeutronWavelength"> 
    62146        <property name="styleSheet"> 
    63147         <string notr="true"/> 
     
    68152       </widget> 
    69153      </item> 
    70       <item row="2" column="2"> 
    71        <widget class="QLabel" name="label_12"> 
     154      <item row="3" column="1"> 
     155       <widget class="QLineEdit" name="editXrayWavelength"/> 
     156      </item> 
     157      <item row="3" column="0"> 
     158       <widget class="QLabel" name="label_13"> 
     159        <property name="text"> 
     160         <string>X-Ray Wavelength</string> 
     161        </property> 
     162       </widget> 
     163      </item> 
     164      <item row="3" column="2"> 
     165       <widget class="QLabel" name="label"> 
    72166        <property name="text"> 
    73167         <string>à
    74168</string> 
    75         </property> 
    76        </widget> 
    77       </item> 
    78       <item row="0" column="0"> 
    79        <widget class="QLabel" name="label_9"> 
    80         <property name="text"> 
    81          <string>Molecular Formula</string> 
    82         </property> 
    83        </widget> 
    84       </item> 
    85       <item row="2" column="0"> 
    86        <widget class="QLabel" name="label_11"> 
    87         <property name="text"> 
    88          <string>Wavelength</string> 
    89169        </property> 
    90170       </widget> 
     
    99179     </property> 
    100180     <layout class="QGridLayout" name="gridLayoutOutput"> 
     181      <item row="0" column="1"> 
     182       <widget class="QLineEdit" name="editNeutronSldReal"> 
     183        <property name="enabled"> 
     184         <bool>false</bool> 
     185        </property> 
     186        <property name="readOnly"> 
     187         <bool>true</bool> 
     188        </property> 
     189       </widget> 
     190      </item> 
    101191      <item row="0" column="0"> 
    102192       <widget class="QLabel" name="label_17"> 
     
    106196       </widget> 
    107197      </item> 
    108       <item row="0" column="1"> 
    109        <widget class="QLineEdit" name="editNeutronSldReal"> 
    110         <property name="readOnly"> 
    111          <bool>true</bool> 
     198      <item row="5" column="0"> 
     199       <widget class="QLabel" name="label_3"> 
     200        <property name="text"> 
     201         <string>Neutron 1/e length</string> 
     202        </property> 
     203       </widget> 
     204      </item> 
     205      <item row="3" column="1"> 
     206       <widget class="QLineEdit" name="editNeutronIncXs"> 
     207        <property name="enabled"> 
     208         <bool>false</bool> 
     209        </property> 
     210        <property name="readOnly"> 
     211         <bool>true</bool> 
     212        </property> 
     213       </widget> 
     214      </item> 
     215      <item row="3" column="0"> 
     216       <widget class="QLabel" name="label_21"> 
     217        <property name="text"> 
     218         <string>Neutron Inc. Xs</string> 
    112219        </property> 
    113220       </widget> 
     
    120227       </widget> 
    121228      </item> 
     229      <item row="1" column="2"> 
     230       <widget class="QLabel" name="label_20"> 
     231        <property name="text"> 
     232         <string>-i</string> 
     233        </property> 
     234       </widget> 
     235      </item> 
    122236      <item row="0" column="3"> 
    123237       <widget class="QLineEdit" name="editNeutronSldImag"> 
    124         <property name="readOnly"> 
    125          <bool>true</bool> 
     238        <property name="enabled"> 
     239         <bool>false</bool> 
     240        </property> 
     241        <property name="readOnly"> 
     242         <bool>true</bool> 
     243        </property> 
     244       </widget> 
     245      </item> 
     246      <item row="5" column="2" colspan="2"> 
     247       <widget class="QLabel" name="label_4"> 
     248        <property name="text"> 
     249         <string>cm</string> 
     250        </property> 
     251       </widget> 
     252      </item> 
     253      <item row="5" column="1"> 
     254       <widget class="QLineEdit" name="editNeutronLength"> 
     255        <property name="enabled"> 
     256         <bool>false</bool> 
     257        </property> 
     258        <property name="readOnly"> 
     259         <bool>true</bool> 
     260        </property> 
     261       </widget> 
     262      </item> 
     263      <item row="4" column="2" colspan="2"> 
     264       <widget class="QLabel" name="label_24"> 
     265        <property name="text"> 
     266         <string>1/cm</string> 
     267        </property> 
     268       </widget> 
     269      </item> 
     270      <item row="4" column="1"> 
     271       <widget class="QLineEdit" name="editNeutronAbsXs"> 
     272        <property name="enabled"> 
     273         <bool>false</bool> 
     274        </property> 
     275        <property name="readOnly"> 
     276         <bool>true</bool> 
     277        </property> 
     278       </widget> 
     279      </item> 
     280      <item row="4" column="0"> 
     281       <widget class="QLabel" name="label_23"> 
     282        <property name="text"> 
     283         <string>Neutron Abs. Xs</string> 
     284        </property> 
     285       </widget> 
     286      </item> 
     287      <item row="3" column="2" colspan="2"> 
     288       <widget class="QLabel" name="label_22"> 
     289        <property name="text"> 
     290         <string>1/cm</string> 
     291        </property> 
     292       </widget> 
     293      </item> 
     294      <item row="1" column="4"> 
     295       <widget class="QLabel" name="label_6"> 
     296        <property name="text"> 
     297         <string>1/à
     298²</string> 
     299        </property> 
     300       </widget> 
     301      </item> 
     302      <item row="1" column="0"> 
     303       <widget class="QLabel" name="label_19"> 
     304        <property name="text"> 
     305         <string>X-Ray SLD</string> 
    126306        </property> 
    127307       </widget> 
     
    135315       </widget> 
    136316      </item> 
    137       <item row="1" column="0"> 
    138        <widget class="QLabel" name="label_19"> 
    139         <property name="text"> 
    140          <string>Cu Ka SLD</string> 
    141         </property> 
    142        </widget> 
    143       </item> 
    144       <item row="1" column="1"> 
    145        <widget class="QLineEdit" name="editCuKaSldReal"> 
    146         <property name="styleSheet"> 
    147          <string notr="true"/> 
    148         </property> 
    149         <property name="readOnly"> 
    150          <bool>true</bool> 
    151         </property> 
    152        </widget> 
    153       </item> 
    154       <item row="1" column="2"> 
    155        <widget class="QLabel" name="label_20"> 
    156         <property name="text"> 
    157          <string>-i</string> 
    158         </property> 
    159        </widget> 
    160       </item> 
    161       <item row="1" column="3"> 
    162        <widget class="QLineEdit" name="editCuKaSldImag"> 
    163         <property name="readOnly"> 
    164          <bool>true</bool> 
    165         </property> 
    166        </widget> 
    167       </item> 
    168       <item row="1" column="4"> 
    169        <widget class="QLabel" name="label_6"> 
    170         <property name="text"> 
    171          <string>1/à
    172 Â²</string> 
    173         </property> 
    174        </widget> 
    175       </item> 
    176       <item row="2" column="0"> 
    177        <widget class="QLabel" name="label"> 
    178         <property name="text"> 
    179          <string>Mo Ka SLD</string> 
    180         </property> 
    181        </widget> 
    182       </item> 
    183       <item row="2" column="1"> 
    184        <widget class="QLineEdit" name="editMoKaSldReal"> 
    185         <property name="readOnly"> 
    186          <bool>true</bool> 
    187         </property> 
    188        </widget> 
    189       </item> 
    190       <item row="2" column="2"> 
    191        <widget class="QLabel" name="label_2"> 
    192         <property name="text"> 
    193          <string>-i</string> 
    194         </property> 
    195        </widget> 
    196       </item> 
    197       <item row="2" column="3"> 
    198        <widget class="QLineEdit" name="editMoKaSldImag"> 
    199         <property name="readOnly"> 
    200          <bool>true</bool> 
    201         </property> 
    202        </widget> 
    203       </item> 
    204       <item row="2" column="4"> 
    205        <widget class="QLabel" name="label_7"> 
    206         <property name="text"> 
    207          <string>1/à
    208 Â²</string> 
    209         </property> 
    210        </widget> 
    211       </item> 
    212       <item row="3" column="0" colspan="5"> 
     317      <item row="2" column="0" colspan="5"> 
    213318       <widget class="QFrame" name="frame"> 
    214319        <property name="minimumSize"> 
     
    232337       </widget> 
    233338      </item> 
    234       <item row="4" column="0"> 
    235        <widget class="QLabel" name="label_21"> 
    236         <property name="text"> 
    237          <string>Neutron Inc. Xs</string> 
    238         </property> 
    239        </widget> 
    240       </item> 
    241       <item row="4" column="1"> 
    242        <widget class="QLineEdit" name="editNeutronIncXs"> 
    243         <property name="readOnly"> 
    244          <bool>true</bool> 
    245         </property> 
    246        </widget> 
    247       </item> 
    248       <item row="4" column="2" colspan="2"> 
    249        <widget class="QLabel" name="label_22"> 
    250         <property name="text"> 
    251          <string>1/cm</string> 
    252         </property> 
    253        </widget> 
    254       </item> 
    255       <item row="5" column="0"> 
    256        <widget class="QLabel" name="label_23"> 
    257         <property name="text"> 
    258          <string>Neutron Abs. Xs</string> 
    259         </property> 
    260        </widget> 
    261       </item> 
    262       <item row="5" column="1"> 
    263        <widget class="QLineEdit" name="editNeutronAbsXs"> 
    264         <property name="readOnly"> 
    265          <bool>true</bool> 
    266         </property> 
    267        </widget> 
    268       </item> 
    269       <item row="5" column="2" colspan="2"> 
    270        <widget class="QLabel" name="label_24"> 
    271         <property name="text"> 
    272          <string>1/cm</string> 
    273         </property> 
    274        </widget> 
    275       </item> 
    276       <item row="6" column="0"> 
    277        <widget class="QLabel" name="label_3"> 
    278         <property name="text"> 
    279          <string>Neutron 1/e length</string> 
    280         </property> 
    281        </widget> 
    282       </item> 
    283       <item row="6" column="1"> 
    284        <widget class="QLineEdit" name="editNeutronLength"> 
    285         <property name="readOnly"> 
    286          <bool>true</bool> 
    287         </property> 
    288        </widget> 
    289       </item> 
    290       <item row="6" column="2" colspan="2"> 
    291        <widget class="QLabel" name="label_4"> 
    292         <property name="text"> 
    293          <string>cm</string> 
     339      <item row="1" column="1"> 
     340       <widget class="QLineEdit" name="editXraySldReal"> 
     341        <property name="enabled"> 
     342         <bool>false</bool> 
     343        </property> 
     344        <property name="readOnly"> 
     345         <bool>true</bool> 
     346        </property> 
     347       </widget> 
     348      </item> 
     349      <item row="1" column="3"> 
     350       <widget class="QLineEdit" name="editXraySldImag"> 
     351        <property name="enabled"> 
     352         <bool>false</bool> 
     353        </property> 
     354        <property name="readOnly"> 
     355         <bool>true</bool> 
    294356        </property> 
    295357       </widget> 
    296358      </item> 
    297359     </layout> 
    298     </widget> 
    299    </item> 
    300    <item row="2" column="0"> 
    301     <spacer name="verticalSpacer"> 
    302      <property name="orientation"> 
    303       <enum>Qt::Vertical</enum> 
    304      </property> 
    305      <property name="sizeHint" stdset="0"> 
    306       <size> 
    307        <width>20</width> 
    308        <height>40</height> 
    309       </size> 
    310      </property> 
    311     </spacer> 
    312    </item> 
    313    <item row="3" column="0"> 
    314     <widget class="QDialogButtonBox" name="buttonBox"> 
    315      <property name="orientation"> 
    316       <enum>Qt::Horizontal</enum> 
    317      </property> 
    318      <property name="standardButtons"> 
    319       <set>QDialogButtonBox::Close|QDialogButtonBox::Help|QDialogButtonBox::Reset</set> 
    320      </property> 
    321      <property name="centerButtons"> 
    322       <bool>true</bool> 
    323      </property> 
    324360    </widget> 
    325361   </item> 
     
    329365  <tabstop>editMolecularFormula</tabstop> 
    330366  <tabstop>editMassDensity</tabstop> 
    331   <tabstop>editWavelength</tabstop> 
     367  <tabstop>editNeutronWavelength</tabstop> 
    332368  <tabstop>editNeutronSldReal</tabstop> 
    333369  <tabstop>editNeutronSldImag</tabstop> 
    334   <tabstop>editCuKaSldReal</tabstop> 
    335   <tabstop>editCuKaSldImag</tabstop> 
    336   <tabstop>editMoKaSldReal</tabstop> 
    337   <tabstop>editMoKaSldImag</tabstop> 
    338370  <tabstop>editNeutronIncXs</tabstop> 
    339371  <tabstop>editNeutronAbsXs</tabstop> 
    340372  <tabstop>editNeutronLength</tabstop> 
    341   <tabstop>buttonBox</tabstop> 
    342373 </tabstops> 
    343374 <resources/> 
    344  <connections> 
    345   <connection> 
    346    <sender>buttonBox</sender> 
    347    <signal>accepted()</signal> 
    348    <receiver>SldPanel</receiver> 
    349    <slot>accept()</slot> 
    350    <hints> 
    351     <hint type="sourcelabel"> 
    352      <x>248</x> 
    353      <y>254</y> 
    354     </hint> 
    355     <hint type="destinationlabel"> 
    356      <x>157</x> 
    357      <y>274</y> 
    358     </hint> 
    359    </hints> 
    360   </connection> 
    361   <connection> 
    362    <sender>buttonBox</sender> 
    363    <signal>rejected()</signal> 
    364    <receiver>SldPanel</receiver> 
    365    <slot>reject()</slot> 
    366    <hints> 
    367     <hint type="sourcelabel"> 
    368      <x>316</x> 
    369      <y>260</y> 
    370     </hint> 
    371     <hint type="destinationlabel"> 
    372      <x>286</x> 
    373      <y>274</y> 
    374     </hint> 
    375    </hints> 
    376   </connection> 
    377  </connections> 
     375 <connections/> 
    378376</ui> 
  • src/sas/qtgui/MainWindow/DataExplorer.py

    ra24eacf r6b50296  
    394394        # Notify the GuiManager about the send request 
    395395        self._perspective().setData(data_item=selected_items, is_batch=self.chkBatch.isChecked()) 
     396 
     397    def freezeCheckedData(self): 
     398        """ 
     399        Convert checked results (fitted model, residuals) into separate dataset. 
     400        """ 
     401        outer_index = -1 
     402        theories_copied = 0 
     403        orig_model_size = self.model.rowCount() 
     404        while outer_index < orig_model_size: 
     405            outer_index += 1 
     406            outer_item = self.model.item(outer_index) 
     407            if not outer_item: 
     408                continue 
     409            if not outer_item.isCheckable(): 
     410                continue 
     411            # Look for checked inner items 
     412            inner_index = -1 
     413            while inner_index < outer_item.rowCount(): 
     414               inner_item = outer_item.child(inner_index) 
     415               inner_index += 1 
     416               if not inner_item: 
     417                   continue 
     418               if not inner_item.isCheckable(): 
     419                   continue 
     420               if inner_item.checkState() != QtCore.Qt.Checked: 
     421                   continue 
     422               self.model.beginResetModel() 
     423               theories_copied += 1 
     424               new_item = self.cloneTheory(inner_item) 
     425               self.model.appendRow(new_item) 
     426               self.model.endResetModel() 
     427 
     428        freeze_msg = "" 
     429        if theories_copied == 0: 
     430            return 
     431        elif theories_copied == 1: 
     432            freeze_msg = "1 theory copied to a separate data set" 
     433        elif theories_copied > 1: 
     434            freeze_msg = "%i theories copied to separate data sets" % theories_copied 
     435        else: 
     436            freeze_msg = "Unexpected number of theories copied: %i" % theories_copied 
     437            raise AttributeError(freeze_msg) 
     438        self.communicator.statusBarUpdateSignal.emit(freeze_msg) 
    396439 
    397440    def freezeTheory(self, event): 
  • src/sas/qtgui/MainWindow/GuiManager.py

    raa1db44 r6b50296  
    438438        self._workspace.actionImage_Viewer.triggered.connect(self.actionImage_Viewer) 
    439439        self._workspace.actionOrientation_Viewer.triggered.connect(self.actionOrientation_Viewer) 
     440        self._workspace.actionFreeze_Theory.triggered.connect(self.actionFreeze_Theory) 
    440441        # Fitting 
    441442        self._workspace.actionNew_Fit_Page.triggered.connect(self.actionNew_Fit_Page) 
     
    683684        self._workspace.addDockWidget(Qt.RightDockWidgetArea, self.ipDockWidget) 
    684685 
     686    def actionFreeze_Theory(self): 
     687        """ 
     688        Convert a child index with data into a separate top level dataset 
     689        """ 
     690        self.filesWidget.freezeCheckedData() 
     691 
    685692    def actionOrientation_Viewer(self): 
    686693        """ 
  • src/sas/qtgui/MainWindow/UI/MainWindowUI.ui

    raa1db44 r6b50296  
    6464    <addaction name="actionReport"/> 
    6565    <addaction name="actionReset"/> 
     66    <addaction name="separator"/> 
     67    <addaction name="actionFreeze_Theory"/> 
    6668   </widget> 
    6769   <widget class="QMenu" name="menuView"> 
     
    535537   </property> 
    536538  </action> 
     539  <action name="actionFreeze_Theory"> 
     540   <property name="text"> 
     541    <string>Freeze Theory</string> 
     542   </property> 
     543  </action> 
    537544 </widget> 
    538545 <resources/> 
  • src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py

    rff3b293 rf6c19cf  
    430430 
    431431    theory_name = str(current_data.name.split()[0]) 
    432     residuals.name = "Residuals for " + str(theory_name) + "[" + \ 
    433                     str(reference_data.filename) + "]" 
     432    res_name = reference_data.filename if reference_data.filename else reference_data.name 
     433    residuals.name = "Residuals for " + str(theory_name) + "[" + res_name + "]" 
    434434    residuals.title = residuals.name 
    435435    residuals.ytransform = 'y' 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    r6dbff18 r5aad7a5  
    267267        self.has_magnet_error_column = False 
    268268 
     269        # If the widget generated theory item, save it 
     270        self.theory_item = None 
     271 
    269272        # signal communicator 
    270273        self.communicate = self.parent.communicate 
     
    389392        # Tag along functionality 
    390393        self.label.setText("Data loaded from: ") 
    391         self.lblFilename.setText(self.logic.data.filename) 
     394        if self.logic.data.filename: 
     395            self.lblFilename.setText(self.logic.data.filename) 
     396        else: 
     397            self.lblFilename.setText(self.logic.data.name) 
    392398        self.updateQRange() 
    393399        # Switch off Data2D control 
     
    952958        model = self.cbModel.currentText() 
    953959 
    954         # empty combobox forced to be read 
     960        # Assure the control is active 
     961        if not self.cbModel.isEnabled(): 
     962            return 
     963        # Empty combobox forced to be read 
    955964        if not model: 
    956965            return 
     
    11061115            self.disableModelCombo() 
    11071116            self.enableStructureCombo() 
     1117            # set the index to 0 
     1118            self.cbStructureFactor.setCurrentIndex(0) 
     1119            self.model_parameters = None 
    11081120            self._model_model.clear() 
    11091121            return 
     
    11301142        model_row = item.row() 
    11311143        name_index = self._poly_model.index(model_row, 0) 
    1132         parameter_name = str(name_index.data()).lower() # "distribution of sld" etc. 
    1133         if "distribution of" in parameter_name: 
     1144        parameter_name = str(name_index.data()) # "distribution of sld" etc. 
     1145        if "istribution of" in parameter_name: 
    11341146            # just the last word 
    11351147            parameter_name = parameter_name.rsplit()[-1] 
     
    19912003        """ 
    19922004        name = model_name 
     2005        kernel_module = None 
    19932006        if self.cbCategory.currentText() == CATEGORY_CUSTOM: 
    19942007            # custom kernel load requires full path 
     
    19962009        try: 
    19972010            kernel_module = generate.load_kernel_module(name) 
    1998         except ModuleNotFoundError: 
    1999             # maybe it's a recategorised custom model? 
    2000             name = os.path.join(ModelUtilities.find_plugins_dir(), model_name+".py") 
    2001             # If this rises, it's a valid problem. 
    2002             kernel_module = generate.load_kernel_module(name) 
     2011        except ModuleNotFoundError as ex: 
     2012            pass 
     2013 
     2014        if kernel_module is None: 
     2015            # mismatch between "name" attribute and actual filename. 
     2016            curr_model = self.models[model_name] 
     2017            name, _ = os.path.splitext(os.path.basename(curr_model.filename)) 
     2018            try: 
     2019                kernel_module = generate.load_kernel_module(name) 
     2020            except ModuleNotFoundError as ex: 
     2021                logging.error("Can't find the model "+ str(ex)) 
     2022                return 
    20032023 
    20042024        if hasattr(kernel_module, 'parameters'): 
     
    21932213        name = self.nameFromData(fitted_data) 
    21942214        # Notify the GUI manager so it can create the theory model in DataExplorer 
    2195         new_item = GuiUtils.createModelItemWithPlot(fitted_data, name=name) 
    2196         self.communicate.updateTheoryFromPerspectiveSignal.emit(new_item) 
     2215        self.theory_item = GuiUtils.createModelItemWithPlot(fitted_data, name=name) 
     2216        self.communicate.updateTheoryFromPerspectiveSignal.emit(self.theory_item) 
    21972217 
    21982218    def nameFromData(self, fitted_data): 
     
    22842304        residuals = self.calculateResiduals(fitted_data) 
    22852305        self.model_data = fitted_data 
    2286  
    2287         new_plots = [fitted_data, residuals] 
     2306        new_plots = [fitted_data] 
     2307        if residuals is not None: 
     2308            new_plots.append(residuals) 
    22882309 
    22892310        # Create plots for intermediate product data 
     
    23032324            GuiUtils.deleteRedundantPlots(self.all_data[self.data_index], new_plots) 
    23042325 
     2326        # Update/generate plots 
    23052327        for plot in new_plots: 
    2306             if hasattr(plot, "id") and "esidual" in plot.id: 
    2307                 # TODO: fix updates to residuals plot 
    2308                 pass 
    2309             elif plot is not None: 
    2310                 self.communicate.plotUpdateSignal.emit([plot]) 
     2328            self.communicate.plotUpdateSignal.emit([plot]) 
    23112329 
    23122330    def complete2D(self, return_data): 
     
    24102428        self._poly_model.clear() 
    24112429 
     2430        parameters = self.model_parameters.form_volume_parameters 
     2431        if self.is2D: 
     2432            parameters += self.model_parameters.orientation_parameters 
     2433 
    24122434        [self.setPolyModelParameters(i, param) for i, param in \ 
    2413             enumerate(self.model_parameters.form_volume_parameters) if param.polydisperse] 
     2435            enumerate(parameters) if param.polydisperse] 
     2436 
    24142437        FittingUtilities.addPolyHeadersToModel(self._poly_model) 
    24152438 
     
    28312854        if self.all_data: 
    28322855            index = self.all_data[self.data_index] 
     2856        else: 
     2857            index = self.theory_item 
    28332858        report_logic = ReportPageLogic(self, 
    28342859                                       kernel_module=self.kernel_module, 
  • src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py

    re20870bc rc0a3b22e  
    127127        Callback for running the mask editor 
    128128        """ 
    129         self.parent.communicate.maskEditorSignal.emit(self.logic.data) 
    130         pass 
     129        if isinstance(self.logic.data, Data2D): 
     130            self.parent.communicate.maskEditorSignal.emit(self.logic.data) 
    131131 
    132132    def onRangeReset(self): 
     
    157157        Enable/disable various UI elements based on data loaded 
    158158        """ 
     159        is2Ddata = isinstance(self.logic.data, Data2D) 
    159160        self.boxWeighting.setEnabled(True) 
    160         self.cmdMaskEdit.setEnabled(True) 
     161        self.cmdMaskEdit.setEnabled(is2Ddata) 
    161162        # Switch off txtNpts related controls 
    162163        self.txtNpts.setEnabled(False) 
  • src/sas/qtgui/Utilities/AddMultEditor.py

    raed0532 r287d356  
    1515import re 
    1616import logging 
     17import traceback 
     18 
    1719import sas.qtgui.Utilities.GuiUtils as GuiUtils 
    1820from sasmodels.sasview_model import load_standard_models 
     
    202204                                     self.cbOperator.currentText()) 
    203205 
    204         success = GuiUtils.checkModel(self.plugin_filename) 
     206        try: 
     207            success = GuiUtils.checkModel(self.plugin_filename) 
     208        except Exception as ex: 
     209            # broad exception from sasmodels 
     210            msg = "Error building model: "+ str(ex) 
     211            logging.error(msg) 
     212            #print three last lines of the stack trace 
     213            # this will point out the exact line failing 
     214            last_lines = traceback.format_exc().split('\n')[-4:] 
     215            traceback_to_show = '\n'.join(last_lines) 
     216            logging.error(traceback_to_show) 
     217 
     218            # Set the status bar message 
     219            self.parent.communicate.statusBarUpdateSignal.emit("Model check failed") 
     220            return 
    205221 
    206222        if not success: 
  • src/sas/qtgui/Utilities/ReportDialog.py

    rce30949 rcb90b65  
    7373        # Use a sensible filename default 
    7474        default_name = os.path.join(location, 'fit_report.pdf') 
     75 
    7576        kwargs = { 
    7677            'parent'   : self, 
    7778            'caption'  : 'Save Report', 
    78             'directory': default_name, 
     79            # don't use 'directory' in order to remember the previous user choice 
     80            #'directory': default_name, 
    7981            'filter'   : 'PDF file (*.pdf);;HTML file (*.html);;Text file (*.txt)', 
    8082            'options'  : QtWidgets.QFileDialog.DontUseNativeDialog} 
     
    99101 
    100102        # Create files with charts 
    101         pictures = self.getPictures(basename) 
     103        pictures = [] 
     104        if self.data_images is not None: 
     105            pictures = self.getPictures(basename) 
    102106 
    103107        # self.data_html contains all images at the end of the report, in base64 form; 
  • src/sas/qtgui/Utilities/UnitTesting/ReportDialogTest.py

    r144fe21 rcb90b65  
    158158 
    159159        self.assertTrue(logging.error.called) 
    160         logging.error.assert_called_with("Error creating pdf: Failed") 
     160        #logging.error.assert_called_with("Error creating pdf") 
    161161 
  • src/sas/sascalc/pr/invertor.py

    rb8080e1 r6701a0b  
    7171        A[j][i] = (Fourier transformed base function for point j) 
    7272 
    73     We them choose a number of r-points, n_r, to evaluate the second 
     73    We then choose a number of r-points, n_r, to evaluate the second 
    7474    derivative of P(r) at. This is used as our regularization term. 
    7575    For a vector r of length n_r, the following n_r rows are set to :: 
     
    144144        x, y, err, d_max, q_min, q_max and alpha 
    145145        """ 
    146         if   name == 'x': 
     146        if name == 'x': 
    147147            if 0.0 in value: 
    148148                msg = "Invertor: one of your q-values is zero. " 
     
    227227        return None 
    228228 
     229    def add_errors(self, yvalues): 
     230        """ 
     231        Adds errors to data set is they are not avaialble 
     232        :return: 
     233        """ 
     234        stats_errors = np.zeros(len(yvalues)) 
     235        for i in range(len(yvalues)): 
     236            # Scale the error so that we can fit over several decades of Q 
     237            scale = 0.05 * np.sqrt(yvalues[i]) 
     238            min_err = 0.01 * yvalues[i] 
     239            stats_errors[i] = scale * np.sqrt(np.fabs(yvalues[i])) + min_err 
     240        logger.warning("Simulated errors have been added to the data set\n") 
     241        return stats_errors 
     242 
    229243    def clone(self): 
    230244        """ 
     
    244258        invertor.x = self.x 
    245259        invertor.y = self.y 
    246         invertor.err = self.err 
     260        if np.size(self.err) == 0 or np.all(self.err) == 0: 
     261            invertor.err = self.add_errors(self.y) 
     262        else: 
     263            invertor.err = self.err 
    247264        invertor.est_bck = self.est_bck 
    248265        invertor.background = self.background 
     
    268285            A[i][j] = (Fourier transformed base function for point j) 
    269286 
    270         We them choose a number of r-points, n_r, to evaluate the second 
     287        We then choose a number of r-points, n_r, to evaluate the second 
    271288        derivative of P(r) at. This is used as our regularization term. 
    272289        For a vector r of length n_r, the following n_r rows are set to :: 
Note: See TracChangeset for help on using the changeset viewer.