class SimpleAnalysis(object): """Analysis of extremes of FWHM and optionally of flux. :var debug: enable more debug output with --debug and --level :var date: date string as it appears on plot :var dataSxtr: list of :py:mod:`rts2saf.data.DataSxtr` :var Ds9Display: start ``DS9`` and display FITS files with regions :var FitDisplay: display fit result :var ftwName: filter wheel name :var ftName: filter name :var focRes: focuser resolution as given in FOCUSER_RESOLUTION :var ev: helper module for house keeping, :py:mod:`rts2saf.environ.Environment` :var rt: run time configuration, :py:mod:`rts2saf.config.Configuration`, usually read from /usr/local/etc/rts2/rts2saf/rts2saf.cfg :var logger: :py:mod:`rts2saf.log` """ def __init__(self, debug=False, date=None, dataSxtr=None, Ds9Display=False, FitDisplay=False, xdisplay = None, ftwName=None, ftName=None, focRes=None, ev=None, rt=None, logger=None): self.debug=debug self.date=date self.dataSxtr=dataSxtr self.Ds9Display=Ds9Display self.FitDisplay=FitDisplay self.xdisplay = xdisplay self.ftwName=ftwName self.ftName=ftName self.focRes=focRes self.ev=ev self.rt= rt self.logger=logger self.dataFitFwhm=None self.resultFitFwhm=None self.resultMeansFwhm = None # self.dataFitFlux=None self.resultFitFlux=None self.resultMeansFlux = None # ToDo must reside outside self.fd=None self.i_flux=None def _fitFwhm(self): minFitPos, minFitFwhm, fitPar, fitFlag= FitFunction( dataFit=self.dataFitFwhm, logger=self.logger, ).fitData() if minFitPos: self.logger.info('_fitFwhm: FWHM FOC_DEF: {0:5d} : fitted minimum position, {1:4.1f}px FWHM, {2} ambient temperature'.format(int(minFitPos), minFitFwhm, self.dataFitFwhm.ambientTemp)) else: self.logger.warn('analyze: fit failed') self.resultFitFwhm=ResultFit() return self.resultFitFwhm=ResultFit( ambientTemp = self.dataFitFwhm.ambientTemp, ftName = self.dataFitFwhm.ftName, extrFitPos = minFitPos, extrFitVal = minFitFwhm, fitPar = fitPar, fitFlag = fitFlag, color = 'blue', ylabel = 'FWHM [px]: blue', titleResult = 'fwhm:{0:5d}'.format(int(minFitPos)) ) def _fitFlux(self): maxFitPos, maxFitFlux, fitPar, fitFlag = FitFunction( dataFit = self.dataFitFlux, logger = self.logger, ).fitData() if fitFlag: self.logger.info('analyze: Flux FOC_DEF: {0:5d} : fitted maximum position, {1:4.1f}[a.u.] Flux, {2} ambient temperature'.format(int(maxFitPos), maxFitFlux, self.dataFitFlux.ambientTemp)) else: self.logger.warn('analyze: fit flux failed') self.resultFitFlux=ResultFit() return self.resultFitFlux=ResultFit( ambientTemp = self.dataFitFlux.ambientTemp, ftName = self.dataFitFlux.ftName, extrFitPos = maxFitPos, extrFitVal= maxFitFlux, fitPar = fitPar, fitFlag = fitFlag, color = 'red', ylabel = 'FWHM [px]: blue Flux [a.u.]: red', titleResult = 'fwhm:{0:5d}, flux: {1:5d}' .format(int(self.resultFitFwhm.extrFitPos), int(maxFitPos)) ) def analyze(self): """Fit function to data and calculate weighted means. :return: :py:mod:`rts2saf.data.ResultFit`, :py:mod:`rts2saf.data.ResultMeans` """ # ToDo lazy !!!!!!!!!! # create an average and std # ToDo decide which ftName from which ftw!! if len(self.dataSxtr)>0: bPth,fn=os.path.split(self.dataSxtr[0].fitsFn) ftName=self.dataSxtr[0].ftName else: bPth='/tmp' ftName='noFtName' if len(self.dataSxtr)>0: ambientTemp = self.dataSxtr[0].ambientTemp else: ambientTemp='noAmbientTemp' plotFn = self.ev.expandToPlotFileName(plotFn='{0}/{1}.png'.format(bPth,ftName)) self.logger.info('analyze: storing plot file: {0}'.format(plotFn)) # fwhm if len(self.dataSxtr)>0: ftName = self.dataSxtr[0].ftName else: ftName = 'NoFtname' self.dataFitFwhm = DataFitFwhm( dataSxtr = self.dataSxtr, plotFn = plotFn, ambientTemp = ambientTemp, ftName = ftName, ) self._fitFwhm() # weighted means if self.rt.cfg['WEIGHTED_MEANS']: self.resultMeansFwhm = ResultMeans(dataFit=self.dataFitFwhm, logger=self.logger) self.resultMeansFwhm.calculate(var='FWHM') try: self.i_flux = self.dataSxtr[0].fields.index('FLUX_MAX') except: pass if self.i_flux is not None: self.dataFitFlux= DataFitFlux( dataSxtr=self.dataSxtr, dataFitFwhm=self.dataFitFwhm, plotFn=plotFn, ambientTemp=self.dataSxtr[0].ambientTemp, ftName=self.dataSxtr[0].ftName ) self._fitFlux() # weighted means if self.rt.cfg['WEIGHTED_MEANS']: self.resultMeansFlux=ResultMeans(dataFit=self.dataFitFlux, logger=self.logger) self.resultMeansFlux.calculate(var='Flux') return self.resultFitFwhm, self.resultMeansFwhm, self.resultFitFlux, self.resultMeansFlux def display(self): """Plot data, fitted function for FWHM and optionally flux. """ # plot them through ds9 in parallel to the fit ds9DisplayThread = None if self.Ds9Display and self.xdisplay: # start thread ds9DisplayThread = Ds9DisplayThread(debug=self.debug, dataSxtr=self.dataSxtr, logger= self.logger) ds9DisplayThread.start() elif self.Ds9Display and not self.xdisplay: self.logger.warn('analyze: OOOOOOOOPS, no ds9 display available') if self.dataSxtr[0].assocFn is not None: ft=FitDisplay(date = self.date, comment='ASSOC', logger=self.logger) else: ft=FitDisplay(date = self.date, logger=self.logger) if self.i_flux is None: ft.fitDisplay(dataFit=self.dataFitFwhm, resultFit=self.resultFitFwhm, display=self.FitDisplay, xdisplay = self.xdisplay) else: # plot FWHM but don't show ft.fitDisplay(dataFit=self.dataFitFwhm, resultFit=self.resultFitFwhm, show=False, display=self.FitDisplay, xdisplay = self.xdisplay) ft.fitDisplay(dataFit=self.dataFitFlux, resultFit=self.resultFitFlux, display=self.FitDisplay, xdisplay = self.xdisplay) # very important (otherwise all plots show up in next show()) ft.ax1=None # http://stackoverflow.com/questions/741877/how-do-i-tell-matplotlib-that-i-am-done-with-a-plot ft.fig.clf() ft.fig=None ft=None # stop ds9 display thread if self.Ds9Display and self.xdisplay: ds9DisplayThread.join(timeout=1.)
class SimpleAnalysis(object): """Analysis of extremes of FWHM and optionally of flux. :var debug: enable more debug output with --debug and --level :var date: date string as it appears on plot :var dataSxtr: list of :py:mod:`rts2saf.data.DataSxtr` :var Ds9Display: start ``DS9`` and display FITS files with regions :var FitDisplay: display fit result :var ftwName: filter wheel name :var ftName: filter name :var focRes: focuser resolution as given in FOCUSER_RESOLUTION :var ev: helper module for house keeping, :py:mod:`rts2saf.environ.Environment` :var rt: run time configuration, :py:mod:`rts2saf.config.Configuration`, usually read from /usr/local/etc/rts2/rts2saf/rts2saf.cfg :var logger: :py:mod:`rts2saf.log` """ def __init__(self, debug=False, date=None, dataSxtr=None, Ds9Display=False, FitDisplay=False, xdisplay=None, ftwName=None, ftName=None, focRes=None, ev=None, rt=None, logger=None): self.debug = debug self.date = date self.dataSxtr = dataSxtr self.Ds9Display = Ds9Display self.FitDisplay = FitDisplay self.xdisplay = xdisplay self.ftwName = ftwName self.ftName = ftName self.focRes = focRes self.ev = ev self.rt = rt self.logger = logger self.dataFitFwhm = None self.resultFitFwhm = None self.resultMeansFwhm = None # self.dataFitFlux = None self.resultFitFlux = None self.resultMeansFlux = None # ToDo must reside outside self.fd = None self.i_flux = None def _fitFwhm(self): minFitPos, minFitFwhm, fitPar, fitFlag = FitFunction( dataFit=self.dataFitFwhm, logger=self.logger, ).fitData() if minFitPos: self.logger.info( '_fitFwhm: FWHM FOC_DEF: {0:5d} : fitted minimum position, {1:4.1f}px FWHM, {2} ambient temperature' .format(int(minFitPos), minFitFwhm, self.dataFitFwhm.ambientTemp)) else: self.logger.warn('analyze: fit failed') self.resultFitFwhm = ResultFit() return self.resultFitFwhm = ResultFit( ambientTemp=self.dataFitFwhm.ambientTemp, ftName=self.dataFitFwhm.ftName, extrFitPos=minFitPos, extrFitVal=minFitFwhm, fitPar=fitPar, fitFlag=fitFlag, color='blue', ylabel='FWHM [px]: blue', titleResult='fwhm:{0:5d}'.format(int(minFitPos))) def _fitFlux(self): maxFitPos, maxFitFlux, fitPar, fitFlag = FitFunction( dataFit=self.dataFitFlux, logger=self.logger, ).fitData() if fitFlag: self.logger.info( 'analyze: Flux FOC_DEF: {0:5d} : fitted maximum position, {1:4.1f}[a.u.] Flux, {2} ambient temperature' .format(int(maxFitPos), maxFitFlux, self.dataFitFlux.ambientTemp)) else: self.logger.warn('analyze: fit flux failed') self.resultFitFlux = ResultFit() return self.resultFitFlux = ResultFit( ambientTemp=self.dataFitFlux.ambientTemp, ftName=self.dataFitFlux.ftName, extrFitPos=maxFitPos, extrFitVal=maxFitFlux, fitPar=fitPar, fitFlag=fitFlag, color='red', ylabel='FWHM [px]: blue Flux [a.u.]: red', titleResult='fwhm:{0:5d}, flux: {1:5d}'.format( int(self.resultFitFwhm.extrFitPos), int(maxFitPos))) def analyze(self): """Fit function to data and calculate weighted means. :return: :py:mod:`rts2saf.data.ResultFit`, :py:mod:`rts2saf.data.ResultMeans` """ # ToDo lazy !!!!!!!!!! # create an average and std # ToDo decide which ftName from which ftw!! if len(self.dataSxtr) > 0: bPth, fn = os.path.split(self.dataSxtr[0].fitsFn) ftName = self.dataSxtr[0].ftName else: bPth = '/tmp' ftName = 'noFtName' if len(self.dataSxtr) > 0: ambientTemp = self.dataSxtr[0].ambientTemp else: ambientTemp = 'noAmbientTemp' plotFn = self.ev.expandToPlotFileName( plotFn='{0}/{1}.png'.format(bPth, ftName)) self.logger.info('analyze: storing plot file: {0}'.format(plotFn)) # fwhm if len(self.dataSxtr) > 0: ftName = self.dataSxtr[0].ftName else: ftName = 'NoFtname' self.dataFitFwhm = DataFitFwhm( dataSxtr=self.dataSxtr, plotFn=plotFn, ambientTemp=ambientTemp, ftName=ftName, ) self._fitFwhm() # weighted means if self.rt.cfg['WEIGHTED_MEANS']: self.resultMeansFwhm = ResultMeans(dataFit=self.dataFitFwhm, logger=self.logger) self.resultMeansFwhm.calculate(var='FWHM') try: self.i_flux = self.dataSxtr[0].fields.index('FLUX_MAX') except: pass if self.i_flux is not None: self.dataFitFlux = DataFitFlux( dataSxtr=self.dataSxtr, dataFitFwhm=self.dataFitFwhm, plotFn=plotFn, ambientTemp=self.dataSxtr[0].ambientTemp, ftName=self.dataSxtr[0].ftName) self._fitFlux() # weighted means if self.rt.cfg['WEIGHTED_MEANS']: self.resultMeansFlux = ResultMeans(dataFit=self.dataFitFlux, logger=self.logger) self.resultMeansFlux.calculate(var='Flux') return self.resultFitFwhm, self.resultMeansFwhm, self.resultFitFlux, self.resultMeansFlux def display(self): """Plot data, fitted function for FWHM and optionally flux. """ # plot them through ds9 in parallel to the fit ds9DisplayThread = None if self.Ds9Display and self.xdisplay: # start thread ds9DisplayThread = Ds9DisplayThread(debug=self.debug, dataSxtr=self.dataSxtr, logger=self.logger) ds9DisplayThread.start() elif self.Ds9Display and not self.xdisplay: self.logger.warn('analyze: OOOOOOOOPS, no ds9 display available') if self.dataSxtr[0].assocFn is not None: ft = FitDisplay(date=self.date, comment='ASSOC', logger=self.logger) else: ft = FitDisplay(date=self.date, logger=self.logger) if self.i_flux is None: ft.fitDisplay(dataFit=self.dataFitFwhm, resultFit=self.resultFitFwhm, display=self.FitDisplay, xdisplay=self.xdisplay) else: # plot FWHM but don't show ft.fitDisplay(dataFit=self.dataFitFwhm, resultFit=self.resultFitFwhm, show=False, display=self.FitDisplay, xdisplay=self.xdisplay) ft.fitDisplay(dataFit=self.dataFitFlux, resultFit=self.resultFitFlux, display=self.FitDisplay, xdisplay=self.xdisplay) # very important (otherwise all plots show up in next show()) ft.ax1 = None # http://stackoverflow.com/questions/741877/how-do-i-tell-matplotlib-that-i-am-done-with-a-plot ft.fig.clf() ft.fig = None ft = None # stop ds9 display thread if self.Ds9Display and self.xdisplay: ds9DisplayThread.join(timeout=1.)
def analyze(self): """Fit function to data and calculate weighted means. :return: :py:mod:`rts2saf.data.ResultFit`, :py:mod:`rts2saf.data.ResultMeans` """ # ToDo lazy !!!!!!!!!! # create an average and std # ToDo decide which ftName from which ftw!! if len(self.dataSxtr)>0: bPth,fn=os.path.split(self.dataSxtr[0].fitsFn) ftName=self.dataSxtr[0].ftName else: bPth='/tmp' ftName='noFtName' if len(self.dataSxtr)>0: ambientTemp = self.dataSxtr[0].ambientTemp else: ambientTemp='noAmbientTemp' plotFn = self.ev.expandToPlotFileName(plotFn='{0}/{1}.png'.format(bPth,ftName)) self.logger.info('analyze: storing plot file: {0}'.format(plotFn)) # fwhm if len(self.dataSxtr)>0: ftName = self.dataSxtr[0].ftName else: ftName = 'NoFtname' self.dataFitFwhm = DataFitFwhm( dataSxtr = self.dataSxtr, plotFn = plotFn, ambientTemp = ambientTemp, ftName = ftName, ) self._fitFwhm() # weighted means if self.rt.cfg['WEIGHTED_MEANS']: self.resultMeansFwhm = ResultMeans(dataFit=self.dataFitFwhm, logger=self.logger) self.resultMeansFwhm.calculate(var='FWHM') try: self.i_flux = self.dataSxtr[0].fields.index('FLUX_MAX') except: pass if self.i_flux is not None: self.dataFitFlux= DataFitFlux( dataSxtr=self.dataSxtr, dataFitFwhm=self.dataFitFwhm, plotFn=plotFn, ambientTemp=self.dataSxtr[0].ambientTemp, ftName=self.dataSxtr[0].ftName ) self._fitFlux() # weighted means if self.rt.cfg['WEIGHTED_MEANS']: self.resultMeansFlux=ResultMeans(dataFit=self.dataFitFlux, logger=self.logger) self.resultMeansFlux.calculate(var='Flux') return self.resultFitFwhm, self.resultMeansFwhm, self.resultFitFlux, self.resultMeansFlux
def analyze(self): """Fit function to data and calculate weighted means. :return: :py:mod:`rts2saf.data.ResultFit`, :py:mod:`rts2saf.data.ResultMeans` """ # ToDo lazy !!!!!!!!!! # create an average and std # ToDo decide which ftName from which ftw!! if len(self.dataSxtr) > 0: bPth, fn = os.path.split(self.dataSxtr[0].fitsFn) ftName = self.dataSxtr[0].ftName else: bPth = '/tmp' ftName = 'noFtName' if len(self.dataSxtr) > 0: ambientTemp = self.dataSxtr[0].ambientTemp else: ambientTemp = 'noAmbientTemp' plotFn = self.ev.expandToPlotFileName( plotFn='{0}/{1}.png'.format(bPth, ftName)) self.logger.info('analyze: storing plot file: {0}'.format(plotFn)) # fwhm if len(self.dataSxtr) > 0: ftName = self.dataSxtr[0].ftName else: ftName = 'NoFtname' self.dataFitFwhm = DataFitFwhm( dataSxtr=self.dataSxtr, plotFn=plotFn, ambientTemp=ambientTemp, ftName=ftName, ) self._fitFwhm() # weighted means if self.rt.cfg['WEIGHTED_MEANS']: self.resultMeansFwhm = ResultMeans(dataFit=self.dataFitFwhm, logger=self.logger) self.resultMeansFwhm.calculate(var='FWHM') try: self.i_flux = self.dataSxtr[0].fields.index('FLUX_MAX') except: pass if self.i_flux is not None: self.dataFitFlux = DataFitFlux( dataSxtr=self.dataSxtr, dataFitFwhm=self.dataFitFwhm, plotFn=plotFn, ambientTemp=self.dataSxtr[0].ambientTemp, ftName=self.dataSxtr[0].ftName) self._fitFlux() # weighted means if self.rt.cfg['WEIGHTED_MEANS']: self.resultMeansFlux = ResultMeans(dataFit=self.dataFitFlux, logger=self.logger) self.resultMeansFlux.calculate(var='Flux') return self.resultFitFwhm, self.resultMeansFwhm, self.resultFitFlux, self.resultMeansFlux