source: sasview/sansview/perspectives/fitting/fit_thread.py @ ed2ea6a

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 ed2ea6a was ed2ea6a, checked in by Gervaise Alina <gervyh@…>, 15 years ago

print statement removed

  • Property mode set to 100644
File size: 6.2 KB
Line 
1
2import sys, wx, logging
3import string, numpy, math
4from sans.guicomm.events import NewPlotEvent, StatusEvent 
5from sans.guiframe.calcthread import CalcThread
6import park
7from park.fitresult import FitHandler
8DEFAULT_BEAM = 0.005
9import time
10 
11class ConsoleUpdate(FitHandler):
12    """
13    Print progress to the console.
14    """
15    isbetter = False
16    """Record whether results improved since last update"""
17    progress_delta =  60
18    """Number of seconds between progress updates"""
19    improvement_delta = 5
20    """Number of seconds between improvement updates"""
21    def __init__(self,parent, quiet=False,progress_delta=60,improvement_delta=5):
22        """
23        If quiet is true, only print out final summary, not progress and
24        improvements.
25        """
26        self.parent= parent
27        self.progress_time = time.time()
28        self.progress_percent = 0
29        self.improvement_time = self.progress_time
30        self.isbetter = False
31        self.quiet = quiet
32        self.progress_delta = progress_delta
33        self.improvement_delta = improvement_delta
34
35    def progress(self, k, n):
36        """
37        Report on progress.
38        """
39        if self.quiet: return
40        t = time.time()
41        p = int((100*k)//n)
42       
43        # Show improvements if there are any
44        dt = t - self.improvement_time
45        if self.isbetter and dt > self.improvement_delta:
46            self.result.print_summary()
47            self.isbetter = False
48            self.improvement_time = t
49           
50            wx.PostEvent(self.parent, StatusEvent(status=\
51             "%d%% complete ..."%(p),type="update"))
52       
53        # Update percent complete
54        dp = p-self.progress_percent
55        if dp < 1: return
56        dt = t - self.progress_time
57        if dt > self.progress_delta:
58            if 1 <= dp <= 2:
59                self.progress_percent = p
60                self.progress_time = t
61                wx.PostEvent(self.parent, StatusEvent(status=\
62                                                      "%d%% complete ..."%(p),type="update"))
63       
64            elif 2 < dp <= 5:
65                if p//5 != self.progress_percent//5:
66                    wx.PostEvent(self.parent, StatusEvent(status=\
67                       "%d%% complete ..."%(5*(p//5)),type="update"))
68                    self.progress_percent = p
69                    self.progress_time = t
70            else:
71                if p//10 != self.progress_percent//10:
72                    self.progress_percent = p
73                    self.progress_time = t
74                    wx.PostEvent(self.parent, StatusEvent(status=\
75                   "%d%% complete ..."%(10*(p//10)),type="update"))
76       
77    def improvement(self):
78        """
79        Called when a result is observed which is better than previous
80        results from the fit.
81        """
82        self.isbetter = True
83   
84    def error(self, msg):
85        """
86        Model had an error; print traceback
87        """
88        if self.isbetter:
89            self.result.print_summary()
90        print msg
91
92    def finalize(self):
93        if self.isbetter:
94            self.result.print_summary()
95
96    def abort(self):
97        if self.isbetter:
98            self.result.print_summary()
99
100class FitThread(CalcThread):
101    """Thread performing the fit """
102   
103    def __init__(self,parent, fn,pars=None,cpage=None, qmin=None,qmax=None,ymin=None, ymax=None,
104                 xmin=None,xmax=None,
105                 completefn = None,
106                 updatefn   = None,
107                 yieldtime  = 0.01,
108                 worktime   = 0.01
109                 ):
110        CalcThread.__init__(self,completefn,
111                 updatefn,
112                 yieldtime,
113                 worktime)
114        self.parent = parent
115        self.fitter= fn
116        self.cpage= cpage
117        self.pars = pars
118        self.starttime = 0
119        self.qmin = qmin
120        self.qmax = qmax
121        self.xmin = xmin
122        self.xmax = xmax
123        self.ymin = ymin
124        self.ymax = ymax
125        self.done= False
126        wx.PostEvent(self.parent, StatusEvent(status=\
127                       "Start the computation  ",curr_thread=self,type="start"))
128    def isquit(self):
129        """
130             @raise KeyboardInterrupt: when the thread is interrupted
131        """
132        try:
133            CalcThread.isquit(self)
134        except KeyboardInterrupt:
135            wx.PostEvent(self.parent, StatusEvent(status=\
136                       "Calc %g interrupted"))
137            raise KeyboardInterrupt
138       
139    def update(self):
140        """
141            Is called when values of result are available
142        """
143        wx.PostEvent(self.parent, StatusEvent(status="Computing \
144        ... " ,curr_thread=self,type="update"))
145           
146    def compute(self):
147        """
148            Perform a fit
149        """
150        try: 
151            self.starttime = time.time()
152            #Sending a progess message to the status bar
153            wx.PostEvent(self.parent, StatusEvent(status=\
154                       "Computing . ...",curr_thread=self,type="progress"))
155            #Handler used for park engine displayed message
156            handler= ConsoleUpdate(parent= self.parent,improvement_delta=0.1)
157            #Result from the fit
158            result = self.fitter.fit(handler= handler)
159       
160            elapsed = time.time()-self.starttime
161            self.complete(result= result,
162                          pars = self.pars,
163                          cpage= self.cpage,
164                          qmin = self.qmin,
165                          qmax = self.qmax,
166                          xmin= self.xmin,
167                          xmax= self.xmax,
168                          ymin = self.ymin,
169                          ymax = self.ymax, 
170                          elapsed=elapsed )
171        except KeyboardInterrupt:
172            # Thread was interrupted, just proceed and re-raise.
173            # Real code should not print, but this is an example...
174            raise
175        except:
176            wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
177            return 
178   
Note: See TracBrowser for help on using the repository browser.