source: sasview/src/sas/sasgui/perspectives/fitting/fitproblem.py @ 50fcb09

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalcmagnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 50fcb09 was 50fcb09, checked in by Paul Kienzle <pkienzle@…>, 7 years ago

move qsmearing to fit package

  • Property mode set to 100644
File size: 20.0 KB
Line 
1"""
2Inferface containing information to store data, model, range of data, etc...
3and retreive this information. This is an inferface
4for a fitProblem i.e relationship between data and model.
5"""
6################################################################################
7#This software was developed by the University of Tennessee as part of the
8#Distributed Data Analysis of Neutron Scattering Experiments (DANSE)
9#project funded by the US National Science Foundation.
10#
11#See the license text in license.txt
12#
13#copyright 2009, University of Tennessee
14################################################################################
15import copy
16
17from sas.sascalc.fit.qsmearing import smear_selection
18
19class FitProblemComponent(object):
20    """
21    Inferface containing information to store data, model, range of data, etc...
22    and retreive this information. This is an inferface
23    for a fitProblem i.e relationship between data and model.
24    """
25    def enable_smearing(self, flag=False):
26        """
27        :param flag: bool.When flag is 1 get the computer smear value. When
28            flag is 0 ingore smear value.
29        """
30
31    def get_smearer(self):
32        """
33        return smear object
34        """
35    def save_model_name(self, name):
36        """
37        """
38
39    def get_name(self):
40        """
41        """
42
43    def set_model(self, model):
44        """
45        associates each model with its new created name
46        :param model: model selected
47        :param name: name created for model
48        """
49
50    def get_model(self):
51        """
52        :return: saved model
53        """
54
55    def set_residuals(self, residuals):
56        """
57        save a copy of residual
58        :param data: data selected
59        """
60
61    def get_residuals(self):
62        """
63        :return: residuals
64        """
65
66    def set_theory_data(self, data):
67        """
68        save a copy of the data select to fit
69        :param data: data selected
70        """
71
72    def get_theory_data(self):
73        """
74        :return: list of data dList
75        """
76
77    def set_fit_data(self, data):
78        """
79        Store of list of data and create  by create new fitproblem of each data
80        id, if there was existing information about model, this information
81        get copy to the new fitproblem
82        :param data: list of data selected
83        """
84
85    def get_fit_data(self):
86        """
87        """
88
89    def set_model_param(self, name, value=None):
90        """
91        Store the name and value of a parameter of this fitproblem's model
92        :param name: name of the given parameter
93        :param value: value of that parameter
94        """
95
96    def set_param2fit(self, list):
97        """
98        Store param names to fit (checked)
99        :param list: list of the param names
100        """
101
102    def get_param2fit(self):
103        """
104        return the list param names to fit
105        """
106
107    def get_model_param(self):
108        """
109        return list of couple of parameter name and value
110        """
111
112    def schedule_tofit(self, schedule=0):
113        """
114        set schedule to true to decide if this fit  must be performed
115        """
116
117    def get_scheduled(self):
118        """
119        return true or false if a problem as being schedule for fitting
120        """
121
122    def set_range(self, qmin=None, qmax=None):
123        """
124        set fitting range
125        """
126
127    def get_range(self):
128        """
129        :return: fitting range
130        """
131
132    def set_weight(self, flag=None):
133        """
134        set fitting range
135        """
136
137    def get_weight(self):
138        """
139        get fitting weight
140        """
141
142    def clear_model_param(self):
143        """
144        clear constraint info
145        """
146
147    def set_fit_tab_caption(self, caption):
148        """
149        store the caption of the page associated with object
150        """
151
152    def get_fit_tab_caption(self):
153        """
154        Return the caption of the page associated with object
155        """
156
157    def set_graph_id(self, id):
158        """
159        Set graph id (from data_group_id at the time the graph produced)
160        """
161
162    def get_graph_id(self):
163        """
164        Get graph_id
165        """
166
167    def set_result(self, result):
168        """
169        """
170
171    def get_result(self):
172        """
173        get result
174        """
175
176
177class FitProblemDictionary(FitProblemComponent, dict):
178    """
179    This module implements a dictionary of fitproblem objects
180    """
181    def __init__(self):
182        FitProblemComponent.__init__(self)
183        dict.__init__(self)
184        ## the current model
185        self.model = None
186        ## if 1 this fit problem will be selected to fit , if 0
187        ## it will not be selected for fit
188        self.schedule = 0
189        ##list containing parameter name and value
190        self.list_param = []
191        ## fitting range
192        self.qmin = None
193        self.qmax = None
194        self.graph_id = None
195        self._smear_on = False
196        self.scheduled = 0
197        self.fit_tab_caption = ''
198        self.nbr_residuals_computed = 0
199        self.batch_inputs = {}
200        self.batch_outputs = {}
201
202    def enable_smearing(self, flag=False, fid=None):
203        """
204        :param flag: bool.When flag is 1 get the computer smear value. When
205            flag is 0 ingore smear value.
206        """
207        self._smear_on = flag
208        if fid is None:
209            for value in self.itervalues():
210                value.enable_smearing(flag)
211        else:
212            if fid in self.iterkeys():
213                self[fid].enable_smearing(flag)
214
215    def set_smearer(self, smearer, fid=None):
216        """
217        save reference of  smear object on fitdata
218        :param smear: smear object from DataLoader
219        """
220        if fid is None:
221            for value in self.itervalues():
222                value.set_smearer(smearer)
223        else:
224            if fid in self.iterkeys():
225                self[fid].set_smearer(smearer)
226
227    def get_smearer(self, fid=None):
228        """
229        return smear object
230        """
231        if fid in self.iterkeys():
232            return self[fid].get_smearer()
233
234    def save_model_name(self, name, fid=None):
235        """
236        """
237        if fid is None:
238            for value in self.itervalues():
239                value.save_model_name(name)
240        else:
241            if fid in self.iterkeys():
242                self[fid].save_model_name(name)
243
244    def get_name(self, fid=None):
245        """
246        """
247        result = []
248        if fid is None:
249            for value in self.itervalues():
250                result.append(value.get_name())
251        else:
252            if fid in self.iterkeys():
253                result.append(self[fid].get_name())
254        return result
255
256    def set_model(self, model, fid=None):
257        """
258        associates each model with its new created name
259        :param model: model selected
260        :param name: name created for model
261        """
262        self.model = model
263        if fid is None:
264            for value in self.itervalues():
265                value.set_model(self.model)
266        else:
267            if fid in self.iterkeys():
268                self[fid].set_model(self.model)
269
270    def get_model(self, fid):
271        """
272        :return: saved model
273        """
274        if fid in self.iterkeys():
275            return self[fid].get_model()
276
277    def set_fit_tab_caption(self, caption):
278        """
279        store the caption of the page associated with object
280        """
281        self.fit_tab_caption = caption
282
283    def get_fit_tab_caption(self):
284        """
285        Return the caption of the page associated with object
286        """
287        return self.fit_tab_caption
288
289    def set_residuals(self, residuals, fid):
290        """
291        save a copy of residual
292        :param data: data selected
293        """
294        if fid in self.iterkeys():
295            self[fid].set_residuals(residuals)
296
297    def get_residuals(self, fid):
298        """
299        :return: residuals
300        """
301        if fid in self.iterkeys():
302            return self[fid].get_residuals()
303
304    def set_theory_data(self, fid, data=None):
305        """
306        save a copy of the data select to fit
307        :param data: data selected
308        """
309        if fid in self.iterkeys():
310            self[fid].set_theory_data(data)
311
312    def get_theory_data(self, fid):
313        """
314        :return: list of data dList
315        """
316        if fid in self.iterkeys():
317            return self[fid].get_theory_data()
318
319    def add_data(self, data):
320        """
321        Add data to the current dictionary of fitproblem. if data id does not
322        exist create a new fit problem.
323        :note: only data changes in the fit problem
324        """
325        if data.id not in self.iterkeys():
326            self[data.id] = FitProblem()
327        self[data.id].set_fit_data(data)
328
329    def set_fit_data(self, data):
330        """
331        save a copy of the data select to fit
332        :param data: data selected
333
334        """
335        self.clear()
336        if data is None:
337            data = []
338        for d in data:
339            if (d is not None):
340                if (d.id not in self.iterkeys()):
341                    self[d.id] = FitProblem()
342                self[d.id].set_fit_data(d)
343                self[d.id].set_model(self.model)
344                self[d.id].set_range(self.qmin, self.qmax)
345
346    def get_fit_data(self, fid):
347        """
348        return data for the given fitproblem id
349        :param fid: key representing a fitproblem, usually extract from data id
350        """
351        if fid in self.iterkeys():
352            return self[fid].get_fit_data()
353
354    def set_model_param(self, name, value=None, fid=None):
355        """
356        Store the name and value of a parameter of this fitproblem's model
357        :param name: name of the given parameter
358        :param value: value of that parameter
359        """
360        if fid is None:
361            for value in self.itervalues():
362                value.set_model_param(name, value)
363        else:
364            if fid in self.iterkeys():
365                self[fid].set_model_param(name, value)
366
367    def get_model_param(self, fid):
368        """
369        return list of couple of parameter name and value
370        """
371        if fid in self.iterkeys():
372            return self[fid].get_model_param()
373
374    def set_param2fit(self, list):
375        """
376        Store param names to fit (checked)
377        :param list: list of the param names
378        """
379        self.list_param2fit = list
380
381    def get_param2fit(self):
382        """
383        return the list param names to fit
384        """
385        return self.list_param2fit
386
387    def schedule_tofit(self, schedule=0):
388        """
389        set schedule to true to decide if this fit  must be performed
390        """
391        self.scheduled = schedule
392        for value in self.itervalues():
393            value.schedule_tofit(schedule)
394
395    def get_scheduled(self):
396        """
397        return true or false if a problem as being schedule for fitting
398        """
399        return self.scheduled
400
401    def set_range(self, qmin=None, qmax=None, fid=None):
402        """
403        set fitting range
404        """
405        self.qmin = qmin
406        self.qmax = qmax
407        if fid is None:
408            for value in self.itervalues():
409                value.set_range(self.qmin, self.qmax)
410        else:
411            if fid in self.iterkeys():
412                self[fid].value.set_range(self.qmin, self.qmax)
413
414    def get_range(self, fid):
415        """
416        :return: fitting range
417        """
418        if fid in self.iterkeys():
419            return self[fid].get_range()
420
421    def set_weight(self, is2d, flag=None, fid=None):
422        """
423        fit weight
424        """
425        if fid is None:
426            for value in self.itervalues():
427                value.set_weight(flag=flag, is2d=is2d)
428        else:
429            if fid in self.iterkeys():
430                self[fid].set_weight(flag=flag, is2d=is2d)
431
432    def get_weight(self, fid=None):
433        """
434        return fit weight
435        """
436        if fid in self.iterkeys():
437            return self[fid].get_weight()
438
439    def clear_model_param(self, fid=None):
440        """
441        clear constraint info
442        """
443        if fid is None:
444            for value in self.itervalues():
445                value.clear_model_param()
446        else:
447            if fid in self.iterkeys():
448                self[fid].clear_model_param()
449
450    def get_fit_problem(self):
451        """
452        return fitproblem contained in this dictionary
453        """
454        return self.itervalues()
455
456    def set_result(self, result, fid):
457        """
458        """
459        if fid in self.iterkeys():
460            self[fid].set_result(result)
461
462    def set_batch_result(self, batch_inputs, batch_outputs):
463        """
464        set a list of result
465        """
466        self.batch_inputs = batch_inputs
467        self.batch_outputs = batch_outputs
468
469    def get_result(self, fid):
470        """
471        get result
472        """
473        if fid in self.iterkeys():
474            return self[fid].get_result()
475
476    def get_batch_result(self):
477        """
478        get result
479        """
480        return self.batch_inputs, self.batch_outputs
481
482    def set_graph_id(self, id):
483        """
484        Set graph id (from data_group_id at the time the graph produced)
485        """
486        self.graph_id = id
487
488    def get_graph_id(self):
489        """
490        Get graph_id
491        """
492        return self.graph_id
493
494
495class FitProblem(FitProblemComponent):
496    """
497    FitProblem class allows to link a model with the new name created in _on_model,
498    a name theory created with that model  and the data fitted with the model.
499    FitProblem is mostly used  as value of the dictionary by fitting module.
500    """
501    def __init__(self):
502        FitProblemComponent.__init__(self)
503        """
504        contains information about data and model to fit
505        """
506        ## data used for fitting
507        self.fit_data = None
508        self.theory_data = None
509        self.residuals = None
510        # original data: should not be modified
511        self.original_data = None
512        ## the current model
513        self.model = None
514        ## if 1 this fit problem will be selected to fit , if 0
515        ## it will not be selected for fit
516        self.schedule = 0
517        ##list containing parameter name and value
518        self.list_param = []
519        ## smear object to smear or not data1D
520        self.smearer_computed = False
521        self.smearer_enable = False
522        self.smearer_computer_value = None
523        ## fitting range
524        self.qmin = None
525        self.qmax = None
526        # fit weight
527        self.weight = None
528        self.result = None
529
530    def enable_smearing(self, flag=False):
531        """
532        :param flag: bool.When flag is 1 get the computer smear value. When
533            flag is 0 ingore smear value.
534        """
535        self.smearer_enable = flag
536
537    def set_smearer(self, smearer):
538        """
539        save reference of  smear object on fitdata
540
541        :param smear: smear object from DataLoader
542
543        """
544        self.smearer_computer_value = smearer
545
546    def get_smearer(self):
547        """
548        return smear object
549        """
550        if not self.smearer_enable:
551            return None
552        if not self.smearer_computed:
553            #smeari_selection should be call only once per fitproblem
554            self.smearer_computer_value = smear_selection(self.fit_data,
555                                                           self.model)
556            self.smearer_computed = True
557        return self.smearer_computer_value
558
559    def save_model_name(self, name):
560        """
561        """
562        self.name_per_page = name
563
564    def get_name(self):
565        """
566        """
567        return self.name_per_page
568
569    def set_model(self, model):
570        """
571        associates each model with its new created name
572        :param model: model selected
573        :param name: name created for model
574        """
575        self.model = model
576        self.smearer_computer_value = smear_selection(self.fit_data,
577                                                           self.model)
578        self.smearer_computed = True
579
580    def get_model(self):
581        """
582        :return: saved model
583        """
584        return self.model
585
586    def set_residuals(self, residuals):
587        """
588        save a copy of residual
589        :param data: data selected
590        """
591        self.residuals = residuals
592
593    def get_residuals(self):
594        """
595        :return: residuals
596        """
597        return self.residuals
598
599    def set_theory_data(self, data):
600        """
601        save a copy of the data select to fit
602
603        :param data: data selected
604
605        """
606        self.theory_data = copy.deepcopy(data)
607
608    def get_theory_data(self):
609        """
610        :return: theory generated with the current model and data of this class
611        """
612        return self.theory_data
613
614    def set_fit_data(self, data):
615        """
616        Store data associated with this class
617        :param data: list of data selected
618        """
619        self.original_data = None
620        self.fit_data = None
621        # original data: should not be modified
622        self.original_data = data
623        # fit data: used for fit and can be modified for convenience
624        self.fit_data = copy.deepcopy(data)
625        self.smearer_computer_value = smear_selection(self.fit_data, self.model)
626        self.smearer_computed = True
627        self.result = None
628
629    def get_fit_data(self):
630        """
631        :return: data associate with this class
632        """
633        return self.fit_data
634
635    def get_origin_data(self):
636        """
637        """
638        return self.original_data
639
640    def set_weight(self, is2d, flag=None):
641        """
642        Received flag and compute error on data.
643        :param flag: flag to transform error of data.
644        :param is2d: flag to distinguish 1D to 2D Data
645        """
646        from sas.sasgui.perspectives.fitting.utils import get_weight
647        # send original data for weighting
648        self.weight = get_weight(data=self.original_data, is2d=is2d, flag=flag)
649        if is2d:
650            self.fit_data.err_data = self.weight
651        else:
652            self.fit_data.dy = self.weight
653
654    def get_weight(self):
655        """
656        returns weight array
657        """
658        return self.weight
659
660    def set_param2fit(self, list):
661        """
662        Store param names to fit (checked)
663        :param list: list of the param names
664        """
665        self.list_param2fit = list
666
667    def get_param2fit(self):
668        """
669        return the list param names to fit
670        """
671        return self.list_param2fit
672
673    def set_model_param(self, name, value=None):
674        """
675        Store the name and value of a parameter of this fitproblem's model
676        :param name: name of the given parameter
677        :param value: value of that parameter
678        """
679        self.list_param.append([name, value])
680
681    def get_model_param(self):
682        """
683        return list of couple of parameter name and value
684        """
685        return self.list_param
686
687    def schedule_tofit(self, schedule=0):
688        """
689        set schedule to true to decide if this fit  must be performed
690        """
691        self.schedule = schedule
692
693    def get_scheduled(self):
694        """
695        return true or false if a problem as being schedule for fitting
696        """
697        return self.schedule
698
699    def set_range(self, qmin=None, qmax=None):
700        """
701        set fitting range
702        :param qmin: minimum value to consider for the fit range
703        :param qmax: maximum value to consider for the fit range
704        """
705        self.qmin = qmin
706        self.qmax = qmax
707
708    def get_range(self):
709        """
710        :return: fitting range
711
712        """
713        return self.qmin, self.qmax
714
715    def clear_model_param(self):
716        """
717        clear constraint info
718        """
719        self.list_param = []
720
721    def set_fit_tab_caption(self, caption):
722        """
723        """
724        self.fit_tab_caption = str(caption)
725
726    def get_fit_tab_caption(self):
727        """
728        """
729        return self.fit_tab_caption
730
731    def set_graph_id(self, id):
732        """
733        Set graph id (from data_group_id at the time the graph produced)
734        """
735        self.graph_id = id
736
737    def get_graph_id(self):
738        """
739        Get graph_id
740        """
741        return self.graph_id
742
743    def set_result(self, result):
744        """
745        """
746        self.result = result
747
748    def get_result(self):
749        """
750        get result
751        """
752        return self.result
Note: See TracBrowser for help on using the repository browser.