Changeset 0f959ef in sasview


Ignore:
Timestamp:
Jul 31, 2018 5:43:03 AM (3 weeks ago)
Author:
tcbennun
Branches:
ESS_GUI_beta_approx
Children:
00077cf
Parents:
548f8e2 (diff), d9b7197 (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' into ESS_GUI_beta_approx

Files:
3 added
14 edited

Legend:

Unmodified
Added
Removed
  • installers/sasview_qt5_osx.spec

    r44753d6 r2ae3edb  
    7070datas.append((os.path.join(PYTHON_LOC,'plugins','platforms'),'platforms')) 
    7171#TRN datas.append((os.path.join(PYTHON_LOC,'Lib','site-packages','zmq','libzmq.cp36-win_amd64.pyd'),'.')) 
    72 datas.append((os.path.join(PYTHON_LOC,'lib','python3.6', 'site-packages','zmq','libzmq.cpython-36m-darwin.so'),'.')) 
     72datas.append((os.path.join(PYTHON_LOC,'lib','python3.6', 'site-packages','zmq'),'.')) 
    7373# These depend on whether we have MKL or Atlas numpy 
    74 if os.path.exists(os.path.join(LIBLOC, LIBPREFIX + 'mkl_core.' + LIBSUFFIX)): 
    75     datas.append(add_binary(LIBPREFIX + 'mkl_avx2.' + LIBSUFFIX)) 
    76     datas.append(add_binary(LIBPREFIX + 'mkl_core.' + LIBSUFFIX)) 
    77 elif os.path.exists(os.path.join(LIBLOC, LIBPREFIX + 'numpy-atlas.' + LIBSUFFIX)): 
    78     datas.append(add_binary(LIBPREFIX + 'numpy-atlas.' + LIBSUFFIX)) 
    79 else: 
    80     raise Exception("No numerical library for numpy found.") 
     74#if os.path.exists(os.path.join(LIBLOC, LIBPREFIX + 'mkl_core.' + LIBSUFFIX)): 
     75#    datas.append(add_binary(LIBPREFIX + 'mkl_avx2.' + LIBSUFFIX)) 
     76#    datas.append(add_binary(LIBPREFIX + 'mkl_core.' + LIBSUFFIX)) 
     77#elif os.path.exists(os.path.join(LIBLOC, LIBPREFIX + 'numpy-atlas.' + LIBSUFFIX)): 
     78#    datas.append(add_binary(LIBPREFIX + 'numpy-atlas.' + LIBSUFFIX)) 
     79#else: 
     80#    raise Exception("No numerical library for numpy found.") 
    8181 
    8282#import sas.sascalc.dataloader.readers 
  • src/sas/qtgui/MainWindow/DataExplorer.py

    r6ff103a rfce6c55  
    965965            method_name='Plotter2D' 
    966966 
    967         new_plot = globals()[method_name](self, quickplot=True) 
    968         new_plot.data = data 
     967        self.new_plot = globals()[method_name](self, quickplot=True) 
     968        self.new_plot.data = data 
    969969        #new_plot.plot(marker='o') 
    970         new_plot.plot() 
     970        self.new_plot.plot() 
    971971 
    972972        # Update the global plot counter 
    973973        title = "Plot " + data.name 
    974         new_plot.setWindowTitle(title) 
     974        self.new_plot.setWindowTitle(title) 
    975975 
    976976        # Show the plot 
    977         new_plot.show() 
     977        self.new_plot.show() 
    978978 
    979979    def quickData3DPlot(self): 
     
    988988        data = GuiUtils.dataFromItem(model_item) 
    989989 
    990         new_plot = Plotter2D(self, quickplot=True, dimension=3) 
    991         new_plot.data = data 
    992         new_plot.plot() 
     990        self.new_plot = Plotter2D(self, quickplot=True, dimension=3) 
     991        self.new_plot.data = data 
     992        self.new_plot.plot() 
    993993 
    994994        # Update the global plot counter 
    995995        title = "Plot " + data.name 
    996         new_plot.setWindowTitle(title) 
     996        self.new_plot.setWindowTitle(title) 
    997997 
    998998        # Show the plot 
    999         new_plot.show() 
     999        self.new_plot.show() 
    10001000 
    10011001    def showEditDataMask(self, data=None): 
  • src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py

    r78f18d1 r0f959ef  
    5858            text_html = GuiUtils.convertUnitToHTML(str(options.text)) 
    5959            doc.setHtml(text_html) 
     60            doc.setDocumentMargin(1) 
    6061 
    6162            # delete the original content 
  • src/sas/qtgui/Plotting/Plotter2D.py

    rd9150d8 rfce6c55  
    402402            output = copy.deepcopy(data) 
    403403 
     404        # get the x and y_bin arrays. 
     405        x_bins, y_bins = PlotUtilities.get_bins(self.qx_data, self.qy_data) 
     406        self._data.x_bins = x_bins 
     407        self._data.y_bins = y_bins 
     408 
    404409        zmin_temp = self.zmin 
    405410        # check scale 
  • src/sas/sascalc/calculator/c_extensions/libfunc.c

    rb6c8abe rf54e82cf  
    9595// spintheta: angle (anti-clock-wise) between neutron spin(up) and x axis 
    9696// Note: all angles are in degrees. 
    97 polar_sld cal_msld(int isangle, double qx, double qy, double bn, 
     97void cal_msld(polar_sld *p_sld, int isangle, double qx, double qy, double bn, 
    9898                                double m01, double mtheta1, double mphi1, 
    9999                                double spinfraci, double spinfracf, double spintheta) 
     
    124124        double my = 0.0; 
    125125        double mz = 0.0; 
    126         polar_sld p_sld; 
    127         p_sld.uu = sld; 
    128         p_sld.dd = sld; 
    129         p_sld.re_ud = 0.0; 
    130         p_sld.im_ud = 0.0; 
    131         p_sld.re_du = 0.0; 
    132         p_sld.im_du = 0.0; 
     126        double uu = sld; 
     127        double dd = sld; 
     128        double re_ud = 0.0; 
     129        double im_ud = 0.0; 
     130        double re_du = 0.0; 
     131        double im_du = 0.0; 
    133132 
    134133        //No mag means no further calculation 
    135         if (isangle>0){ 
     134        if (isangle>0) { 
    136135                if (m_max < 1.0e-32){ 
    137                         p_sld.uu = sqrt(sqrt(in_spin * out_spin)) * p_sld.uu; 
    138                         p_sld.dd = sqrt(sqrt((1.0 - in_spin) * (1.0 - out_spin))) * p_sld.dd; 
    139                         return p_sld; 
    140                 } 
    141         } 
    142         else{ 
    143                 if (fabs(m_max)< 1.0e-32 && fabs(m_phi)< 1.0e-32 && fabs(m_theta)< 1.0e-32){ 
    144                         p_sld.uu = sqrt(sqrt(in_spin * out_spin)) * p_sld.uu; 
    145                         p_sld.dd = sqrt(sqrt((1.0 - in_spin) * (1.0 - out_spin))) * p_sld.dd; 
    146                         return p_sld; 
    147                 } 
    148         } 
    149  
    150         //These are needed because of the precision of inputs 
    151         if (in_spin < 0.0) in_spin = 0.0; 
    152         if (in_spin > 1.0) in_spin = 1.0; 
    153         if (out_spin < 0.0) out_spin = 0.0; 
    154         if (out_spin > 1.0) out_spin = 1.0; 
    155  
    156         if (q_x == 0.0) q_angle = pi / 2.0; 
    157         else q_angle = atan(q_y/q_x); 
    158         if (q_y < 0.0 && q_x < 0.0) q_angle -= pi; 
    159         else if (q_y > 0.0 && q_x < 0.0) q_angle += pi; 
    160  
    161         q_angle = pi/2.0 - q_angle; 
    162         if (q_angle > pi) q_angle -= 2.0 * pi; 
    163         else if (q_angle < -pi) q_angle += 2.0 * pi; 
    164  
    165         if (fabs(q_x) < 1.0e-16 && fabs(q_y) < 1.0e-16){ 
    166                 m_perp = 0.0; 
    167                 } 
    168         else { 
    169                 m_perp = m_max; 
    170                 } 
    171         if (is_angle > 0){ 
    172                 m_phi *= pi/180.0; 
    173                 m_theta *= pi/180.0; 
    174                 mx = m_perp * cos(m_theta) * cos(m_phi); 
    175                 my = m_perp * sin(m_theta); 
    176                 mz = -(m_perp * cos(m_theta) * sin(m_phi)); 
    177         } 
    178         else{ 
    179                 mx = m_perp; 
    180                 my = m_phi; 
    181                 mz = m_theta; 
    182         } 
    183         //ToDo: simplify these steps 
    184         // m_perp1 -m_perp2 
    185         m_perp_x = (mx) *  cos(q_angle); 
    186         m_perp_x -= (my) * sin(q_angle); 
    187         m_perp_y = m_perp_x; 
    188         m_perp_x *= cos(-q_angle); 
    189         m_perp_y *= sin(-q_angle); 
    190         m_perp_z = mz; 
    191  
    192         m_sigma_x = (m_perp_x * cos(-s_theta) - m_perp_y * sin(-s_theta)); 
    193         m_sigma_y = (m_perp_x * sin(-s_theta) + m_perp_y * cos(-s_theta)); 
    194         m_sigma_z = (m_perp_z); 
    195  
    196         //Find b 
    197         p_sld.uu -= m_sigma_x; 
    198         p_sld.dd += m_sigma_x; 
    199         p_sld.re_ud = m_sigma_y; 
    200         p_sld.re_du = m_sigma_y; 
    201         p_sld.im_ud = m_sigma_z; 
    202         p_sld.im_du = -m_sigma_z; 
    203  
    204         p_sld.uu = sqrt(sqrt(in_spin * out_spin)) * p_sld.uu; 
    205         p_sld.dd = sqrt(sqrt((1.0 - in_spin) * (1.0 - out_spin))) * p_sld.dd; 
    206  
    207         p_sld.re_ud = sqrt(sqrt(in_spin * (1.0 - out_spin))) * p_sld.re_ud; 
    208         p_sld.im_ud = sqrt(sqrt(in_spin * (1.0 - out_spin))) * p_sld.im_ud; 
    209         p_sld.re_du = sqrt(sqrt((1.0 - in_spin) * out_spin)) * p_sld.re_du; 
    210         p_sld.im_du = sqrt(sqrt((1.0 - in_spin) * out_spin)) * p_sld.im_du; 
    211  
    212         return p_sld; 
     136                        uu = sqrt(sqrt(in_spin * out_spin)) * uu; 
     137                        dd = sqrt(sqrt((1.0 - in_spin) * (1.0 - out_spin))) * dd; 
     138                } 
     139        } 
     140        else if (fabs(m_max)< 1.0e-32 && fabs(m_phi)< 1.0e-32 && fabs(m_theta)< 1.0e-32){ 
     141                        uu = sqrt(sqrt(in_spin * out_spin)) * uu; 
     142                        dd = sqrt(sqrt((1.0 - in_spin) * (1.0 - out_spin))) * dd; 
     143        } else { 
     144 
     145                //These are needed because of the precision of inputs 
     146                if (in_spin < 0.0) in_spin = 0.0; 
     147                if (in_spin > 1.0) in_spin = 1.0; 
     148                if (out_spin < 0.0) out_spin = 0.0; 
     149                if (out_spin > 1.0) out_spin = 1.0; 
     150 
     151                if (q_x == 0.0) q_angle = pi / 2.0; 
     152                else q_angle = atan(q_y/q_x); 
     153                if (q_y < 0.0 && q_x < 0.0) q_angle -= pi; 
     154                else if (q_y > 0.0 && q_x < 0.0) q_angle += pi; 
     155 
     156                q_angle = pi/2.0 - q_angle; 
     157                if (q_angle > pi) q_angle -= 2.0 * pi; 
     158                else if (q_angle < -pi) q_angle += 2.0 * pi; 
     159 
     160                if (fabs(q_x) < 1.0e-16 && fabs(q_y) < 1.0e-16){ 
     161                        m_perp = 0.0; 
     162                        } 
     163                else { 
     164                        m_perp = m_max; 
     165                        } 
     166                if (is_angle > 0){ 
     167                        m_phi *= pi/180.0; 
     168                        m_theta *= pi/180.0; 
     169                        mx = m_perp * cos(m_theta) * cos(m_phi); 
     170                        my = m_perp * sin(m_theta); 
     171                        mz = -(m_perp * cos(m_theta) * sin(m_phi)); 
     172                } 
     173                else{ 
     174                        mx = m_perp; 
     175                        my = m_phi; 
     176                        mz = m_theta; 
     177                } 
     178                //ToDo: simplify these steps 
     179                // m_perp1 -m_perp2 
     180                m_perp_x = (mx) *  cos(q_angle); 
     181                m_perp_x -= (my) * sin(q_angle); 
     182                m_perp_y = m_perp_x; 
     183                m_perp_x *= cos(-q_angle); 
     184                m_perp_y *= sin(-q_angle); 
     185                m_perp_z = mz; 
     186 
     187                m_sigma_x = (m_perp_x * cos(-s_theta) - m_perp_y * sin(-s_theta)); 
     188                m_sigma_y = (m_perp_x * sin(-s_theta) + m_perp_y * cos(-s_theta)); 
     189                m_sigma_z = (m_perp_z); 
     190 
     191                //Find b 
     192                uu -= m_sigma_x; 
     193                dd += m_sigma_x; 
     194                re_ud = m_sigma_y; 
     195                re_du = m_sigma_y; 
     196                im_ud = m_sigma_z; 
     197                im_du = -m_sigma_z; 
     198 
     199                uu = sqrt(sqrt(in_spin * out_spin)) * uu; 
     200                dd = sqrt(sqrt((1.0 - in_spin) * (1.0 - out_spin))) * dd; 
     201 
     202                re_ud = sqrt(sqrt(in_spin * (1.0 - out_spin))) * re_ud; 
     203                im_ud = sqrt(sqrt(in_spin * (1.0 - out_spin))) * im_ud; 
     204                re_du = sqrt(sqrt((1.0 - in_spin) * out_spin)) * re_du; 
     205                im_du = sqrt(sqrt((1.0 - in_spin) * out_spin)) * im_du; 
     206        } 
     207        p_sld->uu = uu; 
     208        p_sld->dd = dd; 
     209        p_sld->re_ud = re_ud; 
     210        p_sld->im_ud = im_ud; 
     211        p_sld->re_du = re_du; 
     212        p_sld->im_du = im_du; 
    213213} 
    214214 
  • src/sas/sascalc/calculator/c_extensions/libfunc.h

    rb6c8abe rf54e82cf  
    1818//double gamln(double x); 
    1919 
    20 polar_sld cal_msld(int isangle, double qx, double qy, double bn, double m01, double mtheta1,  
     20void cal_msld(polar_sld*, int isangle, double qx, double qy, double bn, double m01, double mtheta1,  
    2121                        double mphi1, double spinfraci, double spinfracf, double spintheta); 
    2222 
  • src/sas/sascalc/calculator/c_extensions/librefl.c

    r4c29e4d rf54e82cf  
    103103#endif // NEED_ERF 
    104104 
    105 complex cassign(real, imag) 
    106         double real, imag; 
    107 { 
    108         complex x; 
    109         x.re = real; 
    110         x.im = imag; 
    111         return x; 
    112 } 
    113  
    114  
    115 complex cplx_add(x,y) 
    116         complex x,y; 
    117 { 
    118         complex z; 
    119         z.re = x.re + y.re; 
    120         z.im = x.im + y.im; 
    121         return z; 
    122 } 
    123  
    124 complex rcmult(x,y) 
    125         double x; 
    126     complex y; 
    127 { 
    128         complex z; 
    129         z.re = x*y.re; 
    130         z.im = x*y.im; 
    131         return z; 
    132 } 
    133  
    134 complex cplx_sub(x,y) 
    135         complex x,y; 
    136 { 
    137         complex z; 
    138         z.re = x.re - y.re; 
    139         z.im = x.im - y.im; 
    140         return z; 
    141 } 
    142  
    143  
    144 complex cplx_mult(x,y) 
    145         complex x,y; 
    146 { 
    147         complex z; 
    148         z.re = x.re*y.re - x.im*y.im; 
    149         z.im = x.re*y.im + x.im*y.re; 
    150         return z; 
    151 } 
    152  
    153 complex cplx_div(x,y) 
    154         complex x,y; 
    155 { 
    156         complex z; 
    157         z.re = (x.re*y.re + x.im*y.im)/(y.re*y.re + y.im*y.im); 
    158         z.im = (x.im*y.re - x.re*y.im)/(y.re*y.re + y.im*y.im); 
    159         return z; 
    160 } 
    161  
    162 complex cplx_exp(b) 
    163         complex b; 
    164 { 
    165         complex z; 
     105void cassign(Cplx *x, double real, double imag) 
     106{ 
     107        x->re = real; 
     108        x->im = imag; 
     109} 
     110 
     111 
     112void cplx_add(Cplx *z, Cplx x, Cplx y) 
     113{ 
     114        z->re = x.re + y.re; 
     115        z->im = x.im + y.im; 
     116} 
     117 
     118void rcmult(Cplx *z, double x, Cplx y) 
     119{ 
     120        z->re = x*y.re; 
     121        z->im = x*y.im; 
     122} 
     123 
     124void cplx_sub(Cplx *z, Cplx x, Cplx y) 
     125{ 
     126        z->re = x.re - y.re; 
     127        z->im = x.im - y.im; 
     128} 
     129 
     130 
     131void cplx_mult(Cplx *z, Cplx x, Cplx y) 
     132{ 
     133        z->re = x.re*y.re - x.im*y.im; 
     134        z->im = x.re*y.im + x.im*y.re; 
     135} 
     136 
     137void cplx_div(Cplx *z, Cplx x, Cplx y) 
     138{ 
     139        z->re = (x.re*y.re + x.im*y.im)/(y.re*y.re + y.im*y.im); 
     140        z->im = (x.im*y.re - x.re*y.im)/(y.re*y.re + y.im*y.im); 
     141} 
     142 
     143void cplx_exp(Cplx *z, Cplx b) 
     144{ 
    166145        double br,bi; 
    167146        br=b.re; 
    168147        bi=b.im; 
    169         z.re = exp(br)*cos(bi); 
    170         z.im = exp(br)*sin(bi); 
    171         return z; 
    172 } 
    173  
    174  
    175 complex cplx_sqrt(z)    //see Schaum`s Math Handbook p. 22, 6.6 and 6.10 
    176         complex z; 
    177 { 
    178         complex c; 
     148        z->re = exp(br)*cos(bi); 
     149        z->im = exp(br)*sin(bi); 
     150} 
     151 
     152 
     153void cplx_sqrt(Cplx *c, Cplx z)    //see Schaum`s Math Handbook p. 22, 6.6 and 6.10 
     154{ 
    179155        double zr,zi,x,y,r,w; 
    180156 
     
    184160        if (zr==0.0 && zi==0.0) 
    185161        { 
    186     c.re=0.0; 
    187         c.im=0.0; 
    188     return c; 
    189         } 
    190         else 
    191         { 
     162                c->re=0.0; 
     163                c->im=0.0; 
     164        } else { 
    192165                x=fabs(zr); 
    193166                y=fabs(zi); 
     
    196169                        r=y/x; 
    197170                        w=sqrt(x)*sqrt(0.5*(1.0+sqrt(1.0+r*r))); 
    198                 } 
    199                 else 
    200                 { 
     171                } else { 
    201172                        r=x/y; 
    202173                        w=sqrt(y)*sqrt(0.5*(r+sqrt(1.0+r*r))); 
     
    204175                if (zr >=0.0) 
    205176                { 
    206                         c.re=w; 
    207                         c.im=zi/(2.0*w); 
     177                        c->re=w; 
     178                        c->im=zi/(2.0*w); 
     179                } else { 
     180                        c->im=(zi >= 0) ? w : -w; 
     181                        c->re=zi/(2.0*c->im); 
    208182                } 
    209                 else 
    210                 { 
    211                         c.im=(zi >= 0) ? w : -w; 
    212                         c.re=zi/(2.0*c.im); 
    213                 } 
    214                 return c; 
    215         } 
    216 } 
    217  
    218 complex cplx_cos(b) 
    219         complex b; 
    220 { 
    221         complex zero,two,z,i,bi,negbi; 
    222         zero = cassign(0.0,0.0); 
    223         two = cassign(2.0,0.0); 
    224         i = cassign(0.0,1.0); 
    225         bi = cplx_mult(b,i); 
    226         negbi = cplx_sub(zero,bi); 
    227         z = cplx_div(cplx_add(cplx_exp(bi),cplx_exp(negbi)),two); 
    228         return z; 
     183        } 
     184} 
     185 
     186void cplx_cos(Cplx *z, Cplx b) 
     187{ 
     188        // cos(b) = (e^bi + e^-bi)/2 
     189        //        = (e^b.im e^-i bi.re) + e^-b.im e^i b.re)/2 
     190        //        = (e^b.im cos(-b.re) + e^b.im sin(-b.re) i)/2 + (e^-b.im cos(b.re) + e^-b.im sin(b.re) i)/2 
     191        //        = e^b.im cos(b.re)/2 - e^b.im sin(b.re)/2 i + 1/e^b.im cos(b.re)/2 + 1/e^b.im sin(b.re)/2 i 
     192        //        = (e^b.im + 1/e^b.im)/2 cos(b.re) + (-e^b.im + 1/e^b.im)/2 sin(b.re) i 
     193        //        = cosh(b.im) cos(b.re) - sinh(b.im) sin(b.re) i 
     194        double exp_b_im = exp(b.im); 
     195        z->re = 0.5*(+exp_b_im + 1.0/exp_b_im) * cos(b.re); 
     196        z->im = -0.5*(exp_b_im - 1.0/exp_b_im) * sin(b.re); 
    229197} 
    230198 
  • src/sas/sascalc/calculator/c_extensions/librefl.h

    r9e531f2 rf54e82cf  
    55        double re; 
    66        double im; 
    7 } complex; 
     7} Cplx; 
    88 
    99typedef struct { 
    10         complex a; 
    11         complex b; 
    12         complex c; 
    13         complex d; 
     10        Cplx a; 
     11        Cplx b; 
     12        Cplx c; 
     13        Cplx d; 
    1414} matrix; 
    1515 
    16 complex cassign(double real, double imag); 
     16void cassign(Cplx*, double real, double imag); 
    1717 
    18 complex cplx_add(complex x,complex y); 
     18void cplx_add(Cplx*, Cplx x,Cplx y); 
    1919 
    20 complex rcmult(double x,complex y); 
     20void rcmult(Cplx*, double x,Cplx y); 
    2121 
    22 complex cplx_sub(complex x,complex y); 
     22void cplx_sub(Cplx*, Cplx x,Cplx y); 
    2323 
    24 complex cplx_mult(complex x,complex y); 
     24void cplx_mult(Cplx*, Cplx x,Cplx y); 
    2525 
    26 complex cplx_div(complex x,complex y); 
     26void cplx_div(Cplx*, Cplx x,Cplx y); 
    2727 
    28 complex cplx_exp(complex b); 
     28void cplx_exp(Cplx*, Cplx b); 
    2929 
    30 complex cplx_sqrt(complex z); 
     30void cplx_sqrt(Cplx*, Cplx z); 
    3131 
    32 complex cplx_cos(complex b); 
     32void cplx_cos(Cplx*, Cplx b); 
    3333 
    3434double intersldfunc(int fun_type, double n_sub, double i, double nu, double sld_l, double sld_r); 
  • src/sas/sascalc/calculator/c_extensions/sld2i.c

    re6f2009 rf54e82cf  
    5353        polar_sld b_sld; 
    5454        double qr = 0.0; 
    55         complex iqr = cassign(0.0, 0.0); 
    56         complex ephase = cassign(0.0, 0.0); 
    57         complex comp_sld = cassign(0.0, 0.0); 
    58  
    59         complex sumj_uu; 
    60         complex sumj_ud; 
    61         complex sumj_du; 
    62         complex sumj_dd; 
    63         complex temp_fi; 
     55        Cplx iqr; 
     56        Cplx ephase; 
     57        Cplx comp_sld; 
     58 
     59        Cplx sumj_uu; 
     60        Cplx sumj_ud; 
     61        Cplx sumj_du; 
     62        Cplx sumj_dd; 
     63        Cplx temp_fi; 
     64 
     65        int i, j; 
    6466 
    6567        double count = 0.0; 
    6668        //check if this computation is for averaging 
     69 
     70        cassign(&iqr, 0.0, 0.0); 
     71        cassign(&ephase, 0.0, 0.0); 
     72        cassign(&comp_sld, 0.0, 0.0); 
    6773 
    6874        //Assume that pixel volumes are given in vol_pix in A^3 unit 
     
    7278 
    7379        // Loop over q-values and multiply apply matrix 
    74         int i; 
    7580        for(i=0; i<npoints; i++){ 
    7681                //I_out[i] = 0.0; 
    77                 sumj_uu = cassign(0.0, 0.0); 
    78                 sumj_ud = cassign(0.0, 0.0); 
    79                 sumj_du = cassign(0.0, 0.0); 
    80                 sumj_dd = cassign(0.0, 0.0); 
    81                 //printf ("%d ", i); 
     82                cassign(&sumj_uu, 0.0, 0.0); 
     83                cassign(&sumj_ud, 0.0, 0.0); 
     84                cassign(&sumj_du, 0.0, 0.0); 
     85                cassign(&sumj_dd, 0.0, 0.0); 
     86                //printf("i: %d\n", i); 
    8287                //q = sqrt(qx[i]*qx[i] + qy[i]*qy[i]); // + qz[i]*qz[i]); 
    83                 int j; 
    8488                for(j=0; j<this->n_pix; j++){ 
    8589                        if (this->sldn_val[j]!=0.0 
     
    8892                                ||this->mz_val[j]!=0.0) 
    8993                        { 
     94                            // printf("i,j: %d,%d\n", i,j); 
    9095                                //anisotropic 
    91                                 temp_fi = cassign(0.0, 0.0); 
    92                                 b_sld = cal_msld(0, qx[i], qy[i], this->sldn_val[j], 
     96                                cassign(&temp_fi, 0.0, 0.0); 
     97                                cal_msld(&b_sld, 0, qx[i], qy[i], this->sldn_val[j], 
    9398                                                         this->mx_val[j], this->my_val[j], this->mz_val[j], 
    9499                                                         this->inspin, this->outspin, this->stheta); 
    95100                                qr = (qx[i]*this->x_val[j] + qy[i]*this->y_val[j]); 
    96                                 iqr = cassign(0.0, qr); 
    97                                 ephase = cplx_exp(iqr); 
     101                                cassign(&iqr, 0.0, qr); 
     102                                cplx_exp(&ephase, iqr); 
    98103 
    99104                                //Let's multiply pixel(atomic) volume here 
    100                                 ephase = rcmult(this->vol_pix[j], ephase); 
     105                                rcmult(&ephase, this->vol_pix[j], ephase); 
    101106                                //up_up 
    102107                                if (this->inspin > 0.0 && this->outspin > 0.0){ 
    103                                         comp_sld = cassign(b_sld.uu, 0.0); 
    104                                         temp_fi = cplx_mult(comp_sld, ephase); 
    105                                         sumj_uu = cplx_add(sumj_uu, temp_fi); 
     108                                        cassign(&comp_sld, b_sld.uu, 0.0); 
     109                                        cplx_mult(&temp_fi, comp_sld, ephase); 
     110                                        cplx_add(&sumj_uu, sumj_uu, temp_fi); 
    106111                                } 
    107112                                //down_down 
    108113                                if (this->inspin < 1.0 && this->outspin < 1.0){ 
    109                                         comp_sld = cassign(b_sld.dd, 0.0); 
    110                                         temp_fi = cplx_mult(comp_sld, ephase); 
    111                                         sumj_dd = cplx_add(sumj_dd, temp_fi); 
     114                                        cassign(&comp_sld, b_sld.dd, 0.0); 
     115                                        cplx_mult(&temp_fi, comp_sld, ephase); 
     116                                        cplx_add(&sumj_dd, sumj_dd, temp_fi); 
    112117                                } 
    113118                                //up_down 
    114119                                if (this->inspin > 0.0 && this->outspin < 1.0){ 
    115                                         comp_sld = cassign(b_sld.re_ud, b_sld.im_ud); 
    116                                         temp_fi = cplx_mult(comp_sld, ephase); 
    117                                         sumj_ud = cplx_add(sumj_ud, temp_fi); 
     120                                        cassign(&comp_sld, b_sld.re_ud, b_sld.im_ud); 
     121                                        cplx_mult(&temp_fi, comp_sld, ephase); 
     122                                        cplx_add(&sumj_ud, sumj_ud, temp_fi); 
    118123                                } 
    119124                                //down_up 
    120125                                if (this->inspin < 1.0 && this->outspin > 0.0){ 
    121                                         comp_sld = cassign(b_sld.re_du, b_sld.im_du); 
    122                                         temp_fi = cplx_mult(comp_sld, ephase); 
    123                                         sumj_du = cplx_add(sumj_du, temp_fi); 
    124                                 } 
    125  
     126                                        cassign(&comp_sld, b_sld.re_du, b_sld.im_du); 
     127                                        cplx_mult(&temp_fi, comp_sld, ephase); 
     128                                        cplx_add(&sumj_du, sumj_du, temp_fi); 
     129                                } 
    126130 
    127131                                if (i == 0){ 
     
    158162        //Assume that pixel volumes are given in vol_pix in A^3 unit 
    159163        // Loop over q-values and multiply apply matrix 
    160         int i;    
     164    int i, j, k; 
    161165        for(i=0; i<npoints; i++){ 
    162166                sumj =0.0; 
    163                 int j; 
    164167                for(j=0; j<n_pix; j++){ 
    165168                        //Isotropic: Assumes all slds are real (no magnetic) 
     
    179182                                //full calculation 
    180183                                //pragma omp parallel for 
    181                                 int k; 
    182184                                for(k=0; k<n_pix; k++){ 
    183185                                        sld_j =  this->sldn_val[j] * this->sldn_val[k] * this->vol_pix[j] * this->vol_pix[k]; 
  • src/sas/sascalc/calculator/c_extensions/sld2i_module.c

    r3010f68 rf54e82cf  
    44#include <Python.h> 
    55#include <stdio.h> 
    6 #include <sld2i.h> 
     6#include "sld2i.h" 
    77 
    88#if PY_MAJOR_VERSION < 3 
     
    6868        double outspin; 
    6969        double stheta; 
     70        GenI *sld2i; 
    7071 
    7172        if (!PyArg_ParseTuple(args, "iOOOOOOOOddd", &n_pix, &x_val_obj, &y_val_obj, &z_val_obj, &sldn_val_obj, &mx_val_obj, &my_val_obj, &mz_val_obj, &vol_pix_obj, &inspin, &outspin, &stheta)) return NULL; 
     
    7879        OUTVECTOR(mz_val_obj, mz_val, n_x); 
    7980        OUTVECTOR(vol_pix_obj, vol_pix, n_x); 
    80         GenI* sld2i =  PyMem_Malloc(sizeof(GenI)); 
     81        sld2i =  PyMem_Malloc(sizeof(GenI)); 
    8182        if (sld2i != NULL) { 
    8283                initGenI(sld2i, n_pix,x_val,y_val,z_val,sldn_val,mx_val,my_val,mz_val,vol_pix,inspin,outspin,stheta); 
     
    9899        double *I_out; 
    99100        PyObject *gen_obj; 
     101        GenI *sld2i; 
    100102 
    101103        if (!PyArg_ParseTuple(args, "OiOOO",  &gen_obj, &npoints, &qx_obj, &qy_obj, &I_out_obj)) return NULL; 
     
    108110 
    109111        // Set the array pointers 
    110         GenI* sld2i = (GenI *)PyCapsule_GetPointer(gen_obj, "GenI"); 
     112        sld2i = (GenI *)PyCapsule_GetPointer(gen_obj, "GenI"); 
    111113 
    112114        genicomXY(sld2i, npoints, qx, qy, I_out); 
     
    126128        double *I_out; 
    127129        PyObject *gen_obj; 
     130        GenI *sld2i; 
    128131 
    129132        if (!PyArg_ParseTuple(args, "OiOO",  &gen_obj, &npoints, &q_obj, &I_out_obj)) return NULL; 
     
    135138 
    136139        // Set the array pointers 
    137         GenI *sld2i = (GenI *)PyCapsule_GetPointer(gen_obj, "GenI"); 
     140        sld2i = (GenI *)PyCapsule_GetPointer(gen_obj, "GenI"); 
    138141 
    139142        genicom(sld2i, npoints, q, I_out); 
  • src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py

    r57be490 r4f80a83  
    158158    item_list[0].setCheckable(True) 
    159159    model.appendRow(item_list) 
     160 
     161def addHeadingRowToModel(model, name): 
     162    """adds a non-interactive top-level row to the model""" 
     163    header_row = [QtGui.QStandardItem() for i in range(5)] 
     164    header_row[0].setText(name) 
     165 
     166    font = header_row[0].font() 
     167    font.setBold(True) 
     168    header_row[0].setFont(font) 
     169 
     170    for item in header_row: 
     171        item.setEditable(False) 
     172        item.setCheckable(False) 
     173        item.setSelectable(False) 
     174 
     175    model.appendRow(header_row) 
    160176 
    161177def addHeadersToModel(model): 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    rdc71408 r548f8e2  
    475475        # Line edits in the option tab 
    476476        self.updateQRange() 
     477        # Structure factor options 
     478        self.cbProductMethod.setEnabled(False) 
    477479 
    478480    def initializeSignals(self): 
     
    654656        Return list of all parameters for the current model 
    655657        """ 
    656         return [self._model_model.item(row).text() for row in range(self._model_model.rowCount())] 
     658        return [self._model_model.item(row).text() 
     659                for row in range(self._model_model.rowCount()) 
     660                if self.isCheckable(row)] 
    657661 
    658662    def modifyViewOnRow(self, row, font=None, brush=None): 
     
    682686        assert(isinstance(constraint, Constraint)) 
    683687        assert(0<=row<=self._model_model.rowCount()) 
     688        assert(self.isCheckable(row)) 
    684689 
    685690        item = QtGui.QStandardItem() 
     
    702707        max_col = self.lstParams.itemDelegate().param_max 
    703708        for row in self.selectedParameters(): 
     709            assert(self.isCheckable(row)) 
    704710            param = self._model_model.item(row, 0).text() 
    705711            value = self._model_model.item(row, 1).text() 
     
    744750        max_col = self.lstParams.itemDelegate().param_max 
    745751        for row in range(self._model_model.rowCount()): 
     752            if not self.isCheckable(row): 
     753                continue 
    746754            if not self.rowHasConstraint(row): 
    747755                continue 
     
    772780        For the given row, return its constraint, if any 
    773781        """ 
    774         try: 
     782        if self.isCheckable(row): 
    775783            item = self._model_model.item(row, 1) 
    776             return item.child(0).data() 
    777         except AttributeError: 
    778             # return none when no constraints 
    779             return None 
     784            try: 
     785                return item.child(0).data() 
     786            except AttributeError: 
     787                # return none when no constraints 
     788                pass 
     789        return None 
    780790 
    781791    def rowHasConstraint(self, row): 
     
    783793        Finds out if row of the main model has a constraint child 
    784794        """ 
    785         item = self._model_model.item(row,1) 
    786         if item.hasChildren(): 
    787             c = item.child(0).data() 
    788             if isinstance(c, Constraint): 
    789                 return True 
     795        if self.isCheckable(row): 
     796            item = self._model_model.item(row,1) 
     797            if item.hasChildren(): 
     798                c = item.child(0).data() 
     799                if isinstance(c, Constraint): 
     800                    return True 
    790801        return False 
    791802 
     
    794805        Finds out if row of the main model has an active constraint child 
    795806        """ 
    796         item = self._model_model.item(row,1) 
    797         if item.hasChildren(): 
    798             c = item.child(0).data() 
    799             if isinstance(c, Constraint) and c.active: 
    800                 return True 
     807        if self.isCheckable(row): 
     808            item = self._model_model.item(row,1) 
     809            if item.hasChildren(): 
     810                c = item.child(0).data() 
     811                if isinstance(c, Constraint) and c.active: 
     812                    return True 
    801813        return False 
    802814 
     
    805817        Finds out if row of the main model has an active, nontrivial constraint child 
    806818        """ 
    807         item = self._model_model.item(row,1) 
    808         if item.hasChildren(): 
    809             c = item.child(0).data() 
    810             if isinstance(c, Constraint) and c.func and c.active: 
    811                 return True 
     819        if self.isCheckable(row): 
     820            item = self._model_model.item(row,1) 
     821            if item.hasChildren(): 
     822                c = item.child(0).data() 
     823                if isinstance(c, Constraint) and c.func and c.active: 
     824                    return True 
    812825        return False 
    813826 
     
    10461059        self.cmdPlot.setEnabled(True) 
    10471060 
     1061        # calc method control 
     1062        if structure_factor in [None, "", "None"]: 
     1063            self.cbProductMethod.setEnabled(False) 
     1064 
    10481065        # kernel parameters -> model_model 
    10491066        self.SASModelToQModel(model, structure_factor) 
     
    15021519            # internal so can use closure for param_dict 
    15031520            param_name = str(self._model_model.item(row, 0).text()) 
    1504             if param_name not in list(param_dict.keys()): 
     1521            if not self.isCheckable(row) or param_name not in list(param_dict.keys()): 
    15051522                return 
    15061523            # modify the param value 
     
    15141531            # Utility function for updateof polydispersity part of the main model 
    15151532            param_name = str(self._model_model.item(row, 0).text())+'.width' 
    1516             if param_name not in list(param_dict.keys()): 
     1533            if not self.isCheckable(row) or param_name not in list(param_dict.keys()): 
    15171534                return 
    15181535            # modify the param value 
     
    16431660            """ 
    16441661            for row_i in range(self._model_model.rowCount()): 
    1645                 func(row_i) 
     1662                if self.isCheckable(row_i): 
     1663                    func(row_i) 
    16461664 
    16471665        def updateFittedValues(row): 
     
    16671685                item.setText(error_repr) 
    16681686            def curr_param(): 
    1669                 return str(self._magnet_model.item(row, 0).text()) 
     1687                # TODO: this simple change seems to fix that item object from 
     1688                # TODO: being NONE...? why? 
     1689                item = self._magnet_model.item(row, 0) 
     1690                return str(item.text()) 
     1691                #return str(self._magnet_model.item(row, 0).text()) 
    16701692 
    16711693            [createItem(param_name) for param_name in list(param_dict.keys()) if curr_param() == param_name] 
     
    19471969        self.shell_names = self.shellNamesList() 
    19481970 
    1949         # Update the QModel 
     1971        # Get new rows for QModel 
    19501972        new_rows = FittingUtilities.addParametersToModel(self.model_parameters, self.kernel_module, self.is2D) 
    19511973 
     1974        # Add heading row 
     1975        FittingUtilities.addHeadingRowToModel(self._model_model, model_name) 
     1976 
     1977        # Update QModel 
    19521978        for row in new_rows: 
    19531979            self._model_model.appendRow(row) 
     
    19651991        self.kernel_module._model_info = product.make_product_info(self.kernel_module._model_info, structure_kernel._model_info) 
    19661992 
     1993        # Get new rows for QModel 
    19671994        new_rows = FittingUtilities.addSimpleParametersToModel(structure_parameters, self.is2D) 
     1995 
     1996        # Add heading row 
     1997        FittingUtilities.addHeadingRowToModel(self._model_model, structure_factor) 
     1998 
     1999        # Update QModel 
    19682000        for row in new_rows: 
    19692001            self._model_model.appendRow(row) 
    19702002        # Update the counter used for multishell display 
    19712003        self._last_model_row = self._model_model.rowCount() 
     2004 
     2005        # add to calc dropdown 
     2006        # TODO: THIS IS A TEMP MOCKUP (see below) 
     2007        self.cbProductMethod.clear() 
     2008        self.cbProductMethod.addItems(["default", "beta approx"]) 
     2009        self.cbProductMethod.setEnabled(True) 
     2010 
     2011        # TODO: commented-out code below uses unimplemented changes to 
     2012        # TODO: product.py 
     2013        #pname = product.PRODUCT_CALC_METHOD_PARAM 
     2014        #params = self.kernel_module._model_info.parameters 
     2015        #if pname in params: 
     2016        #    param = params[pname] 
     2017        #    choices = [product.PRODUCT_CALC_STRS[c] for c in param.choices] 
     2018        #    self.cbProductMethod.clear() 
     2019        #    self.cbProductMethod.addItems(choices) 
     2020        #    self.cbProductMethod.setEnabled(True) 
     2021        #else: 
     2022        #    logger.info("Could not find param '{}' in product modelinfo params".format( 
     2023        #        pname 
     2024        #    )) 
     2025        #    self.cbProductMethod.setEnabled(False) 
    19722026 
    19732027    def onMainParamsChange(self, item): 
     
    23432397        def updateFunctionCaption(row): 
    23442398            # Utility function for update of polydispersity function name in the main model 
     2399            if not self.isCheckable(row): 
     2400                return 
    23452401            param_name = str(self._model_model.item(row, 0).text()) 
    23462402            if param_name !=  param.name: 
  • src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui

    rd4dac80 r1f95cbe  
    77    <x>0</x> 
    88    <y>0</y> 
    9     <width>680</width> 
    10     <height>605</height> 
     9    <width>552</width> 
     10    <height>609</height> 
    1111   </rect> 
    1212  </property> 
     
    1919  <property name="minimumSize"> 
    2020   <size> 
    21     <width>434</width> 
     21    <width>481</width> 
    2222    <height>466</height> 
    2323   </size> 
     
    8282      </attribute> 
    8383      <layout class="QGridLayout" name="gridLayout_4"> 
    84        <item row="0" column="0" colspan="4"> 
     84       <item row="1" column="0"> 
     85        <widget class="QGroupBox" name="groupBox_7"> 
     86         <property name="title"> 
     87          <string>Options </string> 
     88         </property> 
     89         <layout class="QVBoxLayout" name="verticalLayout"> 
     90          <item> 
     91           <widget class="QCheckBox" name="chkPolydispersity"> 
     92            <property name="enabled"> 
     93             <bool>true</bool> 
     94            </property> 
     95            <property name="toolTip"> 
     96             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on orientational polydispersity.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     97            </property> 
     98            <property name="text"> 
     99             <string>Polydispersity</string> 
     100            </property> 
     101            <property name="checkable"> 
     102             <bool>true</bool> 
     103            </property> 
     104           </widget> 
     105          </item> 
     106          <item> 
     107           <widget class="QCheckBox" name="chk2DView"> 
     108            <property name="enabled"> 
     109             <bool>true</bool> 
     110            </property> 
     111            <property name="toolTip"> 
     112             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on 2D view of the model.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     113            </property> 
     114            <property name="text"> 
     115             <string>2D view</string> 
     116            </property> 
     117            <property name="checkable"> 
     118             <bool>true</bool> 
     119            </property> 
     120           </widget> 
     121          </item> 
     122          <item> 
     123           <widget class="QCheckBox" name="chkMagnetism"> 
     124            <property name="enabled"> 
     125             <bool>true</bool> 
     126            </property> 
     127            <property name="toolTip"> 
     128             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on magnetic scattering parameters.&lt;/p&gt;&lt;p&gt;This option is available only for 2D models.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     129            </property> 
     130            <property name="text"> 
     131             <string>Magnetism</string> 
     132            </property> 
     133            <property name="checkable"> 
     134             <bool>true</bool> 
     135            </property> 
     136           </widget> 
     137          </item> 
     138          <item> 
     139           <widget class="QCheckBox" name="chkChainFit"> 
     140            <property name="enabled"> 
     141             <bool>true</bool> 
     142            </property> 
     143            <property name="toolTip"> 
     144             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on Chain Fitting (parameter reuse) for batch datasets.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     145            </property> 
     146            <property name="text"> 
     147             <string>Chain fit</string> 
     148            </property> 
     149            <property name="checkable"> 
     150             <bool>true</bool> 
     151            </property> 
     152           </widget> 
     153          </item> 
     154         </layout> 
     155        </widget> 
     156       </item> 
     157       <item row="1" column="3"> 
     158        <widget class="QGroupBox" name="groupBox_8"> 
     159         <property name="title"> 
     160          <string>Fitting details </string> 
     161         </property> 
     162         <layout class="QGridLayout" name="gridLayout_17"> 
     163          <item row="0" column="0" colspan="2"> 
     164           <layout class="QGridLayout" name="gridLayout_8"> 
     165            <item row="0" column="0"> 
     166             <widget class="QLabel" name="label_16"> 
     167              <property name="text"> 
     168               <string>Min range</string> 
     169              </property> 
     170             </widget> 
     171            </item> 
     172            <item row="0" column="1"> 
     173             <widget class="QLabel" name="lblMinRangeDef"> 
     174              <property name="text"> 
     175               <string>0.005</string> 
     176              </property> 
     177             </widget> 
     178            </item> 
     179            <item row="0" column="2"> 
     180             <widget class="QLabel" name="label_17"> 
     181              <property name="text"> 
     182               <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
     183&lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     184              </property> 
     185             </widget> 
     186            </item> 
     187            <item row="1" column="0"> 
     188             <widget class="QLabel" name="label_18"> 
     189              <property name="text"> 
     190               <string>Max range</string> 
     191              </property> 
     192             </widget> 
     193            </item> 
     194            <item row="1" column="1"> 
     195             <widget class="QLabel" name="lblMaxRangeDef"> 
     196              <property name="text"> 
     197               <string>0.1</string> 
     198              </property> 
     199             </widget> 
     200            </item> 
     201            <item row="1" column="2"> 
     202             <widget class="QLabel" name="label_19"> 
     203              <property name="text"> 
     204               <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
     205&lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
     206              </property> 
     207             </widget> 
     208            </item> 
     209           </layout> 
     210          </item> 
     211          <item row="1" column="0"> 
     212           <widget class="QLabel" name="label_20"> 
     213            <property name="text"> 
     214             <string>Smearing:</string> 
     215            </property> 
     216           </widget> 
     217          </item> 
     218          <item row="1" column="1"> 
     219           <widget class="QLabel" name="lblCurrentSmearing"> 
     220            <property name="text"> 
     221             <string>None</string> 
     222            </property> 
     223           </widget> 
     224          </item> 
     225         </layout> 
     226        </widget> 
     227       </item> 
     228       <item row="0" column="0" colspan="6"> 
    85229        <widget class="QGroupBox" name="groupBox_6"> 
    86230         <property name="sizePolicy"> 
     
    156300        </widget> 
    157301       </item> 
    158        <item row="1" column="0"> 
    159         <widget class="QGroupBox" name="groupBox_7"> 
    160          <property name="title"> 
    161           <string>Options </string> 
    162          </property> 
    163          <layout class="QVBoxLayout" name="verticalLayout"> 
    164           <item> 
    165            <widget class="QCheckBox" name="chkPolydispersity"> 
    166             <property name="enabled"> 
    167              <bool>true</bool> 
    168             </property> 
    169             <property name="toolTip"> 
    170              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on orientational polydispersity.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    171             </property> 
    172             <property name="text"> 
    173              <string>Polydispersity</string> 
    174             </property> 
    175             <property name="checkable"> 
    176              <bool>true</bool> 
    177             </property> 
    178            </widget> 
    179           </item> 
    180           <item> 
    181            <widget class="QCheckBox" name="chk2DView"> 
    182             <property name="enabled"> 
    183              <bool>true</bool> 
    184             </property> 
    185             <property name="toolTip"> 
    186              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on 2D view of the model.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    187             </property> 
    188             <property name="text"> 
    189              <string>2D view</string> 
    190             </property> 
    191             <property name="checkable"> 
    192              <bool>true</bool> 
    193             </property> 
    194            </widget> 
    195           </item> 
    196           <item> 
    197            <widget class="QCheckBox" name="chkMagnetism"> 
    198             <property name="enabled"> 
    199              <bool>true</bool> 
    200             </property> 
    201             <property name="toolTip"> 
    202              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on magnetic scattering parameters.&lt;/p&gt;&lt;p&gt;This option is available only for 2D models.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    203             </property> 
    204             <property name="text"> 
    205              <string>Magnetism</string> 
    206             </property> 
    207             <property name="checkable"> 
    208              <bool>true</bool> 
    209             </property> 
    210            </widget> 
    211           </item> 
    212           <item> 
    213            <widget class="QCheckBox" name="chkChainFit"> 
    214             <property name="enabled"> 
    215              <bool>true</bool> 
    216             </property> 
    217             <property name="toolTip"> 
    218              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Switch on Chain Fitting (parameter reuse) for batch datasets.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    219             </property> 
    220             <property name="text"> 
    221              <string>Chain fit</string> 
    222             </property> 
    223             <property name="checkable"> 
    224              <bool>true</bool> 
    225             </property> 
    226            </widget> 
    227           </item> 
    228          </layout> 
    229         </widget> 
    230        </item> 
    231        <item row="1" column="1"> 
    232         <widget class="QGroupBox" name="groupBox_8"> 
    233          <property name="title"> 
    234           <string>Fitting details </string> 
    235          </property> 
    236          <layout class="QGridLayout" name="gridLayout_17"> 
    237           <item row="0" column="0" colspan="2"> 
    238            <layout class="QGridLayout" name="gridLayout_8"> 
    239             <item row="0" column="0"> 
    240              <widget class="QLabel" name="label_16"> 
    241               <property name="text"> 
    242                <string>Min range</string> 
    243               </property> 
    244              </widget> 
    245             </item> 
    246             <item row="0" column="1"> 
    247              <widget class="QLabel" name="lblMinRangeDef"> 
    248               <property name="text"> 
    249                <string>0.005</string> 
    250               </property> 
    251              </widget> 
    252             </item> 
    253             <item row="0" column="2"> 
    254              <widget class="QLabel" name="label_17"> 
    255               <property name="text"> 
    256                <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
    257 &lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    258               </property> 
    259              </widget> 
    260             </item> 
    261             <item row="1" column="0"> 
    262              <widget class="QLabel" name="label_18"> 
    263               <property name="text"> 
    264                <string>Max range</string> 
    265               </property> 
    266              </widget> 
    267             </item> 
    268             <item row="1" column="1"> 
    269              <widget class="QLabel" name="lblMaxRangeDef"> 
    270               <property name="text"> 
    271                <string>0.1</string> 
    272               </property> 
    273              </widget> 
    274             </item> 
    275             <item row="1" column="2"> 
    276              <widget class="QLabel" name="label_19"> 
    277               <property name="text"> 
    278                <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;à
    279 &lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> 
    280               </property> 
    281              </widget> 
    282             </item> 
    283            </layout> 
    284           </item> 
    285           <item row="1" column="0"> 
    286            <widget class="QLabel" name="label_20"> 
    287             <property name="text"> 
    288              <string>Smearing:</string> 
    289             </property> 
    290            </widget> 
    291           </item> 
    292           <item row="1" column="1"> 
    293            <widget class="QLabel" name="lblCurrentSmearing"> 
    294             <property name="text"> 
    295              <string>None</string> 
    296             </property> 
    297            </widget> 
    298           </item> 
    299          </layout> 
    300         </widget> 
    301        </item> 
    302302       <item row="1" column="2"> 
    303303        <spacer name="horizontalSpacer_3"> 
     
    307307         <property name="sizeHint" stdset="0"> 
    308308          <size> 
    309            <width>207</width> 
     309           <width>150</width> 
    310310           <height>20</height> 
    311311          </size> 
     
    313313        </spacer> 
    314314       </item> 
    315        <item row="1" column="3"> 
     315       <item row="1" column="5"> 
    316316        <widget class="QGroupBox" name="groupBox_9"> 
    317317         <property name="title"> 
     
    336336            </item> 
    337337           </layout> 
     338          </item> 
     339         </layout> 
     340        </widget> 
     341       </item> 
     342       <item row="1" column="1"> 
     343        <widget class="QGroupBox" name="groupBox"> 
     344         <property name="title"> 
     345          <string>S(Q) options</string> 
     346         </property> 
     347         <layout class="QVBoxLayout" name="verticalLayout_2"> 
     348          <item> 
     349           <widget class="QLabel" name="label_3"> 
     350            <property name="text"> 
     351             <string>Calc. method</string> 
     352            </property> 
     353           </widget> 
     354          </item> 
     355          <item> 
     356           <widget class="QComboBox" name="cbProductMethod"> 
     357            <property name="enabled"> 
     358             <bool>false</bool> 
     359            </property> 
     360            <property name="minimumSize"> 
     361             <size> 
     362              <width>83</width> 
     363              <height>0</height> 
     364             </size> 
     365            </property> 
     366           </widget> 
     367          </item> 
     368          <item> 
     369           <spacer name="verticalSpacer"> 
     370            <property name="orientation"> 
     371             <enum>Qt::Vertical</enum> 
     372            </property> 
     373            <property name="sizeType"> 
     374             <enum>QSizePolicy::Fixed</enum> 
     375            </property> 
     376            <property name="sizeHint" stdset="0"> 
     377             <size> 
     378              <width>20</width> 
     379              <height>40</height> 
     380             </size> 
     381            </property> 
     382           </spacer> 
    338383          </item> 
    339384         </layout> 
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py

    r3f5b901 r548f8e2  
    255255 
    256256        # We have 4 more rows now 
    257         self.assertEqual(self.widget._model_model.rowCount(), rowcount+4) 
     257        self.assertEqual(self.widget._model_model.rowCount(), rowcount+5) 
    258258 
    259259        # Switch models 
     
    275275        self.widget.cbStructureFactor.setCurrentIndex(last_index-1) 
    276276        # Do we have all the rows? 
    277         self.assertEqual(self.widget._model_model.rowCount(), 4) 
     277        self.assertEqual(self.widget._model_model.rowCount(), 5) 
    278278 
    279279        # Are the command buttons properly enabled? 
     
    497497        Test opening of the load file dialog for 'array' polydisp. function 
    498498        """ 
     499 
     500        # open a non-existent file 
    499501        filename = os.path.join("UnitTesting", "testdata_noexist.txt") 
     502        with self.assertRaises(OSError, msg="testdata_noexist.txt should be a non-existent file"): 
     503            os.stat(filename) 
    500504        QtWidgets.QFileDialog.getOpenFileName = MagicMock(return_value=(filename,'')) 
    501505        self.widget.show() 
     
    513517 
    514518        # good file 
     519        # TODO: this depends on the working directory being src/sas/qtgui, 
     520        # TODO: which isn't convenient if you want to run this test suite 
     521        # TODO: individually 
    515522        filename = os.path.join("UnitTesting", "testdata.txt") 
     523        try: 
     524            os.stat(filename) 
     525        except OSError: 
     526            self.assertTrue(False, "testdata.txt does not exist") 
    516527        QtWidgets.QFileDialog.getOpenFileName = MagicMock(return_value=(filename,'')) 
    517528 
     
    10121023 
    10131024         # Check the model 
    1014         self.assertEqual(self.widget._model_model.rowCount(), 6) 
     1025        self.assertEqual(self.widget._model_model.rowCount(), 7) 
    10151026        self.assertEqual(self.widget._model_model.columnCount(), 5) 
    10161027 
     
    11281139        # two rows selected 
    11291140        index1 = self.widget.lstParams.model().index(1, 0, QtCore.QModelIndex()) 
    1130         index2 = self.widget.lstParams.model().index(2, 0, QtCore.QModelIndex()) 
     1141        index2 = self.widget.lstParams.model().index(3, 0, QtCore.QModelIndex()) 
    11311142        selection_model = self.widget.lstParams.selectionModel() 
    11321143        selection_model.select(index1, selection_model.Select | selection_model.Rows) 
     
    11641175        # several random parameters 
    11651176        self.assertEqual(self.widget.getRowFromName('scale'), 0) 
    1166         self.assertEqual(self.widget.getRowFromName('length'), 5) 
     1177        self.assertEqual(self.widget.getRowFromName('length'), 6) 
    11671178 
    11681179    def testGetParamNames(self): 
     
    12011212        # Create a constraint object 
    12021213        const = Constraint(parent=None, value=7.0) 
    1203         row = 2 
     1214        row = 3 
    12041215 
    12051216        spy = QtSignalSpy(self.widget, self.widget.constraintAddedSignal) 
     
    12201231        # assign complex constraint now 
    12211232        const = Constraint(parent=None, param='radius', func='5*sld') 
    1222         row = 4 
     1233        row = 5 
    12231234        # call the method tested 
    12241235        self.widget.addConstraintToRow(constraint=const, row=row) 
     
    12791290        self.widget.cbModel.setCurrentIndex(model_index) 
    12801291 
     1292        row1 = 1 
     1293        row2 = 5 
     1294 
     1295        param1 = "background" 
     1296        param2 = "radius" 
     1297 
     1298        #default_value1 = "0.001" 
     1299        default_value2 = "20" 
     1300 
    12811301        # select two rows 
    1282         row1 = 1 
    1283         row2 = 4 
    12841302        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    12851303        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    12981316 
    12991317        # delete one of the constraints 
    1300         self.widget.deleteConstraintOnParameter(param='background') 
     1318        self.widget.deleteConstraintOnParameter(param=param1) 
    13011319 
    13021320        # see that the other constraint is still present 
    1303         cons = self.widget.getConstraintForRow(4) # 4 = radius 
    1304         self.assertEqual(cons.param, "radius") 
    1305         self.assertEqual(cons.value, "20") 
     1321        cons = self.widget.getConstraintForRow(row2) 
     1322        self.assertEqual(cons.param, param2) 
     1323        self.assertEqual(cons.value, default_value2) 
    13061324 
    13071325        # kill the other constraint 
     
    13091327 
    13101328        # see that the other constraint is still present 
    1311         self.assertEqual(self.widget.getConstraintsForModel(), [('radius', None)]) 
     1329        self.assertEqual(self.widget.getConstraintsForModel(), [(param2, None)]) 
    13121330 
    13131331    def testGetConstraintForRow(self): 
     
    13291347        self.widget.cbModel.setCurrentIndex(model_index) 
    13301348 
     1349        row1 = 1 
     1350        row2 = 5 
     1351 
    13311352        # select two rows 
    1332         row1 = 1 
    1333         row2 = 4 
    13341353        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    13351354        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    13411360        self.widget.addSimpleConstraint() 
    13421361 
    1343         con_list = [False, True, False, False, True, False] 
     1362        con_list = [False, True, False, False, False, True, False] 
    13441363        new_list = [] 
    13451364        for row in range(self.widget._model_model.rowCount()): 
     
    13591378        self.widget.cbModel.setCurrentIndex(model_index) 
    13601379 
     1380        row1 = 1 
     1381        row2 = 5 
     1382 
    13611383        # select two rows 
    1362         row1 = 1 
    1363         row2 = 4 
    13641384        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    13651385        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    13751395        constraint_objects[0].active = False 
    13761396 
    1377         con_list = [False, False, False, False, True, False] 
     1397        con_list = [False, False, False, False, False, True, False] 
    13781398        new_list = [] 
    13791399        for row in range(self.widget._model_model.rowCount()): 
     
    13961416        self.assertEqual(self.widget.getConstraintsForModel(),[]) 
    13971417 
     1418        row1 = 1 
     1419        row2 = 5 
     1420 
     1421        param1 = "background" 
     1422        param2 = "radius" 
     1423 
     1424        default_value1 = "0.001" 
     1425        default_value2 = "20" 
     1426 
    13981427        # select two rows 
    1399         row1 = 1 
    1400         row2 = 4 
    14011428        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    14021429        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    14101437        # simple constraints 
    14111438        # self.assertEqual(self.widget.getConstraintsForModel(), [('background', '0.001'), ('radius', '20')]) 
    1412         cons = self.widget.getConstraintForRow(1) # 1 - background 
    1413         self.assertEqual(cons.param, "background") 
    1414         self.assertEqual(cons.value, "0.001") 
    1415         cons = self.widget.getConstraintForRow(4) # 4 = radius 
    1416         self.assertEqual(cons.param, "radius") 
    1417         self.assertEqual(cons.value, "20") 
     1439        cons = self.widget.getConstraintForRow(row1) 
     1440        self.assertEqual(cons.param, param1) 
     1441        self.assertEqual(cons.value, default_value1) 
     1442        cons = self.widget.getConstraintForRow(row2) 
     1443        self.assertEqual(cons.param, param2) 
     1444        self.assertEqual(cons.value, default_value2) 
    14181445 
    14191446        objects = self.widget.getConstraintObjectsForModel() 
    14201447        self.assertEqual(len(objects), 2) 
    1421         self.assertEqual(objects[1].value, '20') 
    1422         self.assertEqual(objects[0].param, 'background') 
     1448        self.assertEqual(objects[1].value, default_value2) 
     1449        self.assertEqual(objects[0].param, param1) 
     1450 
     1451        row = 0 
     1452        param = "scale" 
     1453        func = "5*sld" 
    14231454 
    14241455        # add complex constraint 
    1425         const = Constraint(parent=None, param='scale', func='5*sld') 
    1426         row = 0 
     1456        const = Constraint(parent=None, param=param, func=func) 
    14271457        self.widget.addConstraintToRow(constraint=const, row=row) 
    14281458        #self.assertEqual(self.widget.getConstraintsForModel(),[('scale', '5*sld'), ('background', '0.001'), ('radius', None)]) 
    1429         cons = self.widget.getConstraintForRow(4) # 4 = radius 
    1430         self.assertEqual(cons.param, "radius") 
    1431         self.assertEqual(cons.value, "20") 
     1459        cons = self.widget.getConstraintForRow(row2) 
     1460        self.assertEqual(cons.param, param2) 
     1461        self.assertEqual(cons.value, default_value2) 
    14321462 
    14331463        objects = self.widget.getConstraintObjectsForModel() 
    14341464        self.assertEqual(len(objects), 3) 
    1435         self.assertEqual(objects[0].func, '5*sld') 
     1465        self.assertEqual(objects[0].func, func) 
    14361466 
    14371467    def testReplaceConstraintName(self): 
Note: See TracChangeset for help on using the changeset viewer.