source: sasview/fittingview/src/sans/perspectives/fitting/fit_thread.py @ 38226d26

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 38226d26 was 940aca7, checked in by Mathieu Doucet <doucetm@…>, 13 years ago

Merge 2.1.1 into trunk

  • Property mode set to 100644
File size: 3.6 KB
Line 
1
2import sys
3import time
4from data_util.calcthread import CalcThread
5
6def map_getattr(classInstance, classFunc, *args):
7    """
8    Take an instance of a class and a function name as a string.
9    Execute class.function and return result
10    """
11    return  getattr(classInstance,classFunc)(*args)
12
13def map_apply(arguments):
14    return apply(arguments[0], arguments[1:])
15
16class FitThread(CalcThread):
17    """Thread performing the fit """
18   
19    def __init__(self, 
20                  fn,
21                  page_id,
22                   handler,
23                    batch_outputs,
24                    batch_inputs=None,             
25                  pars=None,
26                 completefn = None,
27                 updatefn   = None,
28                 yieldtime  = 0.03,
29                 worktime   = 0.03,
30                 ftol       = None,
31                 reset_flag = False):
32        CalcThread.__init__(self,completefn,
33                 updatefn,
34                 yieldtime,
35                 worktime)
36        self.handler = handler
37        self.fitter = fn
38        self.pars = pars
39        self.batch_inputs = batch_inputs
40        self.batch_outputs = batch_outputs
41        self.page_id = page_id
42        self.starttime = time.time()
43        self.updatefn = updatefn
44        #Relative error desired in the sum of squares.
45        self.ftol = ftol
46        self.reset_flag = reset_flag
47   
48    def isquit(self):
49        """
50        :raise KeyboardInterrupt: when the thread is interrupted
51       
52        """
53        try:
54            CalcThread.isquit(self)
55        except KeyboardInterrupt:
56            msg = "Fitting: terminated by the user."
57            raise KeyboardInterrupt, msg
58       
59    def compute(self):
60        """
61        Perform a fit
62        """
63        msg = ""
64        try:
65            import copy
66            list_handler = []
67            list_curr_thread = [] 
68            list_ftol = []
69            list_reset_flag = []
70            list_map_get_attr = []
71            list_fit_function = []
72            list_q = []
73            for i in range(len(self.fitter)):
74                list_handler.append(self.handler)
75                list_q.append(None)
76                list_curr_thread.append(self)
77                list_ftol.append(self.ftol)
78                list_reset_flag.append(self.reset_flag)
79                list_fit_function.append('fit')
80                list_map_get_attr.append(map_getattr)
81            #from multiprocessing import Pool
82            inputs = zip(list_map_get_attr,self.fitter, list_fit_function,
83                          list_q, list_q, list_handler,list_curr_thread,list_ftol,
84                         list_reset_flag)
85            result =  map(map_apply, inputs)
86   
87            self.complete(result=result,
88                          batch_inputs=self.batch_inputs,
89                           batch_outputs=self.batch_outputs,
90                          page_id=self.page_id,
91                          pars = self.pars,
92                          elapsed=time.time()-self.starttime)
93           
94        except KeyboardInterrupt, msg:
95            # Thread was interrupted, just proceed and re-raise.
96            # Real code should not print, but this is an example...
97            #print "keyboard exception"
98            #Stop on exception during fitting. Todo: need to put
99            #some mssg and reset progress bar.
100           
101            if self.handler is not None:
102                self.handler.error(msg=msg)
103        except:
104            if self.handler is not None:
105                self.handler.error(msg=str(sys.exc_value))
106           
107       
108   
Note: See TracBrowser for help on using the repository browser.