[41340860] | 1 | |
---|
| 2 | |
---|
| 3 | import time |
---|
[2b63df0] | 4 | import numpy |
---|
| 5 | import copy |
---|
| 6 | import math |
---|
[41340860] | 7 | import sys |
---|
| 8 | import wx |
---|
| 9 | |
---|
[e733619] | 10 | from data_util.calcthread import CalcThread |
---|
[077809c] | 11 | from sans.fit.AbstractFitEngine import FitData2D, FitData1D, SansAssembly |
---|
| 12 | |
---|
[41340860] | 13 | |
---|
[2b63df0] | 14 | class CalcChisqr1D(CalcThread): |
---|
[41340860] | 15 | """ |
---|
[2b63df0] | 16 | Compute chisqr |
---|
[41340860] | 17 | """ |
---|
[077809c] | 18 | def __init__(self, data1d, model, |
---|
[2b63df0] | 19 | smearer=None, |
---|
| 20 | qmin=None, |
---|
| 21 | qmax=None, |
---|
[41340860] | 22 | completefn = None, |
---|
| 23 | updatefn = None, |
---|
| 24 | yieldtime = 0.01, |
---|
| 25 | worktime = 0.01 |
---|
| 26 | ): |
---|
| 27 | CalcThread.__init__(self,completefn, |
---|
| 28 | updatefn, |
---|
| 29 | yieldtime, |
---|
| 30 | worktime) |
---|
[077809c] | 31 | |
---|
| 32 | if model ==None or data1d ==None: |
---|
| 33 | raise ValueError, "Need data and model to compute chisqr" |
---|
| 34 | |
---|
| 35 | if data1d.__class__.__name__ !="Data1D": |
---|
| 36 | msg= str(data1d.__class__.__name__) |
---|
| 37 | raise ValueError, "need Data1D to compute chisqr. Current class %s"%msg |
---|
| 38 | |
---|
| 39 | self.fitdata= FitData1D(data1d, smearer=smearer) |
---|
| 40 | self.fitdata.setFitRange(qmin=qmin,qmax=qmax) |
---|
[2b63df0] | 41 | self.model = model |
---|
[077809c] | 42 | |
---|
[41340860] | 43 | self.starttime = 0 |
---|
| 44 | |
---|
[2b63df0] | 45 | def isquit(self): |
---|
| 46 | """ |
---|
| 47 | @raise KeyboardInterrupt: when the thread is interrupted |
---|
| 48 | """ |
---|
| 49 | try: |
---|
| 50 | CalcThread.isquit(self) |
---|
| 51 | except KeyboardInterrupt: |
---|
| 52 | raise KeyboardInterrupt |
---|
| 53 | |
---|
| 54 | |
---|
[41340860] | 55 | def compute(self): |
---|
| 56 | """ |
---|
| 57 | Compute the data given a model function |
---|
| 58 | """ |
---|
[2b63df0] | 59 | self.starttime = time.time() |
---|
[52611f5] | 60 | |
---|
[2b63df0] | 61 | output= None |
---|
| 62 | res=[] |
---|
[077809c] | 63 | try: |
---|
[785c8233] | 64 | res = self.fitdata.residuals(self.model.evalDistribution) |
---|
[2b63df0] | 65 | sum=0 |
---|
| 66 | for item in res: |
---|
| 67 | # Check whether we need to bail out |
---|
| 68 | self.isquit() |
---|
| 69 | if numpy.isfinite(item): |
---|
[077809c] | 70 | sum +=item*item |
---|
| 71 | if len(res)>0: |
---|
| 72 | output = sum/ len(res) |
---|
| 73 | |
---|
[2b63df0] | 74 | elapsed = time.time()-self.starttime |
---|
| 75 | self.complete(output= output, elapsed=elapsed) |
---|
| 76 | |
---|
| 77 | except KeyboardInterrupt: |
---|
| 78 | # Thread was interrupted, just proceed and re-raise. |
---|
| 79 | # Real code should not print, but this is an example... |
---|
| 80 | raise |
---|
[077809c] | 81 | except: |
---|
[2b63df0] | 82 | raise |
---|
| 83 | |
---|
| 84 | class CalcChisqr2D(CalcThread): |
---|
| 85 | """ |
---|
| 86 | Compute chisqr |
---|
| 87 | """ |
---|
| 88 | |
---|
[077809c] | 89 | def __init__(self,data2d, model, |
---|
[2b63df0] | 90 | qmin, |
---|
| 91 | qmax, |
---|
| 92 | completefn = None, |
---|
| 93 | updatefn = None, |
---|
| 94 | yieldtime = 0.01, |
---|
| 95 | worktime = 0.01 |
---|
| 96 | ): |
---|
| 97 | CalcThread.__init__(self,completefn, |
---|
| 98 | updatefn, |
---|
| 99 | yieldtime, |
---|
| 100 | worktime) |
---|
[077809c] | 101 | |
---|
| 102 | if model ==None or data2d ==None: |
---|
| 103 | raise ValueError, "Need data and model to compute chisqr" |
---|
| 104 | |
---|
| 105 | if data2d.__class__.__name__ !="Data2D": |
---|
| 106 | msg= str(data2d.__class__.__name__) |
---|
| 107 | raise ValueError, "need Data2D to compute chisqr. Current class %s"%msg |
---|
| 108 | |
---|
| 109 | self.fitdata = FitData2D(data2d) |
---|
| 110 | self.fitdata.setFitRange(qmin=qmin,qmax=qmax) |
---|
| 111 | |
---|
[2b63df0] | 112 | self.model = model |
---|
| 113 | |
---|
| 114 | self.starttime = 0 |
---|
| 115 | |
---|
| 116 | def isquit(self): |
---|
| 117 | """ |
---|
| 118 | @raise KeyboardInterrupt: when the thread is interrupted |
---|
| 119 | """ |
---|
| 120 | try: |
---|
| 121 | CalcThread.isquit(self) |
---|
| 122 | except KeyboardInterrupt: |
---|
| 123 | raise KeyboardInterrupt |
---|
| 124 | |
---|
| 125 | |
---|
| 126 | def compute(self): |
---|
| 127 | """ |
---|
| 128 | Compute the data given a model function |
---|
| 129 | """ |
---|
| 130 | self.starttime = time.time() |
---|
[077809c] | 131 | |
---|
[2b63df0] | 132 | output= None |
---|
| 133 | res=[] |
---|
| 134 | try: |
---|
[785c8233] | 135 | res = self.fitdata.residuals(self.model.evalDistribution) |
---|
[2b63df0] | 136 | sum=0 |
---|
| 137 | for item in res: |
---|
| 138 | # Check whether we need to bail out |
---|
| 139 | self.isquit() |
---|
| 140 | if numpy.isfinite(item): |
---|
[077809c] | 141 | sum +=item*item |
---|
| 142 | if len(res)>0: |
---|
| 143 | output = sum/ len(res) |
---|
| 144 | |
---|
[2b63df0] | 145 | elapsed = time.time()-self.starttime |
---|
| 146 | self.complete(output= output, elapsed=elapsed) |
---|
| 147 | |
---|
| 148 | except KeyboardInterrupt: |
---|
| 149 | # Thread was interrupted, just proceed and re-raise. |
---|
| 150 | # Real code should not print, but this is an example... |
---|
[077809c] | 151 | raise |
---|
| 152 | except: |
---|
[2b63df0] | 153 | raise |
---|