Changeset 1075


Ignore:
Timestamp:
07/06/06 11:24:51 (18 years ago)
Author:
mar637
Message:

added errors to class; added fit convergence test; optional non-estimate in fit

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/python/asapfitter.py

    r1061 r1075  
    6363        self.fitted = False
    6464        self.data = thescan
     65        self.mask = None
    6566        if mask is None:
    6667            from numarray import ones
     
    102103        return
    103104
    104     def fit(self, row=0):
     105    def fit(self, row=0, estimate=False):
    105106        """
    106107        Execute the actual fitting process. All the state has to be set.
    107108        Parameters:
    108             row:    specify the row in the scantable
     109            row:        specify the row in the scantable
     110            estimate:   auto-compute an initial parameter set (default False)
     111                        This can be used to compute estimates even if fit was
     112                        called before.
    109113        Example:
    110114            s = scantable('myscan.asap')
     
    132136                i = row
    133137                out = "Scan[%d] Beam[%d] IF[%d] Pol[%d] Cycle[%d]" % (self.data.getscan(i),self.data.getbeam(i),self.data.getif(i),self.data.getpol(i), self.data.getcycle(i))
    134                 asaplog.push(out)
     138                asaplog.push(out,False)
    135139        self.fitter.setdata(self.x, self.y, self.mask)
    136140        if self.fitfunc == 'gauss':
    137141            ps = self.fitter.getparameters()
    138             if len(ps) == 0:
     142            if len(ps) == 0 or estimate:
    139143                self.fitter.estimate()
    140144        try:
    141             self.fitter.fit()
     145            converged = self.fitter.fit()
     146            if not converged:
     147                raise RuntimeError,"Fit didn't converge."
    142148        except RuntimeError, msg:
    143149            if rcParams['verbose']:
     
    275281            return sum(areas)
    276282
    277     def get_parameters(self, component=None):
     283    def get_errors(self, component=None):
     284        """
     285        Return the errors in the parameters.
     286        Parameters:
     287            component:    get the errors for the specified component
     288                          only, default is all components
     289        """
     290        if not self.fitted:
     291            msg = "Not yet fitted."
     292            if rcParams['verbose']:
     293                print msg
     294                return
     295            else:
     296                raise RuntimeError(msg)
     297        errs = list(self.fitter.geterrors())
     298        cerrs = errs
     299        if component is not None:
     300            if self.fitfunc == "gauss":
     301                i = 3*component
     302                if i < len(errs):
     303                    cerrs = errs[i:i+3]
     304        return cerrs
     305
     306    def get_parameters(self, component=None, errors=False):
    278307        """
    279308        Return the fit paramters.
     
    291320        pars = list(self.fitter.getparameters())
    292321        fixed = list(self.fitter.getfixedparameters())
     322        errs = list(self.fitter.geterrors())
    293323        area = []
    294324        if component is not None:
     
    297327                cpars = pars[i:i+3]
    298328                cfixed = fixed[i:i+3]
     329                cerrs = errs[i:i+3]
    299330                a = self.get_area(component)
    300331                area = [a for i in range(3)]
     
    302333                cpars = pars
    303334                cfixed = fixed
     335                cerrs = errs
    304336        else:
    305337            cpars = pars
    306338            cfixed = fixed
     339            cerrs = errs
    307340            if self.fitfunc == "gauss":
    308341                for c in range(len(self.components)):
    309342                  a = self.get_area(c)
    310343                  area += [a for i in range(3)]
    311 
    312         fpars = self._format_pars(cpars, cfixed, area)
     344        fpars = self._format_pars(cpars, cfixed, None, area)
    313345        if rcParams['verbose']:
    314346            print fpars
    315         return {'params':cpars, 'fixed':cfixed, 'formatted': fpars}
    316 
    317     def _format_pars(self, pars, fixed, area):
     347        return {'params':cpars, 'fixed':cfixed, 'formatted': fpars,
     348                'errors':cerrs}
     349
     350    def _format_pars(self, pars, fixed, errors, area):
    318351        out = ''
    319352        if self.fitfunc == 'poly':
     
    452485            ylab = self.data._get_ordinate_label()
    453486
    454         colours = ["#777777","#bbbbbb","red","orange","purple","green","magenta", "cyan"]
     487        colours = ["#777777","#dddddd","red","orange","purple","green","magenta", "cyan"]
    455488        self._p.palette(0,colours)
    456489        self._p.set_line(label='Spectrum')
Note: See TracChangeset for help on using the changeset viewer.