Changeset b768e92 in sasview for src/sas


Ignore:
Timestamp:
Jun 2, 2016 10:14:35 AM (9 years ago)
Author:
Gonzalez, Miguel <gonzalez@…>
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
ec30905
Parents:
6afc14b (diff), 70305bd2 (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 'master' of https://github.com/SasView/sasview

Location:
src/sas
Files:
1 added
2 deleted
18 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sascalc/calculator/c_extensions/librefl.c

    r9e531f2 r4c29e4d  
    88#include <stdlib.h> 
    99#if defined(_MSC_VER) 
    10 #include "winFuncs.h" 
     10#define NEED_ERF 
    1111#endif 
     12 
     13 
     14 
     15#if defined(NEED_ERF) 
     16/* erf.c  - public domain implementation of error function erf(3m) 
     17 
     18reference - Haruhiko Okumura: C-gengo niyoru saishin algorithm jiten 
     19            (New Algorithm handbook in C language) (Gijyutsu hyouron 
     20            sha, Tokyo, 1991) p.227 [in Japanese]                 */ 
     21 
     22 
     23#ifdef _WIN32 
     24# include <float.h> 
     25# if !defined __MINGW32__ || defined __NO_ISOCEXT 
     26#  ifndef isnan 
     27#   define isnan(x) _isnan(x) 
     28#  endif 
     29#  ifndef isinf 
     30#   define isinf(x) (!_finite(x) && !_isnan(x)) 
     31#  endif 
     32#  ifndef finite 
     33#   define finite(x) _finite(x) 
     34#  endif 
     35# endif 
     36#endif 
     37 
     38static double q_gamma(double, double, double); 
     39 
     40/* Incomplete gamma function 
     41   1 / Gamma(a) * Int_0^x exp(-t) t^(a-1) dt  */ 
     42static double p_gamma(double a, double x, double loggamma_a) 
     43{ 
     44    int k; 
     45    double result, term, previous; 
     46 
     47    if (x >= 1 + a) return 1 - q_gamma(a, x, loggamma_a); 
     48    if (x == 0)     return 0; 
     49    result = term = exp(a * log(x) - x - loggamma_a) / a; 
     50    for (k = 1; k < 1000; k++) { 
     51        term *= x / (a + k); 
     52        previous = result;  result += term; 
     53        if (result == previous) return result; 
     54    } 
     55    fprintf(stderr, "erf.c:%d:p_gamma() could not converge.", __LINE__); 
     56    return result; 
     57} 
     58 
     59/* Incomplete gamma function 
     60   1 / Gamma(a) * Int_x^inf exp(-t) t^(a-1) dt  */ 
     61static double q_gamma(double a, double x, double loggamma_a) 
     62{ 
     63    int k; 
     64    double result, w, temp, previous; 
     65    double la = 1, lb = 1 + x - a;  /* Laguerre polynomial */ 
     66 
     67    if (x < 1 + a) return 1 - p_gamma(a, x, loggamma_a); 
     68    w = exp(a * log(x) - x - loggamma_a); 
     69    result = w / lb; 
     70    for (k = 2; k < 1000; k++) { 
     71        temp = ((k - 1 - a) * (lb - la) + (k + x) * lb) / k; 
     72        la = lb;  lb = temp; 
     73        w *= (k - 1 - a) / k; 
     74        temp = w / (la * lb); 
     75        previous = result;  result += temp; 
     76        if (result == previous) return result; 
     77    } 
     78    fprintf(stderr, "erf.c:%d:q_gamma() could not converge.", __LINE__); 
     79    return result; 
     80} 
     81 
     82#define LOG_PI_OVER_2 0.572364942924700087071713675675 /* log_e(PI)/2 */ 
     83 
     84double erf(double x) 
     85{ 
     86    if (!finite(x)) { 
     87        if (isnan(x)) return x;      /* erf(NaN)   = NaN   */ 
     88        return (x>0 ? 1.0 : -1.0);   /* erf(+-inf) = +-1.0 */ 
     89    } 
     90    if (x >= 0) return   p_gamma(0.5, x * x, LOG_PI_OVER_2); 
     91    else        return - p_gamma(0.5, x * x, LOG_PI_OVER_2); 
     92} 
     93 
     94double erfc(double x) 
     95{ 
     96    if (!finite(x)) { 
     97        if (isnan(x)) return x;      /* erfc(NaN)   = NaN      */ 
     98        return (x>0 ? 0.0 : 2.0);    /* erfc(+-inf) = 0.0, 2.0 */ 
     99    } 
     100    if (x >= 0) return  q_gamma(0.5, x * x, LOG_PI_OVER_2); 
     101    else        return  1 + p_gamma(0.5, x * x, LOG_PI_OVER_2); 
     102} 
     103#endif // NEED_ERF 
    12104 
    13105complex cassign(real, imag) 
  • src/sas/sascalc/calculator/c_extensions/sld2i.cpp

    r9e531f2 rb523c0e  
    164164        //Assume that pixel volumes are given in vol_pix in A^3 unit 
    165165        // Loop over q-values and multiply apply matrix 
    166         for(size_t i=0; i<npoints; i++){ 
     166        for(int i=0; i<npoints; i++){ 
    167167                sumj =0.0;               
    168                 for(size_t j=0; j<n_pix; j++){ 
     168                for(int j=0; j<n_pix; j++){ 
    169169                        //Isotropic: Assumes all slds are real (no magnetic) 
    170170                        //Also assumes there is no polarization: No dependency on spin 
     
    183183                                //full calculation 
    184184                                //pragma omp parallel for 
    185                                 for(size_t k=0; k<n_pix; k++){ 
     185                                for(int k=0; k<n_pix; k++){ 
    186186                                        sld_j =  sldn_val[j] * sldn_val[k] * vol_pix[j] * vol_pix[k]; 
    187187                                        qr = (x_val[j]-x_val[k])*(x_val[j]-x_val[k])+ 
  • src/sas/sascalc/calculator/c_extensions/sld2i.hh

    r9e531f2 r4c29e4d  
    3939                        double s_theta); 
    4040        // compute function 
    41         virtual void genicomXY(int npoints, double* qx, double* qy, double *I_out); 
    42         virtual void genicom(int npoints, double* q, double *I_out); 
     41        void genicomXY(int npoints, double* qx, double* qy, double *I_out); 
     42        void genicom(int npoints, double* q, double *I_out); 
    4343}; 
    4444 
  • src/sas/sascalc/calculator/c_extensions/sld2i_module.cpp

    r9e531f2 rb523c0e  
    153153initsld2i(void) 
    154154{ 
    155     PyObject* m; 
    156  
    157     m = Py_InitModule3("sld2i", module_methods, 
    158                        "Sld2i module"); 
     155    Py_InitModule3("sld2i", module_methods, "Sld2i module"); 
    159156} 
  • src/sas/sascalc/data_util/calcthread.py

    rb699768 r934ce649  
    119119 
    120120    def __init__(self, completefn=None, updatefn=None, 
    121                  yieldtime=0.01, worktime=0.01): 
     121                 yieldtime=0.01, worktime=0.01, 
     122                 exception_handler=None): 
    122123        """Prepare the calculator""" 
    123124        self.yieldtime     = yieldtime 
     
    125126        self.completefn    = completefn 
    126127        self.updatefn      = updatefn 
     128        self.exception_handler = exception_handler 
    127129        self._interrupting = False 
    128130        self._running      = False 
     
    199201 
    200202    def update(self, **kwargs): 
    201  
    202203        """Update GUI with the lastest results from the current work unit.""" 
    203204        if self.updatefn != None and clock() > self._time_for_update: 
     
    225226        """Perform a work unit.  The subclass will provide details of 
    226227        the arguments.""" 
    227         raise NotImplemented, "Calculation thread needs compute method" 
     228        raise NotImplemented("Calculation thread needs compute method") 
     229 
     230    def exception(self): 
     231        """ 
     232        An exception occurred during computation, so call the exception handler 
     233        if there is one.  If not, then log the exception and continue. 
     234        """ 
     235        # If we have an exception handler, let it try to handle the exception. 
     236        # If it fails fall through to log the failure to handle the exception 
     237        # (the original exception will be lost).  If there is no exception 
     238        # handler, just log the exception in compute that we are responding to. 
     239        if self.exception_handler: 
     240            try: 
     241                self.exception_handler(*sys.exc_info()) 
     242                return 
     243            except Exception: 
     244                pass 
     245        import logging 
     246        logging.error(traceback.format_exc()) 
     247        #print 'CalcThread exception', 
    228248 
    229249    def _run(self): 
     
    250270                pass 
    251271            except: 
    252                 traceback.print_exc() 
    253                 #print 'CalcThread exception', 
     272                self.exception() 
    254273        self._running = False 
    255274 
  • src/sas/sascalc/dataloader/readers/cansas_reader.py

    r45d90b9 raf09f48  
    221221                            output.append(return_value) 
    222222                    else: 
    223                         output.append("Invalid XML at: {0}".format(\ 
    224                                                     self.find_invalid_xml())) 
     223                        raise RuntimeError, "Invalid XML at: {0}".format(\ 
     224                                                    self.find_invalid_xml()) 
    225225                except: 
    226226                    # If the file does not match the schema, raise this error 
  • src/sas/sascalc/pr/c_extensions/Cinvertor.c

    rb699768 rb523c0e  
    115115 
    116116        //self->params.x = data; 
    117         self->params.npoints = ndata; 
     117        self->params.npoints = (int)ndata; 
    118118        return Py_BuildValue("i", self->params.npoints); 
    119119} 
     
    180180 
    181181        //self->params.y = data; 
    182         self->params.ny = ndata; 
     182        self->params.ny = (int)ndata; 
    183183        return Py_BuildValue("i", self->params.ny); 
    184184} 
     
    245245 
    246246        //self->params.err = data; 
    247         self->params.nerr = ndata; 
     247        self->params.nerr = (int)ndata; 
    248248        return Py_BuildValue("i", self->params.nerr); 
    249249} 
     
    523523    residuals = PyList_New(self->params.npoints); 
    524524 
    525     regterm = reg_term(pars, self->params.d_max, npars, nslice); 
     525    regterm = reg_term(pars, self->params.d_max, (int)npars, nslice); 
    526526 
    527527    for(i=0; i<self->params.npoints; i++) { 
    528         diff = self->params.y[i] - iq(pars, self->params.d_max, npars, self->params.x[i]); 
     528        diff = self->params.y[i] - iq(pars, self->params.d_max, (int)npars, self->params.x[i]); 
    529529        residual = diff*diff / (self->params.err[i]*self->params.err[i]); 
    530530 
     
    573573    residuals = PyList_New(self->params.npoints); 
    574574 
    575     regterm = reg_term(pars, self->params.d_max, npars, nslice); 
     575    regterm = reg_term(pars, self->params.d_max, (int)npars, nslice); 
    576576 
    577577 
    578578    for(i=0; i<self->params.npoints; i++) { 
    579         diff = self->params.y[i] - pr(pars, self->params.d_max, npars, self->params.x[i]); 
     579        diff = self->params.y[i] - pr(pars, self->params.d_max, (int)npars, self->params.x[i]); 
    580580        residual = diff*diff / (self->params.err[i]*self->params.err[i]); 
    581581 
     
    611611        OUTVECTOR(data_obj,pars,npars); 
    612612 
    613         iq_value = iq(pars, self->params.d_max, npars, q); 
     613        iq_value = iq(pars, self->params.d_max, (int)npars, q); 
    614614        return Py_BuildValue("f", iq_value); 
    615615} 
     
    636636        OUTVECTOR(data_obj,pars,npars); 
    637637 
    638         iq_value = iq_smeared(pars, self->params.d_max, npars, 
     638        iq_value = iq_smeared(pars, self->params.d_max, (int)npars, 
    639639                                                        self->params.slit_height, self->params.slit_width, 
    640640                                                        q, 21); 
     
    661661        OUTVECTOR(data_obj,pars,npars); 
    662662 
    663         pr_value = pr(pars, self->params.d_max, npars, r); 
     663        pr_value = pr(pars, self->params.d_max, (int)npars, r); 
    664664        return Py_BuildValue("f", pr_value); 
    665665} 
     
    689689 
    690690        if (err_obj == Py_None) { 
    691                 pr_value = pr(pars, self->params.d_max, npars, r); 
     691                pr_value = pr(pars, self->params.d_max, (int)npars, r); 
    692692                pr_err_value = 0.0; 
    693693        } else { 
    694694                OUTVECTOR(err_obj,pars_err,npars2); 
    695                 pr_err(pars, pars_err, self->params.d_max, npars, r, &pr_value, &pr_err_value); 
     695                pr_err(pars, pars_err, self->params.d_max, (int)npars, r, &pr_value, &pr_err_value); 
    696696        } 
    697697        return Py_BuildValue("ff", pr_value, pr_err_value); 
     
    728728        OUTVECTOR(data_obj,pars,npars); 
    729729 
    730         oscill = reg_term(pars, self->params.d_max, npars, 100); 
    731         norm   = int_p2(pars, self->params.d_max, npars, 100); 
     730        oscill = reg_term(pars, self->params.d_max, (int)npars, 100); 
     731        norm   = int_p2(pars, self->params.d_max, (int)npars, 100); 
    732732        return Py_BuildValue("f", sqrt(oscill/norm)/acos(-1.0)*self->params.d_max ); 
    733733 
     
    749749        OUTVECTOR(data_obj,pars,npars); 
    750750 
    751         count = npeaks(pars, self->params.d_max, npars, 100); 
     751        count = npeaks(pars, self->params.d_max, (int)npars, 100); 
    752752 
    753753        return Py_BuildValue("i", count ); 
     
    770770        OUTVECTOR(data_obj,pars,npars); 
    771771 
    772         fraction = positive_integral(pars, self->params.d_max, npars, 100); 
     772        fraction = positive_integral(pars, self->params.d_max, (int)npars, 100); 
    773773 
    774774        return Py_BuildValue("f", fraction ); 
     
    795795        OUTVECTOR(err_obj,pars_err,npars2); 
    796796 
    797         fraction = positive_errors(pars, pars_err, self->params.d_max, npars, 51); 
     797        fraction = positive_errors(pars, pars_err, self->params.d_max, (int)npars, 51); 
    798798 
    799799        return Py_BuildValue("f", fraction ); 
     
    815815        OUTVECTOR(data_obj,pars,npars); 
    816816 
    817         value = rg(pars, self->params.d_max, npars, 101); 
     817        value = rg(pars, self->params.d_max, (int)npars, 101); 
    818818 
    819819        return Py_BuildValue("f", value ); 
     
    835835        OUTVECTOR(data_obj,pars,npars); 
    836836 
    837         value = 4.0*acos(-1.0)*int_pr(pars, self->params.d_max, npars, 101); 
     837        value = 4.0*acos(-1.0)*int_pr(pars, self->params.d_max, (int)npars, 101); 
    838838 
    839839        return Py_BuildValue("f", value ); 
  • src/sas/sasgui/guiframe/local_perspectives/data_loader/data_loader.py

    rd85c194 rfaa3ae7  
    155155        """ 
    156156        data_error = False 
    157         for error_data in item.errors: 
     157        if hasattr(item, 'errors'): 
     158            for error_data in item.errors: 
     159                data_error = True 
     160                message += "\tError: {0}\n".format(error_data) 
     161        else: 
     162            logging.error("Loader returned an invalid object:\n %s" % str(item)) 
    158163            data_error = True 
    159             message += "\tError: {0}\n".format(error_data) 
     164         
    160165        data = self.parent.create_gui_data(item, p_file) 
    161166        output[data.id] = data 
     
    203208                                                          error_message) 
    204209            except: 
     210                logging.error(sys.exc_value) 
    205211                any_error = True 
    206212            if any_error or error_message != "": 
  • src/sas/sasgui/perspectives/calculator/model_editor.py

    rcb4ef58 rbb841ef  
    3030from wx.py.editwindow import EditWindow 
    3131from sas.sasgui.guiframe.documentation_window import DocumentationWindow 
     32from .pyconsole import show_model_output, check_model 
    3233 
    3334 
     
    4546PANEL_WIDTH = 500 
    4647_BOX_WIDTH = 55 
    47  
    48  
    49 def _compile_file(path): 
    50     """ 
    51     Compile the file in the path 
    52     """ 
    53     try: 
    54         import py_compile 
    55         py_compile.compile(file=path, doraise=True) 
    56         return '' 
    57     except: 
    58         _, value, _ = sys.exc_info() 
    59         return value 
    6048 
    6149def _delete_file(path): 
     
    384372            name2 = label[1] 
    385373            self.write_string(fname, name1, name2) 
    386             self.compile_file(fname) 
    387             self.parent.update_custom_combo() 
     374            success = show_model_output(self, fname) 
     375            if success: 
     376                self.parent.update_custom_combo() 
    388377            msg = self._notes 
    389378            info = 'Info' 
     
    618607        """ 
    619608        path = self.fname 
    620         _compile_file(path) 
     609        show_model_output(self, path) 
    621610 
    622611    def delete_file(self, path): 
     
    954943        info = 'Info' 
    955944        msg = '' 
     945        result, check_err = '', '' 
    956946        # Sort out the errors if occur 
    957947        # First check for valid python name then if the name already exists 
     
    969959                    self.write_file(self.fname, name, description, param_str, 
    970960                                    pd_param_str, func_str) 
     961                    try: 
     962                        result, msg = check_model(self.fname), None 
     963                    except Exception: 
     964                        import traceback 
     965                        result, msg = None, "error building model" 
     966                        check_err = "\n"+traceback.format_exc(limit=2) 
     967 
    971968                    # Modified compiling test, as it will fail for sasmodels.sasview_model class 
    972969                    # Should add a test to check that the class is correctly built  
     
    10311028            color = 'red' 
    10321029        else: 
    1033             msg = "Successful! " 
     1030            self._notes = result 
     1031            msg = "Successful! Please look for %s in Customized Models."%name 
    10341032            msg += "  " + self._notes 
    1035             msg += " Please look for it in the Customized Models." 
    10361033            info = 'Info' 
    10371034            color = 'blue' 
     
    10411038        if self.base != None: 
    10421039            from sas.sasgui.guiframe.events import StatusEvent 
    1043             wx.PostEvent(self.base.parent, StatusEvent(status=msg, info=info)) 
     1040            wx.PostEvent(self.base.parent, 
     1041                         StatusEvent(status=msg+check_err, info=info)) 
    10441042        self.warning = msg 
    10451043 
     
    13331331import copy 
    13341332 
    1335 import nuympy 
     1333import numpy 
    13361334 
    13371335from sas.sascalc.fit.pluginmodel import Model1DPlugin 
  • src/sas/sasgui/perspectives/calculator/pyconsole.py

    rd85c194 r26d6e045  
    44import sys 
    55import os 
     6 
     7import numpy as np 
     8 
    69import wx 
    7 import wx.lib.dialogs 
     10from wx.lib.dialogs import ScrolledMessageDialog 
    811import wx.py.editor as editor 
    9 import wx.py.frame as frame 
    10 import py_compile 
    1112 
    1213if sys.platform.count("win32") > 0: 
     
    1819    PANEL_HEIGHT = 730 
    1920    FONT_VARIANT = 1 
    20 ID_COMPILE = wx.NewId() 
     21ID_CHECK_MODEL = wx.NewId() 
    2122ID_RUN = wx.NewId() 
    2223 
    23 def compile_file(path): 
     24def check_model(path): 
    2425    """ 
    25     Compile a python file 
     26    Check that the model on the path can run. 
    2627    """ 
     28    # try running the model 
     29    from sasmodels.core import load_model, call_kernel 
     30    model = load_model(path) 
     31 
     32    q =  np.array([0.01, 0.1]) 
     33    kernel = model.make_kernel([q]) 
     34    Iq = call_kernel(kernel, {}) 
     35 
     36    qx, qy =  np.array([0.01, 0.01]), np.array([0.1, 0.1]) 
     37    kernel = model.make_kernel([qx, qy]) 
     38    Iqxy = call_kernel(kernel, {}) 
     39 
     40    result = """ 
     41    Iq(%s) = %s 
     42    Iqxy(%s, %s) = %s 
     43    """%(q, Iq, qx, qy, Iqxy) 
     44 
     45    return result 
     46 
     47def show_model_output(parent, fname): 
     48    # Make sure we have a python file; not sure why we care though... 
     49    if not (fname and os.path.exists(fname) and fname.endswith('.py')): 
     50        mssg = "\n This is not a python file." 
     51        wx.MessageBox(str(mssg), 'Error', style=wx.ICON_ERROR) 
     52        return False 
     53 
    2754    try: 
    28         import py_compile 
    29         py_compile.compile(file=path, doraise=True) 
    30     except: 
    31         type, value, traceback = sys.exc_info() 
    32         return value 
    33     return None 
     55        result, errmsg = check_model(fname), None 
     56    except Exception: 
     57        import traceback 
     58        result, errmsg = None, traceback.format_exc(limit=2) 
     59 
     60    parts = ["Running model '%s'..." % os.path.basename(fname)] 
     61    if errmsg is not None: 
     62        parts.extend(["", "Error occurred:", errmsg, ""]) 
     63        title, icon = "Error", wx.ICON_ERROR 
     64    else: 
     65        parts.extend(["", "Success:", result, ""]) 
     66        title, icon = "Info", wx.ICON_INFORMATION 
     67    text = "\n".join(parts) 
     68    dlg = ScrolledMessageDialog(parent, text, title, size=((550, 250))) 
     69    fnt = wx.Font(10, wx.TELETYPE, wx.NORMAL, wx.NORMAL) 
     70    dlg.GetChildren()[0].SetFont(fnt) 
     71    dlg.GetChildren()[0].SetInsertionPoint(0) 
     72    dlg.ShowModal() 
     73    dlg.Destroy() 
     74    return errmsg is None 
    3475 
    3576class PyConsole(editor.EditorNotebookFrame): 
     
    65106        self.Bind(wx.EVT_MENU, self.OnSaveFile, id=wx.ID_SAVE) 
    66107        self.Bind(wx.EVT_MENU, self.OnSaveAsFile, id=wx.ID_SAVEAS) 
    67         self.Bind(wx.EVT_MENU, self.OnCompile, id=ID_COMPILE) 
     108        self.Bind(wx.EVT_MENU, self.OnCheckModel, id=ID_CHECK_MODEL) 
    68109        self.Bind(wx.EVT_MENU, self.OnRun, id=ID_RUN) 
    69         self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateCompileMenu, id=ID_COMPILE) 
     110        self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateCompileMenu, id=ID_CHECK_MODEL) 
    70111        self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateCompileMenu, id=ID_RUN) 
    71112        self.Bind(wx.EVT_CLOSE, self.on_close) 
     
    81122        """ 
    82123        self.compileMenu = wx.Menu() 
    83         self.compileMenu.Append(ID_COMPILE, 'Compile', 
    84                  'Compile the file') 
     124        self.compileMenu.Append(ID_CHECK_MODEL, 'Check model', 
     125                 'Loading and run the model') 
    85126        self.compileMenu.AppendSeparator() 
    86127        self.compileMenu.Append(ID_RUN, 'Run in Shell', 
     
    192233        Run 
    193234        """ 
    194         if self._check_changed(): 
     235        if not self._check_saved(): 
    195236            return True 
    196237        if self.buffer and self.buffer.doc.filepath: 
     
    207248            icon = wx.ICON_ERROR 
    208249            wx.MessageBox(str(mssg), title, style=icon) 
    209             return 0 
    210  
    211     def OnCompile(self, event): 
     250            return False 
     251 
     252    def OnCheckModel(self, event): 
    212253        """ 
    213254        Compile 
    214255        """ 
    215         if self._check_changed(): 
     256        if not self._check_saved(): 
    216257            return True 
    217         run_out = self.OnRun(None) 
    218         if self._get_err_msg(run_out): 
    219             if self._manager != None and self.panel != None: 
    220                 self._manager.set_edit_menu_helper(self.parent) 
    221                 # Update custom model list in fitpage combobox 
    222                 wx.CallAfter(self._manager.update_custom_combo) 
    223  
    224     def _check_changed(self): 
     258        fname = self.editor.getStatus()[0] 
     259        success = show_model_output(self, fname) 
     260 
     261        # Update custom model list in fitpage combobox 
     262        if success and self._manager != None and self.panel != None: 
     263            self._manager.set_edit_menu_helper(self.parent) 
     264            wx.CallAfter(self._manager.update_custom_combo) 
     265 
     266    def _check_saved(self): 
    225267        """ 
    226268        If content was changed, suggest to save it first 
     
    228270        if self.bufferHasChanged() and self.buffer.doc.filepath: 
    229271            cancel = self.bufferSuggestSave() 
    230             if cancel: 
    231                 return cancel 
    232  
    233     def _get_err_msg(self, text=''): 
    234         """ 
    235         Get err_msg 
    236         """ 
    237         name = None 
    238         mssg = "\n This is not a python file." 
    239         title = 'Error' 
    240         icon = wx.ICON_ERROR 
    241         try: 
    242             fname = self.editor.getStatus()[0] 
    243             name = os.path.basename(fname) 
    244             if name.split('.')[-1] != 'py': 
    245                 wx.MessageBox(str(mssg), title, style=icon) 
    246                 return False 
    247             msg = compile_file(fname) 
    248         except: 
    249             msg = None 
    250         if name == None: 
    251             wx.MessageBox(str(mssg), title, style=icon) 
    252             return False 
    253         mssg = "Compiling '%s'...\n" % name 
    254         if msg != None: 
    255             mssg += "Error occurred:\n" 
    256             mssg += str(msg) + "\n\n" 
    257             if text: 
    258                 mssg += "Run-Test results:\n" 
    259                 mssg += str(text) 
    260                 title = 'Warning' 
    261                 icon = wx.ICON_WARNING 
    262         else: 
    263             mssg += "Successful.\n\n" 
    264             if text: 
    265                 if text.count('Failed') or text.count('Error:') > 0: 
    266                     mssg += "But Simple Test FAILED: Please check your code.\n" 
    267                 mssg += "Run-Test results:\n" 
    268                 mssg += str(text) 
    269             title = 'Info' 
    270             icon = wx.ICON_INFORMATION 
    271         dlg = wx.lib.dialogs.ScrolledMessageDialog(self, mssg, title, 
    272                                                    size=((550, 250))) 
    273         fnt = wx.Font(10, wx.TELETYPE, wx.NORMAL, wx.NORMAL) 
    274         dlg.GetChildren()[0].SetFont(fnt) 
    275         dlg.GetChildren()[0].SetInsertionPoint(0) 
    276         dlg.ShowModal() 
    277         dlg.Destroy() 
     272            return not cancel 
    278273        return True 
    279274 
     
    286281        event.Enable(True) 
    287282        try: 
    288             if id == ID_COMPILE or id == ID_RUN: 
     283            if id == ID_CHECK_MODEL or id == ID_RUN: 
    289284                menu_on = False 
    290285                if self.buffer and self.buffer.doc.filepath: 
  • src/sas/sasgui/perspectives/fitting/__init__.py

    r9e531f2 ra7c4ad2  
    3939    data_files = [] 
    4040    path = os.path.dirname(__file__) 
    41     # p_path = os.path.join(path, 'plugin_models') 
    42     # for f in findall(p_path): 
    43     #     data_files.append(('plugin_models', [f])) 
     41    p_path = os.path.join(path, 'plugin_models') 
     42    for f in findall(p_path): 
     43        data_files.append(('plugin_models', [f])) 
    4444    # path = get_data_path(media="media") 
    4545    for f in findall(path): 
  • src/sas/sasgui/perspectives/fitting/fitpage.py

    rcb4ef58 r934ce649  
    13301330                                              qmin=float(self.qmin_x), 
    13311331                                              qmax=float(self.qmax_x), 
    1332                                               enable_smearer=enable_smearer, 
    1333                                               draw=True) 
     1332                                              enable_smearer=enable_smearer) 
    13341333                if flag: 
    13351334                    #self.compute_chisqr(smearer= temp_smearer) 
     
    26062605                     qmin=float(self.qmin_x), 
    26072606                     qmax=float(self.qmax_x), 
    2608                      enable_smearer=enable_smearer, 
    2609                      draw=True) 
     2607                     enable_smearer=enable_smearer) 
    26102608 
    26112609        self.state.enable_smearer = self.enable_smearer.GetValue() 
  • src/sas/sasgui/perspectives/fitting/fitpanel.py

    rf60251f r05228b0  
    1717import models 
    1818_BOX_WIDTH = 80 
    19  
    2019 
    2120class FitPanel(nb, PanelBase): 
     
    154153        """ 
    155154        """ 
    156         from bumps.options import FIT_CONFIG 
    157         current = FIT_CONFIG.selected_name 
    158         self.parent.SetTitle(self.window_name + " - Active Fitting Optimizer: " + current) 
    159155        pos = self.GetSelection() 
    160156        if pos != -1: 
  • src/sas/sasgui/perspectives/fitting/fitting.py

    r86b049b r934ce649  
    1919import time 
    2020from copy import deepcopy 
    21 import models 
     21import traceback 
    2222 
    2323from sas.sascalc.dataloader.loader import Loader 
     
    4646from sas.sasgui.guiframe.documentation_window import DocumentationWindow 
    4747 
     48from . import models 
     49 
    4850MAX_NBR_DATA = 4 
    4951 
     
    5658    ON_MAC = True 
    5759 
    58  
     60import bumps.options 
     61from bumps.gui.fit_dialog import show_fit_config 
     62try: 
     63    from bumps.gui.fit_dialog import EVT_FITTER_CHANGED 
     64except ImportError: 
     65    # CRUFT: bumps 0.7.5.8 and below 
     66    EVT_FITTER_CHANGED = None  # type: wx.PyCommandEvent 
    5967 
    6068class Plugin(PluginBase): 
     
    254262                msg += "and try it again." 
    255263                wx.MessageBox(msg, 'Info') 
    256                 #wx.PostEvent(self.parent, StatusEvent(status=msg, type='stop', 
    257                 #                                      info='warning')) 
     264                #evt = StatusEvent(status=msg, type='stop', info='warning') 
     265                #wx.PostEvent(self.parent, evt) 
    258266            else: 
    259267                self.delete_menu.Delete(event_id) 
     
    262270                        self.edit_menu.DeleteItem(item) 
    263271                        msg = "The custom model, %s, has been deleted." % label 
    264                         wx.PostEvent(self.parent, StatusEvent(status=msg, 
    265                                                 type='stop', info='info')) 
     272                        evt = StatusEvent(status=msg, type='stop', info='info') 
     273                        wx.PostEvent(self.parent, evt) 
    266274                        break 
    267275        except: 
     
    501509        self.parent.Bind(EVT_SLICER_PANEL, self._on_slicer_event) 
    502510        self.parent.Bind(EVT_SLICER_PARS_UPDATE, self._onEVT_SLICER_PANEL) 
     511 
     512        # CRUFT: EVT_FITTER_CHANGED is not None for bumps 0.7.5.9 and above 
     513        if EVT_FITTER_CHANGED is not None: 
     514            self.parent.Bind(EVT_FITTER_CHANGED, self.on_fitter_changed) 
     515        self._set_fitter_label(bumps.options.FIT_CONFIG) 
     516 
    503517        #self.parent._mgr.Bind(wx.aui.EVT_AUI_PANE_CLOSE,self._onclearslicer) 
    504518        #Create reader when fitting panel are created 
     
    567581            except: 
    568582                msg = "Fitting: cannot deal with the theory received" 
     583                evt = StatusEvent(status=msg, info="error") 
    569584                logging.error("set_theory " + msg + "\n" + str(sys.exc_value)) 
    570                 wx.PostEvent(self.parent, 
    571                              StatusEvent(status=msg, info="error")) 
     585                wx.PostEvent(self.parent, evt) 
    572586 
    573587    def set_state(self, state=None, datainfo=None, format=None): 
     
    763777        Open the bumps options panel. 
    764778        """ 
    765         try: 
    766             from bumps.gui.fit_dialog import show_fit_config 
    767             show_fit_config(self.parent, help=self.on_help) 
    768         except ImportError: 
    769             # CRUFT: Bumps 0.7.5.6 and earlier do not have the help button 
    770             from bumps.gui.fit_dialog import OpenFitOptions 
    771             OpenFitOptions() 
     779        show_fit_config(self.parent, help=self.on_help) 
     780 
     781    def on_fitter_changed(self, event): 
     782        self._set_fitter_label(event.config) 
     783 
     784    def _set_fitter_label(self, config): 
     785        self.fit_panel.parent.SetTitle(self.fit_panel.window_name 
     786                                       + " - Active Fitting Optimizer: " 
     787                                       + config.selected_name) 
    772788 
    773789    def on_help(self, algorithm_id): 
     
    954970                    if not page.param_toFit: 
    955971                        msg = "No fitting parameters for %s" % page.window_caption 
    956                         wx.PostEvent(page.parent.parent, 
    957                                      StatusEvent(status=msg, info="error", 
    958                                                  type="stop")) 
     972                        evt = StatusEvent(status=msg, info="error", type="stop") 
     973                        wx.PostEvent(page.parent.parent, evt) 
    959974                        return False 
    960975                    if not page._update_paramv_on_fit(): 
     
    962977                        msg += " invalid in %s" % \ 
    963978                                    page.window_caption 
    964                         wx.PostEvent(page.parent.parent, 
    965                                      StatusEvent(status=msg, info="error", 
    966                                      type="stop")) 
     979                        evt = StatusEvent(status=msg, info="error", type="stop") 
     980                        wx.PostEvent(page.parent.parent, evt) 
    967981                        return False 
    968982 
     
    985999            except KeyboardInterrupt: 
    9861000                msg = "Fitting terminated" 
    987                 wx.PostEvent(self.parent, StatusEvent(status=msg, info="info", 
    988                                                       type="stop")) 
     1001                evt = StatusEvent(status=msg, info="info", type="stop") 
     1002                wx.PostEvent(self.parent, evt) 
    9891003                return True 
    9901004            except: 
    9911005                raise 
    9921006                msg = "Fitting error: %s" % str(sys.exc_value) 
    993                 wx.PostEvent(self.parent, StatusEvent(status=msg, info="error", 
    994                                                       type="stop")) 
     1007                evt = StatusEvent(status=msg, info="error", type="stop") 
     1008                wx.PostEvent(self.parent, evt) 
    9951009                return False 
    9961010        ## If a thread is already started, stop it 
     
    10871101            # add data associated to the page created 
    10881102            if page != None: 
    1089                 wx.PostEvent(self.parent, StatusEvent(status="Page Created", 
    1090                                                info="info")) 
     1103                evt = StatusEvent(status="Page Created", info="info") 
     1104                wx.PostEvent(self.parent, evt) 
    10911105            else: 
    10921106                msg = "Page was already Created" 
    1093                 wx.PostEvent(self.parent, StatusEvent(status=msg, 
    1094                                                        info="warning")) 
     1107                evt = StatusEvent(status=msg, info="warning") 
     1108                wx.PostEvent(self.parent, evt) 
    10951109        except: 
    10961110            msg = "Creating Fit page: %s" % sys.exc_value 
     
    12541268        msg = "Fit completed on %s \n" % str_time 
    12551269        msg += "Duration time: %s s.\n" % str(elapsed) 
    1256         wx.PostEvent(self.parent, StatusEvent(status=msg, info="info", 
    1257                                               type="stop")) 
     1270        evt = StatusEvent(status=msg, info="info", type="stop") 
     1271        wx.PostEvent(self.parent, evt) 
    12581272 
    12591273        if batch_outputs is None: 
     
    14051419                                         batch_inputs=batch_inputs) 
    14061420 
    1407         wx.PostEvent(self.parent, StatusEvent(status=msg, error="info", 
    1408                                               type="stop")) 
     1421        evt = StatusEvent(status=msg, error="info", type="stop") 
     1422        wx.PostEvent(self.parent, evt) 
    14091423        # Remove parameters that are not shown 
    14101424        cpage = self.fit_panel.get_page_by_id(uid) 
     
    14851499        msg = "Fit completed on %s \n" % str_time 
    14861500        msg += "Duration time: %s s.\n" % str(elapsed) 
    1487         wx.PostEvent(self.parent, StatusEvent(status=msg, info="info", 
    1488                                                       type="stop")) 
     1501        evt = StatusEvent(status=msg, info="info", type="stop") 
     1502        wx.PostEvent(self.parent, evt) 
    14891503        wx.PostEvent(self.result_panel, PlotResultEvent(result=result)) 
    14901504        wx.CallAfter(self._update_fit_button, page_id) 
     
    15101524                    not numpy.all(numpy.isfinite(res.pvec)): 
    15111525                    msg = "Fitting did not converge!!!" 
    1512                     wx.PostEvent(self.parent, 
    1513                              StatusEvent(status=msg, 
    1514                                          info="warning", 
    1515                                          type="stop")) 
     1526                    evt = StatusEvent(status=msg, info="warning", type="stop") 
     1527                    wx.PostEvent(self.parent, evt) 
    15161528                    wx.CallAfter(self._update_fit_button, page_id) 
    15171529                else: 
     
    15371549                    except KeyboardInterrupt: 
    15381550                        msg = "Singular point: Fitting Stoped." 
    1539                         wx.PostEvent(self.parent, StatusEvent(status=msg, 
    1540                                                               info="info", 
    1541                                                               type="stop")) 
     1551                        evt = StatusEvent(status=msg, info="info", type="stop") 
     1552                        wx.PostEvent(self.parent, evt) 
    15421553                    except: 
    15431554                        msg = "Singular point: Fitting Error occurred." 
    1544                         wx.PostEvent(self.parent, StatusEvent(status=msg, 
    1545                                                               info="error", 
    1546                                                               type="stop")) 
     1555                        evt = StatusEvent(status=msg, info="error", type="stop") 
     1556                        wx.PostEvent(self.parent, evt) 
    15471557 
    15481558        except: 
     
    15501560                   % sys.exc_value) 
    15511561            #import traceback; msg = "\n".join((traceback.format_exc(), msg)) 
    1552             wx.PostEvent(self.parent, StatusEvent(status=msg, info="warning", 
    1553                                                   type="stop")) 
     1562            evt = StatusEvent(status=msg, info="warning", type="stop") 
     1563            wx.PostEvent(self.parent, evt) 
    15541564 
    15551565    def _update_fit_button(self, page_id): 
     
    15881598        ## post a message to status bar 
    15891599        msg = "Set Chain Fitting: %s" % str(not self.batch_reset_flag) 
    1590         wx.PostEvent(self.parent, 
    1591                      StatusEvent(status=msg)) 
     1600        wx.PostEvent(self.parent, StatusEvent(status=msg)) 
    15921601 
    15931602 
     
    17351744            raise 
    17361745 
     1746    def _calc_exception(self, etype, value, tb): 
     1747        """ 
     1748        Handle exception from calculator by posting it as an error. 
     1749        """ 
     1750        logging.error("".join(traceback.format_exception(etype, value, tb))) 
     1751        msg = traceback.format_exception(etype, value, tb, limit=1) 
     1752        evt = StatusEvent(status="".join(msg), type="stop", info="error") 
     1753        wx.PostEvent(self.parent, evt) 
     1754 
    17371755    def _update2D(self, output, time=None): 
    17381756        """ 
    17391757        Update the output of plotting model 
    17401758        """ 
    1741         wx.PostEvent(self.parent, StatusEvent(status="Plot \ 
    1742         #updating ... ", type="update")) 
    1743         #self.ready_fit() 
     1759        msg = "Plot updating ... " 
     1760        wx.PostEvent(self.parent, StatusEvent(msg, type="update")) 
    17441761 
    17451762    def _complete2D(self, image, data, model, page_id, elapsed, index, qmin, 
     
    18471864                    time.sleep(0.1) 
    18481865            self.calc_2D = Calc2D(model=model, 
    1849                                     data=data, 
    1850                                     page_id=page_id, 
    1851                                     smearer=smearer, 
    1852                                     qmin=qmin, 
    1853                                     qmax=qmax, 
    1854                                     weight=weight, 
    1855                                     fid=fid, 
    1856                                     toggle_mode_on=toggle_mode_on, 
    1857                                     state=state, 
    1858                                     completefn=self._complete2D, 
    1859                                     update_chisqr=update_chisqr, source=source) 
     1866                                  data=data, 
     1867                                  page_id=page_id, 
     1868                                  smearer=smearer, 
     1869                                  qmin=qmin, 
     1870                                  qmax=qmax, 
     1871                                  weight=weight, 
     1872                                  fid=fid, 
     1873                                  toggle_mode_on=toggle_mode_on, 
     1874                                  state=state, 
     1875                                  completefn=self._complete2D, 
     1876                                  update_chisqr=update_chisqr, 
     1877                                  exception_handler=self._calc_exception, 
     1878                                  source=source) 
    18601879            self.calc_2D.queue() 
    18611880        except: 
     
    19121931                                  #updatefn = self._update1D, 
    19131932                                  update_chisqr=update_chisqr, 
     1933                                  exception_handler=self._calc_exception, 
    19141934                                  source=source) 
    19151935            self.calc_1D.queue() 
  • src/sas/sasgui/perspectives/fitting/model_thread.py

    rd85c194 r934ce649  
    2525                 source='model', 
    2626                 yieldtime=0.04, 
    27                  worktime=0.04 
     27                 worktime=0.04, 
     28                 exception_handler=None, 
    2829                 ): 
    29         CalcThread.__init__(self, completefn, updatefn, yieldtime, worktime) 
     30        CalcThread.__init__(self, completefn, updatefn, yieldtime, worktime, 
     31                            exception_handler=exception_handler) 
    3032        self.qmin = qmin 
    3133        self.qmax = qmax 
     
    133135                 updatefn=None, 
    134136                 yieldtime=0.01, 
    135                  worktime=0.01 
     137                 worktime=0.01, 
     138                 exception_handler=None, 
    136139                 ): 
    137140        """ 
    138141        """ 
    139         CalcThread.__init__(self, completefn, 
    140                  updatefn, 
    141                  yieldtime, 
    142                  worktime) 
     142        CalcThread.__init__(self, completefn, updatefn, yieldtime, worktime, 
     143                            exception_handler=exception_handler) 
    143144        self.fid = fid 
    144145        self.data = data 
  • src/sas/sasgui/perspectives/invariant/media/invariant_help.rst

    r7805458 r70305bd2  
    1919.. image:: image001.gif 
    2020 
    21 where *g = Q* for pinhole geometry (SAS) and *g = Qv* (the slit height) for   
     21where *g = q* for pinhole geometry (SAS) and *g = q*\ :sub:`v` (the slit height) for   
    2222slit geometry (USAS). 
    2323 
  • src/sas/sasgui/plottools/plottables.py

    rd7bb526 rcd54205  
    704704            else: 
    705705                self.dy = None 
    706             tempx = [] 
    707             tempy = [] 
    708706            if not has_err_x: 
    709707                dx = numpy.zeros(len(x)) 
     
    724722                    if has_err_y: 
    725723                        self.dy.append(tempdy) 
    726                 except: 
    727                     tempx = x[i] 
    728                     tempy = y[i] 
    729                     tempdy = dy[i] 
     724                except Exception: 
     725                    pass 
    730726            # Sanity check 
    731727            if not len(self.x) == len(self.y): 
     
    733729                msg += "and y are not of the same length" 
    734730                raise ValueError, msg 
    735             if has_err_x and not (len(self.x) and len(self.dx)): 
     731            if has_err_x and not (len(self.x) == len(self.dx)): 
    736732                msg = "Plottable.View: transformed x and dx" 
    737733                msg += " are not of the same length" 
    738734                raise ValueError, msg 
    739             if has_err_y and not (len(self.y) and len(self.dy)): 
     735            if has_err_y and not (len(self.y) == len(self.dy)): 
    740736                msg = "Plottable.View: transformed y" 
    741737                msg += " and dy are not of the same length" 
  • src/sas/sasgui/perspectives/fitting/models.py

    rcb4ef58 r6afc14b  
    147147    try: 
    148148        import compileall 
    149         compileall.compile_dir(dir=dir, ddir=dir, force=1, 
     149        compileall.compile_dir(dir=dir, ddir=dir, force=0, 
    150150                               quiet=report_problem) 
    151151    except: 
Note: See TracChangeset for help on using the changeset viewer.