def kepdraw(infile,outfile,datacol,ploterr,errcol,quality, lcolor,lwidth,fcolor,falpha,labelsize,ticksize, xsize,ysize,fullrange,chooserange,y1,y2,plotgrid, ylabel,plottype,verbose,logfile,status,cmdLine=False): # log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPDRAW -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'datacol='+datacol+' ' perr = 'n' if (ploterr): perr = 'y' call += 'ploterr='+perr+ ' ' call += 'errcol='+errcol+' ' qual = 'n' if (quality): qual = 'y' call += 'quality='+qual+ ' ' call += 'lcolor='+str(lcolor)+' ' call += 'lwidth='+str(lwidth)+' ' call += 'fcolor='+str(fcolor)+' ' call += 'falpha='+str(falpha)+' ' call += 'labelsize='+str(labelsize)+' ' call += 'ticksize='+str(ticksize)+' ' call += 'xsize='+str(xsize)+' ' call += 'ysize='+str(ysize)+' ' frange = 'n' if (fullrange): frange = 'y' call += 'fullrange='+frange+ ' ' crange = 'n' if (chooserange): crange = 'y' call += 'chooserange='+crange+ ' ' call += 'ymin='+str(y1)+' ' call += 'ymax='+str(y2)+' ' pgrid = 'n' if (plotgrid): pgrid = 'y' call += 'plotgrid='+pgrid+ ' ' call += 'ylabel='+str(ylabel)+' ' call += 'plottype='+plottype+' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) # start time kepmsg.clock('KEPDRAW started at',logfile,verbose) # test log file logfile = kepmsg.test(logfile) # open input file if status == 0: struct, status = kepio.openfits(infile,'readonly',logfile,verbose) if status == 0: tstart, tstop, bjdref, cadence, status = kepio.timekeys(struct,infile,logfile,verbose,status) # read table structure if status == 0: table, status = kepio.readfitstab(infile,struct[1],logfile,verbose) # read table columns if status == 0: intime, status = kepio.readtimecol(infile,table,logfile,verbose) intime += bjdref indata, status = kepio.readfitscol(infile,table,datacol,logfile,verbose) indataerr, status = kepio.readfitscol(infile,table,errcol,logfile,verbose) qualty, status = kepio.readfitscol(infile,table,'SAP_QUALITY',logfile,verbose) # close infile if status == 0: status = kepio.closefits(struct,logfile,verbose) # remove infinities and bad data if status == 0: if numpy.isnan(numpy.nansum(indataerr)): indataerr[:] = 1.0e-5 work1 = numpy.array([intime, indata, indataerr, qualty],dtype='float64') work1 = numpy.rot90(work1,3) work1 = work1[~numpy.isnan(work1).any(1)] work1 = work1[~numpy.isinf(work1).any(1)] if quality: work1 = work1[work1[:,0] == 0.0] barytime = numpy.array(work1[:,3],dtype='float64') data = numpy.array(work1[:,2],dtype='float32') dataerr = numpy.array(work1[:,1],dtype='float32') if len(barytime) == 0: message = 'ERROR -- KEPDRAW: Plotting arrays are full of NaN' status = kepmsg.err(logfile,message,verbose) # clean up x-axis unit if status == 0: barytime0 = float(int(tstart / 100) * 100.0) barytime -= barytime0 xlab = 'BJD $-$ %d' % barytime0 # clean up y-axis units nrm = 0 try: nrm = len(str(int(numpy.nanmax(data))))-1 except: nrm = 0 data = data / 10**nrm if 'e$^-$ s$^{-1}$' in ylabel or 'default' in ylabel: if nrm == 0: ylab1 = 'e$^-$ s$^{-1}$' else: ylab1 = '10$^{%d}$ e$^-$ s$^{-1}$' % nrm else: ylab1 = re.sub('_','-',ylabel) # data limits xmin = numpy.nanmin(barytime) xmax = numpy.nanmax(barytime) ymin = numpy.nanmin(data) ymax = numpy.nanmax(data) xr = xmax - xmin yr = ymax - ymin barytime = insert(barytime,[0],[barytime[0]]) barytime = append(barytime,[barytime[-1]]) data = insert(data,[0],[-10000.0]) data = append(data,-10000.0) # define plot formats try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} pylab.rcParams.update(params) except: pass # define size of plot on monitor screen pylab.figure(figsize=[xsize,ysize]) # delete any fossil plots in the matplotlib window pylab.clf() # position axes inside the plotting window # ax = pylab.axes([0.1,0.11,0.89,0.87]) ax = pylab.subplot(111) pylab.subplots_adjust(0.06,0.15,0.92,0.83) # force tick labels to be absolute rather than relative pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) ax.yaxis.set_major_locator(MaxNLocator(5)) # rotate y labels by 90 deg labels = ax.get_yticklabels() setp(labels, 'rotation', 90, fontsize=ticksize) # if plot type is 'fast' plot data time series as points if plottype == 'fast': pylab.plot(barytime,data,'o',color=lcolor) # if plot type is 'pretty' plot data time series as an unbroken line, retaining data gaps else: ltime = numpy.array([],dtype='float64') ldata = numpy.array([],dtype='float32') dt = 0 work1 = 2.0 * cadence / 86400 for i in range(1,len(data)-1): dt = barytime[i] - barytime[i-1] if dt < work1: ltime = numpy.append(ltime,barytime[i]) ldata = numpy.append(ldata,data[i]) else: pylab.plot(ltime,ldata,color=lcolor,linestyle='-',linewidth=lwidth) ltime = numpy.array([],dtype='float64') ldata = numpy.array([],dtype='float32') pylab.plot(ltime,ldata,color=lcolor,linestyle='-',linewidth=lwidth) # plot the fill color below data time series, with no data gaps pylab.fill(barytime,data,fc=fcolor,linewidth=0.0,alpha=falpha) # define plot x and y limits pylab.xlim(xmin-xr*0.01,xmax+xr*0.01) if ymin-yr*0.01 <= 0.0 or fullrange: pylab.ylim(1.0e-10,ymax+yr*0.01) else: pylab.ylim(ymin-yr*0.01,ymax+yr*0.01) if chooserange: pylab.ylim(y1,y2) # plot labels pylab.xlabel(xlab, {'color' : 'k'}) try: pylab.ylabel(ylab1, {'color' : 'k'}) except: ylab1 = '10**%d e-/s' % nrm pylab.ylabel(ylab1, {'color' : 'k'}) # make grid on plot # if plotgrid: pylab.grid() # TEMPORARY !!!!!!!!!!!!!!!!!!! # btime = numpy.arange(barytime[0],barytime[-1],0.25) + 0.125 # bflux = numpy.zeros((len(btime))) # j = 0 # work = numpy.array([]) # for i in range(1,len(barytime)-1): # if barytime[i] >= btime[j] - 0.125 and barytime[i] < btime[j] + 0.125: # work = numpy.append(work,data[i]) # else: # bflux[j] = numpy.mean(work) # work = numpy.array([]) # j += 1 # bflux[j] = numpy.mean(work) # # pylab.plot(btime,bflux,color='r',linestyle='',marker='D',markersize=20) # print numpy.std(bflux) # # pylab.plot([0.0,10000.0],[-49.5,-49.5],color='k',linestyle='--',linewidth=2.0) # pylab.plot([0.0,10000.0],[49.5,49.5],color='k',linestyle='--',linewidth=2.0) ## pylab.plot([0.0,10000.0],[15.5,15.5],color='k',linestyle=':',linewidth=4.0) ## pylab.plot([0.0,10000.0],[-15.5,-15.5],color='k',linestyle=':',linewidth=4.0) ## pylab.plot([0.0,10000.0],[-202,-202],color='k',linestyle='--',linewidth=2.0) ## pylab.plot([0.0,10000.0],[202,202],color='k',linestyle='--',linewidth=2.0) ## pylab.plot([0.0,10000.0],[0,0],color='k',linestyle=':',linewidth=4.0) ## pylab.plot([0.0,10000.0],[-81.*12.3,-81.*12.3],color='k',linestyle=':',linewidth=4.0) ax.minorticks_on() ax.tick_params('both', length=20, width=2, which='major') ax.tick_params('both', length=10, width=1, which='minor') # save plot to file if status == 0 and outfile.lower() != 'none': pylab.savefig(outfile) # render plot if cmdLine: pylab.show(block=True) else: pylab.ion() pylab.plot([]) pylab.ioff() # end time if (status == 0): message = 'KEPDRAW completed at' else: message = '\nKEPDRAW aborted at' kepmsg.clock(message,logfile,verbose)
def kepregr(infile, outfile, datacol, kmethod, kneighb, plot, plotlab, clobber, verbose, logfile, status): """ Perform a k-nearest neighbor regression analysis. """ ## startup parameters status = 0 labelsize = 24 ticksize = 16 xsize = 16 ysize = 6 lcolor = '#47AE10' lwidth = 1.0 fcolor = '#9AFF9A' falpha = 0.3 ## log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile, hashline, verbose) call = 'KEPREGR -- ' call += 'infile=' + infile + ' ' call += 'outfile=' + outfile + ' ' call += 'datacol=' + str(datacol) + ' ' call += 'kmethod=' + str(kmethod) + ' ' call += 'kneighb=' + str(kneighb) + ' ' plotit = 'n' if (plot): plotit = 'y' call += 'plot=' + plotit + ' ' call += 'plotlab=' + str(plotlab) + ' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber=' + overwrite + ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose=' + chatter + ' ' call += 'logfile=' + logfile kepmsg.log(logfile, call + '\n', verbose) ## start time kepmsg.clock('KEPREGR started at', logfile, verbose) ## test log file logfile = kepmsg.test(logfile) ## clobber output file if clobber: status = kepio.clobber(outfile, logfile, verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPREGR: ' + outfile + ' exists. Use clobber=yes' status = kepmsg.err(logfile, message, verbose) ## open input file if status == 0: instr, status = kepio.openfits(infile, 'readonly', logfile, verbose) tstart, tstop, bjdref, cadence, status = kepio.timekeys( instr, infile, logfile, verbose, status) if cadence == 0.0: tstart, tstop, ncad, cadence, status = kepio.cadence( instr, infile, logfile, verbose, status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence ## fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr, file, logfile, verbose) ## read table structure if status == 0: table, status = kepio.readfitstab(infile, instr[1], logfile, verbose) # read time and flux columns if status == 0: barytime, status = kepio.readtimecol(infile, table, logfile, verbose) if status == 0: flux, status = kepio.readfitscol(infile, instr[1].data, datacol, logfile, verbose) # filter input data table if status == 0: try: nanclean = instr[1].header['NANCLEAN'] except: naxis2 = 0 for i in range(len(table.field(0))): if (numpy.isfinite(barytime[i]) and numpy.isfinite(flux[i]) and flux[i] != 0.0): table[naxis2] = table[i] naxis2 += 1 instr[1].data = table[:naxis2] comment = 'NaN cadences removed from data' status = kepkey.new('NANCLEAN', True, comment, instr[1], outfile, logfile, verbose) ## read table columns if status == 0: try: intime = instr[1].data.field('barytime') except: intime, status = kepio.readfitscol(infile, instr[1].data, 'time', logfile, verbose) indata, status = kepio.readfitscol(infile, instr[1].data, datacol, logfile, verbose) if status == 0: intime = intime + bjdref indata = indata / cadenom if status == 0: outdata = knn_predict(intime, indata, kmethod, kneighb) ## comment keyword in output file if status == 0: status = kepkey.history(call, instr[0], outfile, logfile, verbose) ## clean up x-axis unit if status == 0: intime0 = float(int(tstart / 100) * 100.0) if intime0 < 2.4e6: intime0 += 2.4e6 ptime = intime - intime0 # print ptime,intime,intime0 xlab = 'BJD $-$ %d' % intime0 ## clean up y-axis units if status == 0: pout = indata * 1.0 pout2 = outdata * 1.0 nrm = len(str(int(numpy.nanmax(pout)))) - 1 pout = pout / 10**nrm pout2 = pout2 / 10**nrm ylab = '10$^%d$ %s' % (nrm, plotlab) ## data limits xmin = numpy.nanmin(ptime) xmax = numpy.nanmax(ptime) ymin = numpy.min(pout) ymax = numpy.nanmax(pout) xr = xmax - xmin yr = ymax - ymin ptime = insert(ptime, [0], [ptime[0]]) ptime = append(ptime, [ptime[-1]]) pout = insert(pout, [0], [0.0]) pout = append(pout, 0.0) pout2 = insert(pout2, [0], [0.0]) pout2 = append(pout2, 0.0) ## plot light curve if status == 0 and plot: try: params = { 'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight': 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize } rcParams.update(params) except: print('ERROR -- KEPREGR: install latex for scientific plotting') status = 1 if status == 0 and plot: pylab.figure(1, figsize=[xsize, ysize]) ## plot regression data ax = pylab.axes([0.06, 0.1, 0.93, 0.87]) pylab.gca().xaxis.set_major_formatter( pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter( pylab.ScalarFormatter(useOffset=False)) # pylab.plot(ptime,pout,color='#ff9900',linestyle='-',linewidth=lwidth) pylab.scatter(ptime, pout, color='#214CAE', s=5) fill(ptime, pout, color=fcolor, linewidth=0.0, alpha=falpha) pylab.plot(ptime[kneighb:-kneighb], pout2[kneighb:-kneighb], color=lcolor, linestyle='-', linewidth=lwidth * 2.0) xlabel(xlab, {'color': 'k'}) ylabel(ylab, {'color': 'k'}) xlim(xmin - xr * 0.01, xmax + xr * 0.01) if ymin >= 0.0: ylim(ymin - yr * 0.01, ymax + yr * 0.01) else: ylim(1.0e-10, ymax + yr * 0.01) pylab.grid() pylab.draw() pylab.savefig(re.sub('\.\S+', '.png', outfile), dpi=100) ## write output file if status == 0: for i in range(len(outdata)): instr[1].data.field(datacol)[i] = outdata[i] instr.writeto(outfile) ## close input file if status == 0: status = kepio.closefits(instr, logfile, verbose) ## end time if (status == 0): message = 'KEPREGR completed at' else: message = '\nKEPREGR aborted at' kepmsg.clock(message, logfile, verbose)
def kepdynamic(infile,outfile,fcol,pmin,pmax,nfreq,deltat,nslice, plot,plotscale,cmap,clobber,verbose,logfile,status,cmdLine=False): # startup parameters status = 0 labelsize = 24 ticksize = 16 xsize = 12 ysize = 6 lcolor = '#0000ff' lwidth = 1.0 fcolor = '#ffff00' falpha = 0.2 numpy.seterr(all="ignore") # log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPDYNAMIC -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'fcol='+fcol+' ' call += 'pmin='+str(pmin)+' ' call += 'pmax='+str(pmax)+' ' call += 'nfreq='+str(nfreq)+' ' call += 'deltat='+str(deltat)+' ' call += 'nslice='+str(nslice)+' ' plotit = 'n' if (plot): plotit = 'y' call += 'plot='+plotit+ ' ' call += 'plotscale='+plotscale+ ' ' call += 'cmap='+str(cmap)+' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber='+overwrite+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) # start time kepmsg.clock('Start time is',logfile,verbose) # test log file logfile = kepmsg.test(logfile) # error checking if status == 0 and pmin >= pmax: message = 'ERROR -- KEPDYNAMIC: PMIN must be less than PMAX' status = kepmsg.err(logfile,message,verbose) # clobber output file if clobber: status = kepio.clobber(outfile,logfile,verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPDYNAMIC: ' + outfile + ' exists. Use clobber' status = kepmsg.err(logfile,message,verbose) # plot color map if status == 0 and cmap == 'browse': status = keplab.cmap_plot() # open input file if status == 0: instr, status = kepio.openfits(infile,'readonly',logfile,verbose) if status == 0: tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr,infile,logfile,verbose,status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence # fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr,file,logfile,verbose) # read table columns if status == 0: barytime, status = kepio.readtimecol(infile,instr[1].data,logfile,verbose) if status == 0: signal, status = kepio.readfitscol(infile,instr[1].data,fcol,logfile,verbose) if status == 0: barytime = barytime + bjdref signal = signal / cadenom # remove infinite data from time series if status == 0: incols = [barytime, signal] outcols = kepstat.removeinfinlc(signal, incols) barytime = outcols[0] signal = outcols[1] # period to frequency conversion if status == 0: fmin = 1.0 / pmax fmax = 1.0 / pmin deltaf = (fmax - fmin) / nfreq # determine bounds of time slices if status == 0: t1 = []; t2 = [] dt = barytime[-1] - barytime[0] dt -= deltat if dt < 0: message = 'ERROR -- KEPDYNAMIC: time slices are larger than data range' status = kepmsg.err(logfile,message,verbose) ds = dt / (nslice - 1) for i in range(nslice): t1.append(barytime[0] + ds * float(i)) t2.append(barytime[0] + deltat + ds * float(i)) # loop through time slices if status == 0: dynam = [] for i in range(nslice): x = []; y = [] for j in range(len(barytime)): if (barytime[j] >= t1[i] and barytime[j] <= t2[i]): x.append(barytime[j]) y.append(signal[j]) x = array(x,dtype='float64') y = array(y,dtype='float32') y = y - median(y) # determine FT power fr, power = kepfourier.ft(x,y,fmin,fmax,deltaf,False) for j in range(len(power)): dynam.append(power[j]) print('Timeslice: %.4f Pmax: %.2E' % ((t2[i] + t1[i]) / 2, power.max())) # define shape of results array dynam = array(dynam,dtype='float64') dynam.shape = len(t1),len(power) # write output file if status == 0: instr.append(ImageHDU()) instr[-1].data = dynam.transpose() instr[-1].header.update('EXTNAME','DYNAMIC FT','extension name') instr[-1].header.update('WCSAXES',2,'number of WCS axes') instr[-1].header.update('CRPIX1',0.5,'reference pixel along axis 1') instr[-1].header.update('CRPIX2',0.5,'reference pixel along axis 2') instr[-1].header.update('CRVAL1',t1[0],'time at reference pixel (BJD)') instr[-1].header.update('CRVAL2',fmin,'frequency at reference pixel (1/day)') instr[-1].header.update('CDELT1',(barytime[-1] - barytime[0]) / nslice, 'pixel scale in dimension 1 (days)') instr[-1].header.update('CDELT2',deltaf,'pixel scale in dimension 2 (1/day)') instr[-1].header.update('CTYPE1','BJD','data type of dimension 1') instr[-1].header.update('CTYPE2','FREQUENCY','data type of dimension 2') instr.writeto(outfile) # history keyword in output file if status == 0: status = kepkey.history(call,instr[0],outfile,logfile,verbose) # close input file if status == 0: status = kepio.closefits(instr,logfile,verbose) # clean up x-axis unit if status == 0: time0 = float(int(barytime[0] / 100) * 100.0) barytime = barytime - time0 xlab = 'BJD $-$ %d' % time0 # image intensity min and max if status == 0: if 'rithmic' in plotscale: dynam = numpy.log10(dynam) elif 'sq' in plotscale: dynam = numpy.sqrt(dynam) elif 'logoflog' in plotscale: dynam = numpy.log10(numpy.abs(numpy.log10(dynam))) # dynam = -dynam nstat = 2; pixels = [] for i in range(dynam.shape[0]): for j in range(dynam.shape[1]): pixels.append(dynam[i,j]) pixels = array(sort(pixels),dtype=float32) if int(float(len(pixels)) * 0.1 + 0.5) > nstat: nstat = int(float(len(pixels)) * 0.1 + 0.5) zmin = median(pixels[:nstat]) zmax = median(pixels[-1:]) if isnan(zmax): zmax = median(pixels[-nstat/2:]) if isnan(zmax): zmax = numpy.nanmax(pixels) # plot power spectrum if status == 0 and plot: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} rcParams.update(params) pylab.figure(1,figsize=[xsize,ysize]) pylab.clf() pylab.axes([0.08,0.113,0.91,0.86]) dynam = dynam.transpose() pylab.imshow(dynam,origin='lower',aspect='auto',cmap=cmap,vmin=zmin,vmax=zmax, extent=[barytime[0],barytime[-1],fmin,fmax],interpolation='bilinear') xlabel(xlab, {'color' : 'k'}) ylabel(r'Frequency (d$^{-1}$)', {'color' : 'k'}) grid() pylab.savefig(re.sub('\.\S+','.png',outfile),dpi=100) # render plot if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() return status ## end time if (status == 0): message = 'KEPDYNAMIC completed at' else: message = '\nKEPDYNAMIC aborted at' kepmsg.clock(message,logfile,verbose)
def kepfilter(infile,outfile,datacol,function,cutoff,passband,plot,plotlab, clobber,verbose,logfile,status,cmdLine=False): ## startup parameters status = 0 numpy.seterr(all="ignore") labelsize = 24 ticksize = 16 xsize = 16 ysize = 6 lcolor = '#0000ff' lwidth = 1.0 fcolor = '#ffff00' falpha = 0.2 ## log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPFILTER -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'datacol='+str(datacol)+' ' call += 'function='+str(function)+' ' call += 'cutoff='+str(cutoff)+' ' call += 'passband='+str(passband)+' ' plotit = 'n' if (plot): plotit = 'y' call += 'plot='+plotit+ ' ' call += 'plotlab='+str(plotlab)+' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber='+overwrite+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) ## start time kepmsg.clock('KEPFILTER started at',logfile,verbose) ## test log file logfile = kepmsg.test(logfile) ## clobber output file if clobber: status = kepio.clobber(outfile,logfile,verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPFILTER: ' + outfile + ' exists. Use clobber=yes' status = kepmsg.err(logfile,message,verbose) ## open input file if status == 0: instr, status = kepio.openfits(infile,'readonly',logfile,verbose) tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr,infile,logfile,verbose,status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence ## fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr,file,logfile,verbose) ## read table structure if status == 0: table, status = kepio.readfitstab(infile,instr[1],logfile,verbose) # read time and flux columns if status == 0: barytime, status = kepio.readtimecol(infile,table,logfile,verbose) flux, status = kepio.readsapcol(infile,table,logfile,verbose) # filter input data table if status == 0: try: nanclean = instr[1].header['NANCLEAN'] except: naxis2 = 0 for i in range(len(table.field(0))): if (numpy.isfinite(barytime[i]) and numpy.isfinite(flux[i]) and flux[i] != 0.0): table[naxis2] = table[i] naxis2 += 1 instr[1].data = table[:naxis2] comment = 'NaN cadences removed from data' status = kepkey.new('NANCLEAN',True,comment,instr[1],outfile,logfile,verbose) ## read table columns if status == 0: intime, status = kepio.readtimecol(infile,instr[1].data,logfile,verbose) if status == 0: indata, status = kepio.readfitscol(infile,instr[1].data,datacol,logfile,verbose) if status == 0: intime = intime + bjdref indata = indata / cadenom ## define data sampling if status == 0: tr = 1.0 / (cadence / 86400) timescale = 1.0 / (cutoff / tr) ## define convolution function if status == 0: if function == 'boxcar': filtfunc = numpy.ones(numpy.ceil(timescale)) elif function == 'gauss': timescale /= 2 dx = numpy.ceil(timescale * 10 + 1) filtfunc = kepfunc.gauss() filtfunc = filtfunc([1.0,dx/2-1.0,timescale],linspace(0,dx-1,dx)) elif function == 'sinc': dx = numpy.ceil(timescale * 12 + 1) fx = linspace(0,dx-1,dx) fx = fx - dx / 2 + 0.5 fx /= timescale filtfunc = numpy.sinc(fx) filtfunc /= numpy.sum(filtfunc) ## pad time series at both ends with noise model if status == 0: ave, sigma = kepstat.stdev(indata[:len(filtfunc)]) padded = append(kepstat.randarray(np.ones(len(filtfunc)) * ave, np.ones(len(filtfunc)) * sigma), indata) ave, sigma = kepstat.stdev(indata[-len(filtfunc):]) padded = append(padded, kepstat.randarray(np.ones(len(filtfunc)) * ave, np.ones(len(filtfunc)) * sigma)) ## convolve data if status == 0: convolved = convolve(padded,filtfunc,'same') ## remove padding from the output array if status == 0: if function == 'boxcar': outdata = convolved[len(filtfunc):-len(filtfunc)] else: outdata = convolved[len(filtfunc):-len(filtfunc)] ## subtract low frequencies if status == 0 and passband == 'high': outmedian = median(outdata) outdata = indata - outdata + outmedian ## comment keyword in output file if status == 0: status = kepkey.history(call,instr[0],outfile,logfile,verbose) ## clean up x-axis unit if status == 0: intime0 = float(int(tstart / 100) * 100.0) if intime0 < 2.4e6: intime0 += 2.4e6 ptime = intime - intime0 xlab = 'BJD $-$ %d' % intime0 ## clean up y-axis units if status == 0: pout = indata * 1.0 pout2 = outdata * 1.0 nrm = len(str(int(numpy.nanmax(pout))))-1 pout = pout / 10**nrm pout2 = pout2 / 10**nrm ylab = '10$^%d$ %s' % (nrm, plotlab) ## data limits xmin = ptime.min() xmax = ptime.max() ymin = numpy.nanmin(pout) ymax = numpy.nanmax(pout) xr = xmax - xmin yr = ymax - ymin ptime = insert(ptime,[0],[ptime[0]]) ptime = append(ptime,[ptime[-1]]) pout = insert(pout,[0],[0.0]) pout = append(pout,0.0) pout2 = insert(pout2,[0],[0.0]) pout2 = append(pout2,0.0) ## plot light curve if status == 0 and plot: try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} rcParams.update(params) except: print 'ERROR -- KEPFILTER: install latex for scientific plotting' status = 1 if status == 0 and plot: pylab.figure(figsize=[xsize,ysize]) pylab.clf() ## plot filtered data ax = pylab.axes([0.06,0.1,0.93,0.87]) pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) labels = ax.get_yticklabels() setp(labels, 'rotation', 90, fontsize=12) pylab.plot(ptime,pout,color='#ff9900',linestyle='-',linewidth=lwidth) fill(ptime,pout,color=fcolor,linewidth=0.0,alpha=falpha) if passband == 'low': pylab.plot(ptime[1:-1],pout2[1:-1],color=lcolor,linestyle='-',linewidth=lwidth) else: pylab.plot(ptime,pout2,color=lcolor,linestyle='-',linewidth=lwidth) fill(ptime,pout2,color=lcolor,linewidth=0.0,alpha=falpha) xlabel(xlab, {'color' : 'k'}) ylabel(ylab, {'color' : 'k'}) xlim(xmin-xr*0.01,xmax+xr*0.01) if ymin >= 0.0: ylim(ymin-yr*0.01,ymax+yr*0.01) else: ylim(1.0e-10,ymax+yr*0.01) pylab.grid() # render plot if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() ## write output file if status == 0: for i in range(len(outdata)): instr[1].data.field(datacol)[i] = outdata[i] instr.writeto(outfile) ## close input file if status == 0: status = kepio.closefits(instr,logfile,verbose) ## end time if (status == 0): message = 'KEPFILTER completed at' else: message = '\nKEPFILTER aborted at' kepmsg.clock(message,logfile,verbose)
def kepdip(infile,outfile,datacol,dmethod,kneighb,hstd,plot,plotlab, clobber,verbose,logfile,status): """ Perform a k-nearest neighbor regression analysis. """ ## startup parameters status = 0 labelsize = 24 ticksize = 16 xsize = 16 ysize = 6 lcolor = '#0000ff' lwidth = 1.0 fcolor = '#9AFF9A' falpha = 0.3 ## log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPDIP -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'datacol='+str(datacol)+' ' call += 'dmethod='+dmethod+' ' call += 'hstd='+str(hstd)+' ' call += 'kneighb='+str(kneighb)+' ' plotit = 'n' if (plot): plotit = 'y' call += 'plot='+plotit+ ' ' call += 'plotlab='+str(plotlab)+' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber='+overwrite+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) ## start time kepmsg.clock('KEPDIP started at',logfile,verbose) ## test log file logfile = kepmsg.test(logfile) ## clobber output file if clobber: status = kepio.clobber(outfile,logfile,verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPDIP: ' + outfile + ' exists. Use clobber=yes' status = kepmsg.err(logfile,message,verbose) ## open input file if status == 0: instr, status = kepio.openfits(infile,'readonly',logfile,verbose) tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr,infile,logfile,verbose,status) if cadence == 0.0: tstart, tstop, ncad, cadence, status = kepio.cadence(instr,infile,logfile,verbose,status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence ## fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr,file,logfile,verbose) ## read table structure if status == 0: table, status = kepio.readfitstab(infile,instr[1],logfile,verbose) # read time and flux columns if status == 0: barytime, status = kepio.readtimecol(infile,table,logfile,verbose) if status == 0: flux, status = kepio.readfitscol(infile,instr[1].data,datacol,logfile,verbose) # filter input data table if status == 0: try: nanclean = instr[1].header['NANCLEAN'] except: naxis2 = 0 for i in range(len(table.field(0))): if (numpy.isfinite(barytime[i]) and numpy.isfinite(flux[i]) and flux[i] != 0.0): table[naxis2] = table[i] naxis2 += 1 instr[1].data = table[:naxis2] comment = 'NaN cadences removed from data' status = kepkey.new('NANCLEAN',True,comment,instr[1],outfile,logfile,verbose) ## read table columns if status == 0: try: intime = instr[1].data.field('barytime') except: intime, status = kepio.readfitscol(infile,instr[1].data,'time',logfile,verbose) indata, status = kepio.readfitscol(infile,instr[1].data,datacol,logfile,verbose) if status == 0: intime = intime + bjdref indata = indata / cadenom ## smooth data if status == 0: # outdata = knn_predict(intime, indata, kmethod, kneighb) outdata_t, outdata_l, outdata_fmt = _find_dips(intime, indata, dmethod, kneighb, hstd) ## comment keyword in output file if status == 0: status = kepkey.history(call,instr[0],outfile,logfile,verbose) ## clean up x-axis unit if status == 0: intime0 = float(int(tstart / 100) * 100.0) if intime0 < 2.4e6: intime0 += 2.4e6 ptime = intime - intime0 ptime2 = outdata_t - intime0 # print ptime,intime,intime0 xlab = 'BJD $-$ %d' % intime0 ## clean up y-axis units if status == 0: pout = indata * 1.0 pout2 = outdata_l * 1.0 nrm = len(str(int(numpy.nanmax(pout))))-1 pout = pout / 10**nrm pout2 = pout2 / 10**nrm ylab = '10$^%d$ %s' % (nrm, plotlab) ## data limits xmin = numpy.nanmin(ptime) xmax = numpy.nanmax(ptime) ymin = numpy.min(pout) ymax = numpy.nanmax(pout) xr = xmax - xmin yr = ymax - ymin ptime = insert(ptime,[0],[ptime[0]]) ptime = append(ptime,[ptime[-1]]) pout = insert(pout,[0],[0.0]) pout = append(pout,0.0) if (len(ptime2) > 0): ptime2 = insert(ptime2,[0],[ptime2[0]]) ptime2 = append(ptime2,[ptime2[-1]]) pout2 = insert(pout2,[0],[0.0]) pout2 = append(pout2,0.0) ## plot light curve if status == 0 and plot: try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} rcParams.update(params) except: print('ERROR -- KEPDIP: install latex for scientific plotting') status = 1 if status == 0 and plot: pylab.figure(1,figsize=[xsize,ysize]) ## plot regression data ax = pylab.axes([0.06,0.1,0.93,0.87]) pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.scatter(ptime, pout, color='#214CAE', s=2) if (len(ptime2) > 0): pylab.scatter(ptime2, pout2, color='#47AE10', s=35, marker='o', linewidths=2, alpha=0.4) xlabel(xlab, {'color' : 'k'}) ylabel(ylab, {'color' : 'k'}) xlim(xmin-xr*0.01,xmax+xr*0.01) if ymin >= 0.0: ylim(ymin-yr*0.01,ymax+yr*0.01) else: ylim(1.0e-10,ymax+yr*0.01) pylab.grid() pylab.draw() pylab.savefig(re.sub('\.\S+','.png',outfile),dpi=100) ## write output file if status == 0: for i in range(len(outdata_fmt)): instr[1].data.field(datacol)[i] = outdata_fmt[i] instr.writeto(outfile) ## close input file if status == 0: status = kepio.closefits(instr,logfile,verbose) ## end time if (status == 0): message = 'KEPDIP completed at' else: message = '\nKEPDIP aborted at' kepmsg.clock(message,logfile,verbose)
def kepsmooth( infile, outfile, datacol, function, fscale, plot, plotlab, clobber, verbose, logfile, status, cmdLine=False ): ## startup parameters status = 0 labelsize = 24 ticksize = 16 xsize = 18 ysize = 6 lcolor = "#0000ff" lwidth = 1.0 fcolor = "#ffff00" falpha = 0.2 ## log the call hashline = "----------------------------------------------------------------------------" kepmsg.log(logfile, hashline, verbose) call = "KEPSMOOTH -- " call += "infile=" + infile + " " call += "outfile=" + outfile + " " call += "datacol=" + str(datacol) + " " call += "function=" + str(function) + " " call += "fscale=" + str(fscale) + " " plotit = "n" if plot: plotit = "y" call += "plot=" + plotit + " " call += "plotlab=" + str(plotlab) + " " overwrite = "n" if clobber: overwrite = "y" call += "clobber=" + overwrite + " " chatter = "n" if verbose: chatter = "y" call += "verbose=" + chatter + " " call += "logfile=" + logfile kepmsg.log(logfile, call + "\n", verbose) ## start time kepmsg.clock("KEPSMOOTH started at", logfile, verbose) ## test log file logfile = kepmsg.test(logfile) ## clobber output file if clobber: status = kepio.clobber(outfile, logfile, verbose) if kepio.fileexists(outfile): message = "ERROR -- KEPSMOOTH: " + outfile + " exists. Use clobber=yes" status = kepmsg.err(logfile, message, verbose) ## open input file if status == 0: instr, status = kepio.openfits(infile, "readonly", logfile, verbose) tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr, infile, logfile, verbose, status) if cadence == 0.0: tstart, tstop, ncad, cadence, status = kepio.cadence(instr, infile, logfile, verbose, status) if status == 0: try: work = instr[0].header["FILEVER"] cadenom = 1.0 except: cadenom = cadence ## fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr, file, logfile, verbose) ## read table structure if status == 0: table, status = kepio.readfitstab(infile, instr[1], logfile, verbose) # read time and flux columns if status == 0: barytime, status = kepio.readtimecol(infile, table, logfile, verbose) if status == 0: flux, status = kepio.readfitscol(infile, instr[1].data, datacol, logfile, verbose) # filter input data table if status == 0: try: nanclean = instr[1].header["NANCLEAN"] except: naxis2 = 0 for i in range(len(table.field(0))): if numpy.isfinite(barytime[i]) and numpy.isfinite(flux[i]) and flux[i] != 0.0: table[naxis2] = table[i] naxis2 += 1 instr[1].data = table[:naxis2] comment = "NaN cadences removed from data" status = kepkey.new("NANCLEAN", True, comment, instr[1], outfile, logfile, verbose) ## read table columns if status == 0: try: intime = instr[1].data.field("barytime") except: intime, status = kepio.readfitscol(infile, instr[1].data, "time", logfile, verbose) indata, status = kepio.readfitscol(infile, instr[1].data, datacol, logfile, verbose) if status == 0: intime = intime + bjdref indata = indata / cadenom ## smooth data if status == 0: outdata = kepfunc.smooth(indata, fscale / (cadence / 86400), function) ## comment keyword in output file if status == 0: status = kepkey.history(call, instr[0], outfile, logfile, verbose) ## clean up x-axis unit if status == 0: intime0 = float(int(tstart / 100) * 100.0) if intime0 < 2.4e6: intime0 += 2.4e6 ptime = intime - intime0 xlab = "BJD $-$ %d" % intime0 ## clean up y-axis units if status == 0: pout = indata * 1.0 pout2 = outdata * 1.0 nrm = len(str(int(numpy.nanmax(pout)))) - 1 pout = pout / 10 ** nrm pout2 = pout2 / 10 ** nrm ylab = "10$^%d$ %s" % (nrm, re.sub("_", "-", plotlab)) ## data limits xmin = numpy.nanmin(ptime) xmax = numpy.nanmax(ptime) ymin = numpy.min(pout) ymax = numpy.nanmax(pout) xr = xmax - xmin yr = ymax - ymin ptime = insert(ptime, [0], [ptime[0]]) ptime = append(ptime, [ptime[-1]]) pout = insert(pout, [0], [0.0]) pout = append(pout, 0.0) pout2 = insert(pout2, [0], [0.0]) pout2 = append(pout2, 0.0) ## plot light curve if status == 0 and plot: try: params = { "backend": "png", "axes.linewidth": 2.5, "axes.labelsize": labelsize, "axes.font": "sans-serif", "axes.fontweight": "bold", "text.fontsize": 12, "legend.fontsize": 12, "xtick.labelsize": ticksize, "ytick.labelsize": ticksize, } rcParams.update(params) except: print "ERROR -- KEPSMOOTH: install latex for scientific plotting" status = 1 if status == 0 and plot: pylab.figure(1, figsize=[xsize, ysize]) # delete any fossil plots in the matplotlib window pylab.clf() # position axes inside the plotting window ax = pylab.subplot(111) pylab.subplots_adjust(0.06, 0.1, 0.93, 0.88) # force tick labels to be absolute rather than relative pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) # rotate y labels by 90 deg labels = ax.get_yticklabels() setp(labels, "rotation", 90) pylab.plot(ptime[1:-1], pout[1:-1], color="#ff9900", linestyle="-", linewidth=lwidth) fill(ptime, pout, color=fcolor, linewidth=0.0, alpha=falpha) pylab.plot(ptime, pout2, color=lcolor, linestyle="-", linewidth=lwidth * 4.0) pylab.xlabel(xlab, {"color": "k"}) pylab.ylabel(ylab, {"color": "k"}) xlim(xmin - xr * 0.01, xmax + xr * 0.01) if ymin >= 0.0: ylim(ymin - yr * 0.01, ymax + yr * 0.01) else: ylim(1.0e-10, ymax + yr * 0.01) pylab.grid() # render plot if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() ## write output file if status == 0: for i in range(len(outdata)): instr[1].data.field(datacol)[i] = outdata[i] instr.writeto(outfile) ## close input file if status == 0: status = kepio.closefits(instr, logfile, verbose) ## end time if status == 0: message = "KEPSMOOTH completed at" else: message = "\nKEPSMOOTH aborted at" kepmsg.clock(message, logfile, verbose)
def kepfoldimg(infile,outfile,datacol,period,phasezero,binmethod,threshold,niter,nbins, plot,plotlab,clobber,verbose,logfile,status): # startup parameters status = 0 labelsize = 24; ticksize = 16; xsize = 17; ysize = 7 lcolor = '#0000ff'; lwidth = 1.0; fcolor = '#ffff00'; falpha = 0.2 # log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPFOLD -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'datacol='+datacol+' ' call += 'period='+str(period)+' ' call += 'phasezero='+str(phasezero)+' ' call += 'binmethod='+binmethod+' ' call += 'threshold='+str(threshold)+' ' call += 'niter='+str(niter)+' ' call += 'nbins='+str(nbins)+' ' plotres = 'n' if (plot): plotres = 'y' call += 'plot='+plotres+ ' ' call += 'plotlab='+plotlab+ ' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber='+overwrite+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) # start time kepmsg.clock('KEPFOLDIMG started at: ',logfile,verbose) # test log file logfile = kepmsg.test(logfile) # clobber output file if clobber: status = kepio.clobber(outfile,logfile,verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPFOLDIMG: ' + outfile + ' exists. Use --clobber' status = kepmsg.err(logfile,message,verbose) # open input file if status == 0: instr, status = kepio.openfits(infile,'readonly',logfile,verbose) if status == 0: tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr,infile,logfile,verbose,status) # fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr,infile,logfile,verbose) # input data if status == 0: table = instr[1].data incards = instr[1].header.cards indata, status = kepio.readfitscol(infile,table,datacol,logfile,verbose) barytime, status = kepio.readtimecol(infile,table,logfile,verbose) # filter out NaNs work1 = []; work2 = [] if status == 0: for i in range(len(barytime)): if (numpy.isfinite(barytime[i]) and numpy.isfinite(indata[i]) and indata[i] != 0.0): work1.append(barytime[i]) work2.append(indata[i]) barytime = array(work1,dtype='float64') indata = array(work2,dtype='float32') # calculate phase if status == 0: phase2 = [] phase1 = (barytime - phasezero) / period for i in range(len(phase1)): phase2.append(phase1[i] - int(phase1[i])) if phase2[-1] < 0.0: phase2[-1] += 1.0 phase2 = array(phase2,'float32') # sort phases if status == 0: ptuple = [] phase3 = [] data3 = [] for i in range(len(phase2)): ptuple.append([phase2[i], indata[i]]) phsort = sorted(ptuple,key=lambda ph: ph[0]) for i in range(len(phsort)): phase3.append(phsort[i][0]) data3.append(phsort[i][1]) phase3 = array(phase3,'float32') data3 = array(data3,'float32') # bin phases if status == 0: work1 = array([data3[0]],'float32') phase4 = array([],'float32') data4 = array([],'float32') dt = (phase3[-1] - phase3[0]) / nbins nb = 0.0 for i in range(len(phase3)): if phase3[i] < phase3[0] + nb * dt or phase3[i] >= phase3[0] + (nb + 1.0) * dt: if len(work1) > 0: phase4 = append(phase4,phase3[0] + (nb + 0.5) * dt) if (binmethod == 'mean'): data4 = append(data4,kepstat.mean(work1)) elif (binmethod == 'median'): data4 = append(data4,kepstat.median(work1,logfile)) else: coeffs, errors, covar, iiter, sigma, chi2, dof, fit, plotx, ploty, status = \ kepfit.lsqclip('poly0',[1.0],arange(0.0,float(len(work1)),1.0),work1,None, threshold,threshold,niter,logfile,verbose) data4 = append(data4,coeffs[0]) work1 = array([],'float32') nb += 1.0 else: work1 = append(work1,data3[i]) # update HDU1 for output file if status == 0: cols = (instr[1].columns + ColDefs([Column(name='PHASE',format='E',array=phase1)])) instr[1] = pyfits.new_table(cols) instr[1].header.cards['TTYPE20'].comment = 'column title: phase' instr[1].header.cards['TFORM20'].comment = 'data type: float32' for i in range(len(incards)): if incards[i].key not in instr[1].header.keys(): instr[1].header.update(incards[i].key, incards[i].value, incards[i].comment) else: instr[1].header.cards[incards[i].key].comment = incards[i].comment instr[1].header.update('PERIOD',period,'period defining the phase [d]') instr[1].header.update('BJD0',phasezero,'time of phase zero [BJD]') # write new phased data extension for output file if status == 0: col1 = Column(name='PHASE',format='E',array=phase4) col2 = Column(name=datacol,format='E',unit='e/s',array=data4/cadence) cols = ColDefs([col1,col2]) instr.append(new_table(cols)) instr[-1].header.cards['TTYPE1'].comment = 'column title: phase' instr[-1].header.cards['TTYPE2'].comment = 'column title: simple aperture photometry' instr[-1].header.cards['TFORM1'].comment = 'column type: float32' instr[-1].header.cards['TFORM2'].comment = 'column type: float32' instr[-1].header.cards['TUNIT2'].comment = 'column units: electrons per second' instr[-1].header.update('EXTNAME','FOLDED','extension name') instr[-1].header.update('PERIOD',period,'period defining the phase [d]') instr[-1].header.update('BJD0',phasezero,'time of phase zero [BJD]') instr[-1].header.update('BINMETHD',binmethod,'phase binning method') if binmethod =='sigclip': instr[-1].header.update('THRSHOLD',threshold,'sigma-clipping threshold [sigma]') instr[-1].header.update('NITER',niter,'max number of sigma-clipping iterations') # history keyword in output file if status == 0: status = kepkey.history(call,instr[0],outfile,logfile,verbose) instr.writeto(outfile) # close input file if status == 0: status = kepio.closefits(instr,logfile,verbose) # clean up x-axis unit if status == 0: ptime = array([],'float32') pout = array([],'float32') work = data4 for i in range(len(phase4)): if (phase4[i] > 0.5): ptime = append(ptime,phase4[i] - 1.0) pout = append(pout,work[i] / cadence) ptime = append(ptime,phase4) pout = append(pout,work / cadence) for i in range(len(phase4)): if (phase4[i] <= 0.5): ptime = append(ptime,phase4[i] + 1.0) pout = append(pout,work[i] / cadence) xlab = 'Phase ($\phi$)' # clean up y-axis units if status == 0: nrm = len(str(int(pout.max())))-1 pout = pout / 10**nrm ylab = '10$^%d$ %s' % (nrm, plotlab) # data limits xmin = ptime.min() xmax = ptime.max() ymin = pout.min() ymax = pout.max() xr = xmax - xmin yr = ymax - ymin ptime = insert(ptime,[0],[ptime[0]]) ptime = append(ptime,[ptime[-1]]) pout = insert(pout,[0],[0.0]) pout = append(pout,0.0) # plot new light curve if status == 0 and plot: try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} pylab.rcParams.update(params) except: print 'ERROR -- KEPFOLD: install latex for scientific plotting' status = 1 if status == 0 and plot: pylab.figure(1,figsize=[17,7]) pylab.clf() pylab.axes([0.06,0.1,0.93,0.87]) pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.plot(ptime,pout,color=lcolor,linestyle='-',linewidth=lwidth) fill(ptime,pout,color=fcolor,linewidth=0.0,alpha=falpha) xlabel(xlab, {'color' : 'k'}) ylabel(ylab, {'color' : 'k'}) xlim(-0.49999,1.49999) if ymin >= 0.0: ylim(ymin-yr*0.01,ymax+yr*0.01) else: ylim(1.0e-10,ymax+yr*0.01) pylab.grid() pylab.draw() # stop time kepmsg.clock('KEPFOLDIMG ended at: ',logfile,verbose)
def kepsmooth(infile,outfile,datacol,function,fscale,plot,plotlab, clobber,verbose,logfile,status, cmdLine=False): ## startup parameters status = 0 labelsize = 24 ticksize = 16 xsize = 18 ysize = 6 lcolor = '#0000ff' lwidth = 1.0 fcolor = '#ffff00' falpha = 0.2 ## log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPSMOOTH -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'datacol='+str(datacol)+' ' call += 'function='+str(function)+' ' call += 'fscale='+str(fscale)+' ' plotit = 'n' if (plot): plotit = 'y' call += 'plot='+plotit+ ' ' call += 'plotlab='+str(plotlab)+' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber='+overwrite+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) ## start time kepmsg.clock('KEPSMOOTH started at',logfile,verbose) ## test log file logfile = kepmsg.test(logfile) ## clobber output file if clobber: status = kepio.clobber(outfile,logfile,verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPSMOOTH: ' + outfile + ' exists. Use clobber=yes' status = kepmsg.err(logfile,message,verbose) ## open input file if status == 0: instr, status = kepio.openfits(infile,'readonly',logfile,verbose) tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr,infile,logfile,verbose,status) if cadence == 0.0: tstart, tstop, ncad, cadence, status = kepio.cadence(instr,infile,logfile,verbose,status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence ## fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr,file,logfile,verbose) ## read table structure if status == 0: table, status = kepio.readfitstab(infile,instr[1],logfile,verbose) # read time and flux columns if status == 0: barytime, status = kepio.readtimecol(infile,table,logfile,verbose) if status == 0: flux, status = kepio.readfitscol(infile,instr[1].data,datacol,logfile,verbose) # filter input data table if status == 0: try: nanclean = instr[1].header['NANCLEAN'] except: naxis2 = 0 for i in range(len(table.field(0))): if (numpy.isfinite(barytime[i]) and numpy.isfinite(flux[i]) and flux[i] != 0.0): table[naxis2] = table[i] naxis2 += 1 instr[1].data = table[:naxis2] comment = 'NaN cadences removed from data' status = kepkey.new('NANCLEAN',True,comment,instr[1],outfile,logfile,verbose) ## read table columns if status == 0: try: intime = instr[1].data.field('barytime') except: intime, status = kepio.readfitscol(infile,instr[1].data,'time',logfile,verbose) indata, status = kepio.readfitscol(infile,instr[1].data,datacol,logfile,verbose) if status == 0: intime = intime + bjdref indata = indata / cadenom ## smooth data if status == 0: outdata = kepfunc.smooth(indata,fscale/(cadence/86400),function) ## comment keyword in output file if status == 0: status = kepkey.history(call,instr[0],outfile,logfile,verbose) ## clean up x-axis unit if status == 0: intime0 = float(int(tstart / 100) * 100.0) if intime0 < 2.4e6: intime0 += 2.4e6 ptime = intime - intime0 xlab = 'BJD $-$ %d' % intime0 ## clean up y-axis units if status == 0: pout = indata * 1.0 pout2 = outdata * 1.0 nrm = len(str(int(numpy.nanmax(pout))))-1 pout = pout / 10**nrm pout2 = pout2 / 10**nrm ylab = '10$^%d$ %s' % (nrm, re.sub('_','-',plotlab)) ## data limits xmin = numpy.nanmin(ptime) xmax = numpy.nanmax(ptime) ymin = numpy.min(pout) ymax = numpy.nanmax(pout) xr = xmax - xmin yr = ymax - ymin ptime = insert(ptime,[0],[ptime[0]]) ptime = append(ptime,[ptime[-1]]) pout = insert(pout,[0],[0.0]) pout = append(pout,0.0) pout2 = insert(pout2,[0],[0.0]) pout2 = append(pout2,0.0) ## plot light curve if status == 0 and plot: try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} rcParams.update(params) except: print('ERROR -- KEPSMOOTH: install latex for scientific plotting') status = 1 if status == 0 and plot: pylab.figure(1,figsize=[xsize,ysize]) # delete any fossil plots in the matplotlib window pylab.clf() # position axes inside the plotting window ax = pylab.subplot(111) pylab.subplots_adjust(0.06,0.1,0.93,0.88) # force tick labels to be absolute rather than relative pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) # rotate y labels by 90 deg labels = ax.get_yticklabels() setp(labels, 'rotation', 90) pylab.plot(ptime[1:-1],pout[1:-1],color='#ff9900',linestyle='-',linewidth=lwidth) fill(ptime,pout,color=fcolor,linewidth=0.0,alpha=falpha) pylab.plot(ptime,pout2,color=lcolor,linestyle='-',linewidth=lwidth*4.0) pylab.xlabel(xlab, {'color' : 'k'}) pylab.ylabel(ylab, {'color' : 'k'}) xlim(xmin-xr*0.01,xmax+xr*0.01) if ymin >= 0.0: ylim(ymin-yr*0.01,ymax+yr*0.01) else: ylim(1.0e-10,ymax+yr*0.01) pylab.grid() # render plot if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() ## write output file if status == 0: for i in range(len(outdata)): instr[1].data.field(datacol)[i] = outdata[i] instr.writeto(outfile) ## close input file if status == 0: status = kepio.closefits(instr,logfile,verbose) ## end time if (status == 0): message = 'KEPSMOOTH completed at' else: message = '\nKEPSMOOTH aborted at' kepmsg.clock(message,logfile,verbose)
def kepfold(infile, outfile, period, phasezero, bindata, binmethod, threshold, niter, nbins, rejqual, plottype, plotlab, clobber, verbose, logfile, status, cmdLine=False): # startup parameters status = 0 labelsize = 32 ticksize = 18 xsize = 18 ysize = 10 lcolor = '#0000ff' lwidth = 2.0 fcolor = '#ffff00' falpha = 0.2 # log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile, hashline, verbose) call = 'KEPFOLD -- ' call += 'infile=' + infile + ' ' call += 'outfile=' + outfile + ' ' call += 'period=' + str(period) + ' ' call += 'phasezero=' + str(phasezero) + ' ' binit = 'n' if (bindata): binit = 'y' call += 'bindata=' + binit + ' ' call += 'binmethod=' + binmethod + ' ' call += 'threshold=' + str(threshold) + ' ' call += 'niter=' + str(niter) + ' ' call += 'nbins=' + str(nbins) + ' ' qflag = 'n' if (rejqual): qflag = 'y' call += 'rejqual=' + qflag + ' ' call += 'plottype=' + plottype + ' ' call += 'plotlab=' + plotlab + ' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber=' + overwrite + ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose=' + chatter + ' ' call += 'logfile=' + logfile kepmsg.log(logfile, call + '\n', verbose) # start time kepmsg.clock('KEPFOLD started at', logfile, verbose) # test log file logfile = kepmsg.test(logfile) # clobber output file if clobber: status = kepio.clobber(outfile, logfile, verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPFOLD: ' + outfile + ' exists. Use --clobber' status = kepmsg.err(logfile, message, verbose) # open input file if status == 0: instr, status = kepio.openfits(infile, 'readonly', logfile, verbose) if status == 0: tstart, tstop, bjdref, cadence, status = kepio.timekeys( instr, infile, logfile, verbose, status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence # fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr, file, logfile, verbose) # input data if status == 0: table = instr[1].data incards = instr[1].header.cards try: sap = instr[1].data.field('SAP_FLUX') except: try: sap = instr[1].data.field('ap_raw_flux') except: sap = zeros(len(table.field(0))) try: saperr = instr[1].data.field('SAP_FLUX_ERR') except: try: saperr = instr[1].data.field('ap_raw_err') except: saperr = zeros(len(table.field(0))) try: pdc = instr[1].data.field('PDCSAP_FLUX') except: try: pdc = instr[1].data.field('ap_corr_flux') except: pdc = zeros(len(table.field(0))) try: pdcerr = instr[1].data.field('PDCSAP_FLUX_ERR') except: try: pdcerr = instr[1].data.field('ap_corr_err') except: pdcerr = zeros(len(table.field(0))) try: cbv = instr[1].data.field('CBVSAP_FLUX') except: cbv = zeros(len(table.field(0))) if 'cbv' in plottype: txt = 'ERROR -- KEPFOLD: CBVSAP_FLUX column is not populated. Use kepcotrend' status = kepmsg.err(logfile, txt, verbose) try: det = instr[1].data.field('DETSAP_FLUX') except: det = zeros(len(table.field(0))) if 'det' in plottype: txt = 'ERROR -- KEPFOLD: DETSAP_FLUX column is not populated. Use kepflatten' status = kepmsg.err(logfile, txt, verbose) try: deterr = instr[1].data.field('DETSAP_FLUX_ERR') except: deterr = zeros(len(table.field(0))) if 'det' in plottype: txt = 'ERROR -- KEPFOLD: DETSAP_FLUX_ERR column is not populated. Use kepflatten' status = kepmsg.err(logfile, txt, verbose) try: quality = instr[1].data.field('SAP_QUALITY') except: quality = zeros(len(table.field(0))) if qualflag: txt = 'WARNING -- KEPFOLD: Cannot find a QUALITY data column' kepmsg.warn(logfile, txt) if status == 0: barytime, status = kepio.readtimecol(infile, table, logfile, verbose) barytime1 = copy(barytime) # filter out NaNs and quality > 0 work1 = [] work2 = [] work3 = [] work4 = [] work5 = [] work6 = [] work8 = [] work9 = [] if status == 0: if 'sap' in plottype: datacol = copy(sap) errcol = copy(saperr) if 'pdc' in plottype: datacol = copy(pdc) errcol = copy(pdcerr) if 'cbv' in plottype: datacol = copy(cbv) errcol = copy(saperr) if 'det' in plottype: datacol = copy(det) errcol = copy(deterr) for i in range(len(barytime)): if (numpy.isfinite(barytime[i]) and numpy.isfinite(datacol[i]) and datacol[i] != 0.0 and numpy.isfinite(errcol[i]) and errcol[i] > 0.0): if rejqual and quality[i] == 0: work1.append(barytime[i]) work2.append(sap[i]) work3.append(saperr[i]) work4.append(pdc[i]) work5.append(pdcerr[i]) work6.append(cbv[i]) work8.append(det[i]) work9.append(deterr[i]) elif not rejqual: work1.append(barytime[i]) work2.append(sap[i]) work3.append(saperr[i]) work4.append(pdc[i]) work5.append(pdcerr[i]) work6.append(cbv[i]) work8.append(det[i]) work9.append(deterr[i]) barytime = array(work1, dtype='float64') sap = array(work2, dtype='float32') / cadenom saperr = array(work3, dtype='float32') / cadenom pdc = array(work4, dtype='float32') / cadenom pdcerr = array(work5, dtype='float32') / cadenom cbv = array(work6, dtype='float32') / cadenom det = array(work8, dtype='float32') / cadenom deterr = array(work9, dtype='float32') / cadenom # calculate phase if status == 0: if phasezero < bjdref: phasezero += bjdref date1 = (barytime1 + bjdref - phasezero) phase1 = (date1 / period) - floor(date1 / period) date2 = (barytime + bjdref - phasezero) phase2 = (date2 / period) - floor(date2 / period) phase2 = array(phase2, 'float32') # sort phases if status == 0: ptuple = [] phase3 = [] sap3 = [] saperr3 = [] pdc3 = [] pdcerr3 = [] cbv3 = [] cbverr3 = [] det3 = [] deterr3 = [] for i in range(len(phase2)): ptuple.append([ phase2[i], sap[i], saperr[i], pdc[i], pdcerr[i], cbv[i], saperr[i], det[i], deterr[i] ]) phsort = sorted(ptuple, key=lambda ph: ph[0]) for i in range(len(phsort)): phase3.append(phsort[i][0]) sap3.append(phsort[i][1]) saperr3.append(phsort[i][2]) pdc3.append(phsort[i][3]) pdcerr3.append(phsort[i][4]) cbv3.append(phsort[i][5]) cbverr3.append(phsort[i][6]) det3.append(phsort[i][7]) deterr3.append(phsort[i][8]) phase3 = array(phase3, 'float32') sap3 = array(sap3, 'float32') saperr3 = array(saperr3, 'float32') pdc3 = array(pdc3, 'float32') pdcerr3 = array(pdcerr3, 'float32') cbv3 = array(cbv3, 'float32') cbverr3 = array(cbverr3, 'float32') det3 = array(det3, 'float32') deterr3 = array(deterr3, 'float32') # bin phases if status == 0 and bindata: work1 = array([sap3[0]], 'float32') work2 = array([saperr3[0]], 'float32') work3 = array([pdc3[0]], 'float32') work4 = array([pdcerr3[0]], 'float32') work5 = array([cbv3[0]], 'float32') work6 = array([cbverr3[0]], 'float32') work7 = array([det3[0]], 'float32') work8 = array([deterr3[0]], 'float32') phase4 = array([], 'float32') sap4 = array([], 'float32') saperr4 = array([], 'float32') pdc4 = array([], 'float32') pdcerr4 = array([], 'float32') cbv4 = array([], 'float32') cbverr4 = array([], 'float32') det4 = array([], 'float32') deterr4 = array([], 'float32') dt = 1.0 / nbins nb = 0.0 rng = numpy.append(phase3, phase3[0] + 1.0) for i in range(len(rng)): if rng[i] < nb * dt or rng[i] >= (nb + 1.0) * dt: if len(work1) > 0: phase4 = append(phase4, (nb + 0.5) * dt) if (binmethod == 'mean'): sap4 = append(sap4, kepstat.mean(work1)) saperr4 = append(saperr4, kepstat.mean_err(work2)) pdc4 = append(pdc4, kepstat.mean(work3)) pdcerr4 = append(pdcerr4, kepstat.mean_err(work4)) cbv4 = append(cbv4, kepstat.mean(work5)) cbverr4 = append(cbverr4, kepstat.mean_err(work6)) det4 = append(det4, kepstat.mean(work7)) deterr4 = append(deterr4, kepstat.mean_err(work8)) elif (binmethod == 'median'): sap4 = append(sap4, kepstat.median(work1, logfile)) saperr4 = append(saperr4, kepstat.mean_err(work2)) pdc4 = append(pdc4, kepstat.median(work3, logfile)) pdcerr4 = append(pdcerr4, kepstat.mean_err(work4)) cbv4 = append(cbv4, kepstat.median(work5, logfile)) cbverr4 = append(cbverr4, kepstat.mean_err(work6)) det4 = append(det4, kepstat.median(work7, logfile)) deterr4 = append(deterr4, kepstat.mean_err(work8)) else: coeffs, errors, covar, iiter, sigma, chi2, dof, fit, plotx, ploty, status = \ kepfit.lsqclip('poly0',[scipy.stats.nanmean(work1)],arange(0.0,float(len(work1)),1.0),work1,work2, threshold,threshold,niter,logfile,False) sap4 = append(sap4, coeffs[0]) saperr4 = append(saperr4, kepstat.mean_err(work2)) coeffs, errors, covar, iiter, sigma, chi2, dof, fit, plotx, ploty, status = \ kepfit.lsqclip('poly0',[scipy.stats.nanmean(work3)],arange(0.0,float(len(work3)),1.0),work3,work4, threshold,threshold,niter,logfile,False) pdc4 = append(pdc4, coeffs[0]) pdcerr4 = append(pdcerr4, kepstat.mean_err(work4)) coeffs, errors, covar, iiter, sigma, chi2, dof, fit, plotx, ploty, status = \ kepfit.lsqclip('poly0',[scipy.stats.nanmean(work5)],arange(0.0,float(len(work5)),1.0),work5,work6, threshold,threshold,niter,logfile,False) cbv4 = append(cbv4, coeffs[0]) cbverr4 = append(cbverr4, kepstat.mean_err(work6)) coeffs, errors, covar, iiter, sigma, chi2, dof, fit, plotx, ploty, status = \ kepfit.lsqclip('poly0',[scipy.stats.nanmean(work7)],arange(0.0,float(len(work7)),1.0),work7,work8, threshold,threshold,niter,logfile,False) det4 = append(det4, coeffs[0]) deterr4 = append(deterr4, kepstat.mean_err(work8)) work1 = array([], 'float32') work2 = array([], 'float32') work3 = array([], 'float32') work4 = array([], 'float32') work5 = array([], 'float32') work6 = array([], 'float32') work7 = array([], 'float32') work8 = array([], 'float32') nb += 1.0 else: work1 = append(work1, sap3[i]) work2 = append(work2, saperr3[i]) work3 = append(work3, pdc3[i]) work4 = append(work4, pdcerr3[i]) work5 = append(work5, cbv3[i]) work6 = append(work6, cbverr3[i]) work7 = append(work7, det3[i]) work8 = append(work8, deterr3[i]) # update HDU1 for output file if status == 0: cols = (instr[1].columns + ColDefs([Column(name='PHASE', format='E', array=phase1)])) instr[1] = pyfits.new_table(cols) instr[1].header.cards[ 'TTYPE' + str(len(instr[1].columns))].comment = 'column title: phase' instr[1].header.cards[ 'TFORM' + str(len(instr[1].columns))].comment = 'data type: float32' for i in range(len(incards)): if incards[i].key not in list(instr[1].header.keys()): instr[1].header.update(incards[i].key, incards[i].value, incards[i].comment) else: instr[1].header.cards[ incards[i].key].comment = incards[i].comment instr[1].header.update('PERIOD', period, 'period defining the phase [d]') instr[1].header.update('BJD0', phasezero, 'time of phase zero [BJD]') # write new phased data extension for output file if status == 0 and bindata: col1 = Column(name='PHASE', format='E', array=phase4) col2 = Column(name='SAP_FLUX', format='E', unit='e/s', array=sap4 / cadenom) col3 = Column(name='SAP_FLUX_ERR', format='E', unit='e/s', array=saperr4 / cadenom) col4 = Column(name='PDC_FLUX', format='E', unit='e/s', array=pdc4 / cadenom) col5 = Column(name='PDC_FLUX_ERR', format='E', unit='e/s', array=pdcerr4 / cadenom) col6 = Column(name='CBV_FLUX', format='E', unit='e/s', array=cbv4 / cadenom) col7 = Column(name='DET_FLUX', format='E', array=det4 / cadenom) col8 = Column(name='DET_FLUX_ERR', format='E', array=deterr4 / cadenom) cols = ColDefs([col1, col2, col3, col4, col5, col6, col7, col8]) instr.append(new_table(cols)) instr[-1].header.cards['TTYPE1'].comment = 'column title: phase' instr[-1].header.cards[ 'TTYPE2'].comment = 'column title: simple aperture photometry' instr[-1].header.cards[ 'TTYPE3'].comment = 'column title: SAP 1-sigma error' instr[-1].header.cards[ 'TTYPE4'].comment = 'column title: pipeline conditioned photometry' instr[-1].header.cards[ 'TTYPE5'].comment = 'column title: PDC 1-sigma error' instr[-1].header.cards[ 'TTYPE6'].comment = 'column title: cotrended basis vector photometry' instr[-1].header.cards[ 'TTYPE7'].comment = 'column title: Detrended aperture photometry' instr[-1].header.cards[ 'TTYPE8'].comment = 'column title: DET 1-sigma error' instr[-1].header.cards['TFORM1'].comment = 'column type: float32' instr[-1].header.cards['TFORM2'].comment = 'column type: float32' instr[-1].header.cards['TFORM3'].comment = 'column type: float32' instr[-1].header.cards['TFORM4'].comment = 'column type: float32' instr[-1].header.cards['TFORM5'].comment = 'column type: float32' instr[-1].header.cards['TFORM6'].comment = 'column type: float32' instr[-1].header.cards['TFORM7'].comment = 'column type: float32' instr[-1].header.cards['TFORM8'].comment = 'column type: float32' instr[-1].header.cards[ 'TUNIT2'].comment = 'column units: electrons per second' instr[-1].header.cards[ 'TUNIT3'].comment = 'column units: electrons per second' instr[-1].header.cards[ 'TUNIT4'].comment = 'column units: electrons per second' instr[-1].header.cards[ 'TUNIT5'].comment = 'column units: electrons per second' instr[-1].header.cards[ 'TUNIT6'].comment = 'column units: electrons per second' instr[-1].header.update('EXTNAME', 'FOLDED', 'extension name') instr[-1].header.update('PERIOD', period, 'period defining the phase [d]') instr[-1].header.update('BJD0', phasezero, 'time of phase zero [BJD]') instr[-1].header.update('BINMETHD', binmethod, 'phase binning method') if binmethod == 'sigclip': instr[-1].header.update('THRSHOLD', threshold, 'sigma-clipping threshold [sigma]') instr[-1].header.update('NITER', niter, 'max number of sigma-clipping iterations') # history keyword in output file if status == 0: status = kepkey.history(call, instr[0], outfile, logfile, verbose) instr.writeto(outfile) # clean up x-axis unit if status == 0: ptime1 = array([], 'float32') ptime2 = array([], 'float32') pout1 = array([], 'float32') pout2 = array([], 'float32') if bindata: work = sap4 if plottype == 'pdc': work = pdc4 if plottype == 'cbv': work = cbv4 if plottype == 'det': work = det4 for i in range(len(phase4)): if (phase4[i] > 0.5): ptime2 = append(ptime2, phase4[i] - 1.0) pout2 = append(pout2, work[i]) ptime2 = append(ptime2, phase4) pout2 = append(pout2, work) for i in range(len(phase4)): if (phase4[i] <= 0.5): ptime2 = append(ptime2, phase4[i] + 1.0) pout2 = append(pout2, work[i]) work = sap3 if plottype == 'pdc': work = pdc3 if plottype == 'cbv': work = cbv3 if plottype == 'det': work = det3 for i in range(len(phase3)): if (phase3[i] > 0.5): ptime1 = append(ptime1, phase3[i] - 1.0) pout1 = append(pout1, work[i]) ptime1 = append(ptime1, phase3) pout1 = append(pout1, work) for i in range(len(phase3)): if (phase3[i] <= 0.5): ptime1 = append(ptime1, phase3[i] + 1.0) pout1 = append(pout1, work[i]) xlab = 'Orbital Phase ($\phi$)' # clean up y-axis units if status == 0: nrm = len(str(int(pout1[isfinite(pout1)].max()))) - 1 pout1 = pout1 / 10**nrm pout2 = pout2 / 10**nrm if nrm == 0: ylab = plotlab else: ylab = '10$^%d$ %s' % (nrm, plotlab) # data limits xmin = ptime1.min() xmax = ptime1.max() ymin = pout1[isfinite(pout1)].min() ymax = pout1[isfinite(pout1)].max() xr = xmax - xmin yr = ymax - ymin ptime1 = insert(ptime1, [0], [ptime1[0]]) ptime1 = append(ptime1, [ptime1[-1]]) pout1 = insert(pout1, [0], [0.0]) pout1 = append(pout1, 0.0) if bindata: ptime2 = insert(ptime2, [0], ptime2[0] - 1.0 / nbins) ptime2 = insert(ptime2, [0], ptime2[0]) ptime2 = append( ptime2, [ptime2[-1] + 1.0 / nbins, ptime2[-1] + 1.0 / nbins]) pout2 = insert(pout2, [0], [pout2[-1]]) pout2 = insert(pout2, [0], [0.0]) pout2 = append(pout2, [pout2[2], 0.0]) # plot new light curve if status == 0 and plottype != 'none': try: params = { 'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight': 'bold', 'text.fontsize': 18, 'legend.fontsize': 18, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize } pylab.rcParams.update(params) except: print('ERROR -- KEPFOLD: install latex for scientific plotting') status = 1 if status == 0 and plottype != 'none': pylab.figure(figsize=[17, 7]) pylab.clf() ax = pylab.axes([0.06, 0.11, 0.93, 0.86]) pylab.gca().xaxis.set_major_formatter( pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter( pylab.ScalarFormatter(useOffset=False)) labels = ax.get_yticklabels() setp(labels, 'rotation', 90) if bindata: pylab.fill(ptime2, pout2, color=fcolor, linewidth=0.0, alpha=falpha) else: if 'det' in plottype: pylab.fill(ptime1, pout1, color=fcolor, linewidth=0.0, alpha=falpha) pylab.plot(ptime1, pout1, color=lcolor, linestyle='', linewidth=lwidth, marker='.') if bindata: pylab.plot(ptime2[1:-1], pout2[1:-1], color='r', linestyle='-', linewidth=lwidth, marker='') xlabel(xlab, {'color': 'k'}) ylabel(ylab, {'color': 'k'}) xlim(-0.49999, 1.49999) if ymin >= 0.0: ylim(ymin - yr * 0.01, ymax + yr * 0.01) # ylim(0.96001,1.03999) else: ylim(1.0e-10, ymax + yr * 0.01) grid() if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() # close input file if status == 0: status = kepio.closefits(instr, logfile, verbose) # stop time kepmsg.clock('KEPFOLD ended at: ', logfile, verbose)
def kepsmooth(infile,outfile,datacol,function,fscale,plot,plotlab, clobber,verbose,logfile,status, cmdLine=False): ## startup parameters status = 0 labelsize = 24 ticksize = 16 xsize = 18 ysize = 6 lcolor = '#0000ff' lwidth = 1.0 fcolor = '#ffff00' falpha = 0.2 ## log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPSMOOTH -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'datacol='+str(datacol)+' ' call += 'function='+str(function)+' ' call += 'fscale='+str(fscale)+' ' plotit = 'n' if (plot): plotit = 'y' call += 'plot='+plotit+ ' ' call += 'plotlab='+str(plotlab)+' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber='+overwrite+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) ## start time kepmsg.clock('KEPSMOOTH started at',logfile,verbose) ## test log file logfile = kepmsg.test(logfile) ## clobber output file if clobber: status = kepio.clobber(outfile,logfile,verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPSMOOTH: ' + outfile + ' exists. Use clobber=yes' status = kepmsg.err(logfile,message,verbose) ## open input file if status == 0: instr, status = kepio.openfits(infile,'readonly',logfile,verbose) tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr,infile,logfile,verbose,status) if cadence == 0.0: tstart, tstop, ncad, cadence, status = kepio.cadence(instr,infile,logfile,verbose,status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence ## fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr,file,logfile,verbose) ## read table structure if status == 0: table, status = kepio.readfitstab(infile,instr[1],logfile,verbose) # read time and flux columns if status == 0: barytime, status = kepio.readtimecol(infile,table,logfile,verbose) if status == 0: flux, status = kepio.readfitscol(infile,instr[1].data,datacol,logfile,verbose) # filter input data table if status == 0: try: nanclean = instr[1].header['NANCLEAN'] except: naxis2 = 0 for i in range(len(table.field(0))): if (numpy.isfinite(barytime[i]) and numpy.isfinite(flux[i]) and flux[i] != 0.0): table[naxis2] = table[i] naxis2 += 1 instr[1].data = table[:naxis2] comment = 'NaN cadences removed from data' status = kepkey.new('NANCLEAN',True,comment,instr[1],outfile,logfile,verbose) ## read table columns if status == 0: try: intime = instr[1].data.field('barytime') except: intime, status = kepio.readfitscol(infile,instr[1].data,'time',logfile,verbose) indata, status = kepio.readfitscol(infile,instr[1].data,datacol,logfile,verbose) if status == 0: intime = intime + bjdref indata = indata / cadenom ## smooth data if status == 0: outdata = kepfunc.smooth(indata,fscale/(cadence/86400),function) ## comment keyword in output file if status == 0: status = kepkey.history(call,instr[0],outfile,logfile,verbose) ## clean up x-axis unit if status == 0: intime0 = float(int(tstart / 100) * 100.0) if intime0 < 2.4e6: intime0 += 2.4e6 ptime = intime - intime0 xlab = 'BJD $-$ %d' % intime0 ## clean up y-axis units if status == 0: pout = indata * 1.0 pout2 = outdata * 1.0 nrm = len(str(int(numpy.nanmax(pout))))-1 pout = pout / 10**nrm pout2 = pout2 / 10**nrm ylab = '10$^%d$ %s' % (nrm, re.sub('_','-',plotlab)) ## data limits xmin = numpy.nanmin(ptime) xmax = numpy.nanmax(ptime) ymin = numpy.min(pout) ymax = numpy.nanmax(pout) xr = xmax - xmin yr = ymax - ymin ptime = insert(ptime,[0],[ptime[0]]) ptime = append(ptime,[ptime[-1]]) pout = insert(pout,[0],[0.0]) pout = append(pout,0.0) pout2 = insert(pout2,[0],[0.0]) pout2 = append(pout2,0.0) ## plot light curve if status == 0 and plot: try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} rcParams.update(params) except: print 'ERROR -- KEPSMOOTH: install latex for scientific plotting' status = 1 if status == 0 and plot: pylab.figure(1,figsize=[xsize,ysize]) # delete any fossil plots in the matplotlib window pylab.clf() # position axes inside the plotting window ax = pylab.subplot(111) pylab.subplots_adjust(0.06,0.1,0.93,0.88) # force tick labels to be absolute rather than relative pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) # rotate y labels by 90 deg labels = ax.get_yticklabels() setp(labels, 'rotation', 90) pylab.plot(ptime[1:-1],pout[1:-1],color='#ff9900',linestyle='-',linewidth=lwidth) fill(ptime,pout,color=fcolor,linewidth=0.0,alpha=falpha) pylab.plot(ptime,pout2,color=lcolor,linestyle='-',linewidth=lwidth*4.0) pylab.xlabel(xlab, {'color' : 'k'}) pylab.ylabel(ylab, {'color' : 'k'}) xlim(xmin-xr*0.01,xmax+xr*0.01) if ymin >= 0.0: ylim(ymin-yr*0.01,ymax+yr*0.01) else: ylim(1.0e-10,ymax+yr*0.01) pylab.grid() # render plot if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() ## write output file if status == 0: for i in range(len(outdata)): instr[1].data.field(datacol)[i] = outdata[i] instr.writeto(outfile) ## close input file if status == 0: status = kepio.closefits(instr,logfile,verbose) ## end time if (status == 0): message = 'KEPSMOOTH completed at' else: message = '\nKEPSMOOTH aborted at' kepmsg.clock(message,logfile,verbose)
def kepclip(infile,outfile,ranges,plot,plotcol,clobber,verbose,logfile,status,cmdLine=False): # startup parameters status = 0 labelsize = 32 ticksize = 24 xsize = 18 ysize = 10 lcolor = '#0000ff' lwidth = 1.0 fcolor = '#ffff00' falpha = 0.2 # log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPCLIP -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'ranges='+ranges + ' ' plotit = 'n' if (plot): plotit = 'y' call += 'plot='+plotit+ ' ' call += 'plotcol='+plotcol+ ' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber='+overwrite+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) # start time kepmsg.clock('KEPCLIP started at',logfile,verbose) # test log file logfile = kepmsg.test(logfile) # clobber output file if clobber: status = kepio.clobber(outfile,logfile,verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPCLIP: ' + outfile + ' exists. Use --clobber' status = kepmsg.err(logfile,message,verbose) # time ranges for region if status == 0: t1 = []; t2 = [] t1, t2, status = kepio.timeranges(ranges,logfile,verbose) # open input file if status == 0: instr, status = kepio.openfits(infile,'readonly',logfile,verbose) tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr,infile,logfile,verbose,status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence # fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr,file,logfile,verbose) # input data if status == 0: table = instr[1].data # read time and flux columns if status == 0: barytime, status = kepio.readtimecol(infile,table,logfile,verbose) if status == 0: flux, status = kepio.readfitscol(infile,table,plotcol,logfile,verbose) if status == 0: barytime = barytime + bjdref if 'flux' in plotcol.lower(): flux = flux / cadenom # filter input data table if status == 0: naxis2 = 0 work1 = array([],'float64') work2 = array([],'float32') for i in range(len(barytime)): if (numpy.isfinite(barytime[i]) and numpy.isfinite(flux[i]) and flux[i] != 0.0): reject = False for j in range(len(t1)): if (barytime[i] >= t1[j] and barytime[i] <= t2[j]): reject = True if not reject: table[naxis2] = table[i] work1 = append(work1,barytime[i]) work2 = append(work2,flux[i]) naxis2 += 1 # comment keyword in output file if status == 0: status = kepkey.history(call,instr[0],outfile,logfile,verbose) # write output file if status == 0: instr[1].data = table[:naxis2] comment = 'NaN cadences removed from data' status = kepkey.new('NANCLEAN',True,comment,instr[1],outfile,logfile,verbose) instr.writeto(outfile) # clean up x-axis unit if status == 0: barytime0 = float(int(tstart / 100) * 100.0) barytime = work1 - barytime0 xlab = 'BJD $-$ %d' % barytime0 # clean up y-axis units if status == 0: try: nrm = len(str(int(work2.max())))-1 except: nrm = 0 flux = work2 / 10**nrm ylab = '10$^%d$ e$^-$ s$^{-1}$' % nrm # data limits xmin = barytime.min() xmax = barytime.max() ymin = flux.min() ymax = flux.max() xr = xmax - xmin yr = ymax - ymin # plotting arguments if status == 0 and plot: try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} rcParams.update(params) except: print 'ERROR -- KEPCLIP: install latex for scientific plotting' status = 1 # clear window, plot box if status == 0 and plot: pylab.figure(figsize=[xsize,ysize]) pylab.clf() ax = pylab.axes([0.05,0.1,0.94,0.88]) # force tick labels to be absolute rather than relative pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) # rotate y labels by 90 deg labels = ax.get_yticklabels() setp(labels, 'rotation', 90, fontsize=12) # plot line data ltime = [barytime[0]]; ldata = [flux[0]] for i in range(1,len(flux)): if (barytime[i-1] > barytime[i] - 0.025): ltime.append(barytime[i]) ldata.append(flux[i]) else: ltime = array(ltime, dtype=float64) ldata = array(ldata, dtype=float64) pylab.plot(ltime,ldata,color=lcolor,linestyle='-',linewidth=lwidth) ltime = []; ldata = [] ltime = array(ltime, dtype=float64) ldata = array(ldata, dtype=float64) pylab.plot(ltime,ldata,color=lcolor,linestyle='-',linewidth=lwidth) # plot fill data barytime = insert(barytime,[0],[barytime[0]]) barytime = append(barytime,[barytime[-1]]) flux = insert(flux,[0],[0.0]) flux = append(flux,[0.0]) fill(barytime,flux,fc=fcolor,linewidth=0.0,alpha=falpha) xlim(xmin-xr*0.01,xmax+xr*0.01) if ymin-yr*0.01 <= 0.0: ylim(1.0e-10,ymax+yr*0.01) else: ylim(ymin-yr*0.01,ymax+yr*0.01) xlabel(xlab, {'color' : 'k'}) ylabel(ylab, {'color' : 'k'}) grid() # render plot if status == 0 and plot: if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() # close input file if status == 0: status = kepio.closefits(instr,logfile,verbose) # end time if (status == 0): message = 'KEPCLIP completed at' else: message = '\nKEPCLIP aborted at' kepmsg.clock(message,logfile,verbose)
def keptest(infile,outfile,datacol,ploterr,errcol,quality, lcolor,lwidth,fcolor,falpha,labelsize,ticksize, xsize,ysize,fullrange,plotgrid,verbose,logfile,status): # log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPTEST -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'datacol='+datacol+' ' perr = 'n' if (ploterr): perr = 'y' call += 'ploterr='+perr+ ' ' call += 'errcol='+errcol+' ' qual = 'n' if (quality): qual = 'y' call += 'quality='+qual+ ' ' call += 'lcolor='+str(lcolor)+' ' call += 'lwidth='+str(lwidth)+' ' call += 'fcolor='+str(fcolor)+' ' call += 'falpha='+str(falpha)+' ' call += 'labelsize='+str(labelsize)+' ' call += 'ticksize='+str(ticksize)+' ' call += 'xsize='+str(xsize)+' ' call += 'ysize='+str(ysize)+' ' frange = 'n' if (fullrange): frange = 'y' call += 'fullrange='+frange+ ' ' pgrid = 'n' if (plotgrid): pgrid = 'y' call += 'plotgrid='+pgrid+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) # start time kepmsg.clock('KEPTEST started at',logfile,verbose) # test log file logfile = kepmsg.test(logfile) # open input file if status == 0: struct, status = kepio.openfits(infile,'readonly',logfile,verbose) if status == 0: tstart, tstop, bjdref, cadence, status = kepio.timekeys(struct,infile,logfile,verbose,status) # read table structure if status == 0: table, status = kepio.readfitstab(infile,struct[1],logfile,verbose) # read table columns if status == 0: intime, status = kepio.readtimecol(infile,table,logfile,verbose) #intime += bjdref indata, status = kepio.readfitscol(infile,table,datacol,logfile,verbose) if (ploterr): indataerr, status = kepio.readfitscol(infile,table,errcol,logfile,verbose) if status == 0: gaps = zeros(len(indata)) # read table quality column if status == 0 and quality: try: qualtest = table.field('SAP_QUALITY') except: message = 'ERROR -- KEPTEST: no SAP_QUALITY column found in file ' + infile message += '. Use keptest quality=n' status = kepmsg.err(logfile,message,verbose) if status == 0 and quality: gaps, status = kepio.readfitscol(infile,table,'SAP_QUALITY',logfile,verbose) # close infile if status == 0: status = kepio.closefits(struct,logfile,verbose) # remove infinities and bad data if status == 0: barytime = []; data = []; dataerr = [] if 'ap_raw' in datacol or 'ap_corr' in datacol: cadenom = cadence else: cadenom = 1.0 for i in range(len(intime)): if numpy.isfinite(indata[i]) and indata[i] != 0.0 and gaps[i] == 0: barytime.append(intime[i]) data.append(indata[i] / cadenom) if (ploterr): dataerr.append(indataerr[i]) barytime = numpy.array(barytime,dtype='float64') data = numpy.array(data,dtype='float64') if (ploterr): dataerr = numpy.array(dataerr,dtype='float64') # clean up x-axis unit if status == 0: barytime0 = float(int(tstart / 100) * 100.0) barytime -= barytime0 xlab = 'BJD $-$ %d' % barytime0 # clean up y-axis units try: nrm = len(str(int(data.max())))-1 except: nrm = 0 data = data / 10**nrm ylab1 = '10$^%d$ e$^-$ s$^{-1}$' % nrm # data limits xmin = barytime.min() xmax = barytime.max() ymin = data.min() ymax = data.max() xr = xmax - xmin yr = ymax - ymin data[0] = ymin - yr * 2.0 data[-1] = ymin - yr * 2.0 if fullrange: data[0] = 0.0 data[-1] = 0.0 # define plot formats try: rc('text', usetex=True) rc('font',**{'family':'sans-serif','sans-serif':['sans-serif']}) params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} pylab.rcParams.update(params) except: pass # define size of plot on monitor screen pylab.figure(figsize=[xsize,ysize]) # delete any fossil plots in the matplotlib window pylab.clf() # position axes inside the plotting window ax = pylab.axes([0.06,0.1,0.93,0.88]) # force tick labels to be absolute rather than relative pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) # rotate y labels by 90 deg labels = ax.get_yticklabels() setp(labels, 'rotation', 90, fontsize=12) # plot data time series as an unbroken line, retaining data gaps ltime = []; ldata = []; ldataerr = []; ldatagaps = [] dt = 0 # SVR svr_rbf = SVR(kernel='rbf', C=1, gamma=0.1) svr_lin = SVR(kernel='linear', C=1) svr_poly = SVR(kernel='poly', C=1, degree=2) svr_ltime = []; svr_ldata = [] for i in range(len(indata)): if i > 0: if numpy.isfinite(indata[i]) and indata[i] != 0.0 : # print intime[i], " ", indata[i] ltime.append(intime[i]) ldata.append(indata[i]) svr_ltime.append([intime[i]]) ltime = array(ltime, dtype=float64) ldata = array(ldata, dtype=float64) if len(ldata) > 0 and len(ltime) > 0 : pylab.scatter (ltime, ldata, s=1, color=lcolor, label='Data:Input lightcurve') svr_ltime = array(svr_ltime, dtype='float64') svr_ldata = array(ldata, dtype='float64') svr_ldata_rbf = svr_rbf.fit(svr_ltime, svr_ldata).predict(svr_ltime) ## Get the transits! # Identify the difference of data min. and the regression line # = An approximate initial dip value. ldata_min = min(ldata) ldata_min_i = ldata.tolist().index(ldata_min) fluxdip = svr_ldata_rbf[ldata_min_i] - ldata_min # fluxthresh = (svr_ldata_rbf[ldata_min_i] + ldata_min ) / 2.0 print "ldata min = ", ldata_min, "fluxdip =", fluxdip thresh_x = []; thresh_y = []; # Sequentially scan the inputs, look for y-points below the # initial mean. Group the points i = 0 while i < len(ldata): # print intime[i], " ", indata[i] fluxmin = fluxthresh = svr_ldata_rbf[i] - fluxdip/2.0 if ldata[i] < fluxthresh: thresh_y.append(fluxthresh); thresh_x.append(ltime[i]) # Identify the local min, calculate difference with regression line. while i < len(ldata) and ldata[i] < fluxthresh : if ldata[i] < fluxmin: fluxmin = ldata[i] fluxmin_i = i i += 1 # We got the local min, now plot the line, # converge the dip value with the newly calculated one. pylab.plot([ ltime[fluxmin_i], ltime[fluxmin_i] ], [ ldata[fluxmin_i], svr_ldata_rbf[fluxmin_i] ], 'r-', linewidth=1) fluxdip = (fluxdip + svr_ldata_rbf[fluxmin_i] - fluxmin)/2.0 i += 1 pylab.plot(thresh_x, thresh_y, c='c', label='Adapted transit threshold') pylab.scatter(thresh_x, thresh_y, c='k', s=1) pylab.plot(svr_ltime, svr_ldata_rbf, c='g', label='Cum. RBF model') if (ploterr): ldataerr = numpy.array(ldataerr,dtype='float32') # plot labels pylab.xlabel(xlab, {'color' : 'k'}) try: pylab.ylabel(ylab1, {'color' : 'k'}) except: ylab1 = '10**%d e-/s' % nrm pylab.ylabel(ylab1, {'color' : 'k'}) # make grid on plot if plotgrid: pylab.grid() # paint plot into window pylab.legend() pylab.draw() # save plot to file if status == 0 and outfile.lower() != 'none': pylab.savefig(outfile)
def keprange(infile,rinfile,outfile,column,clobber,verbose,logfile,status,cLine=False): # startup parameters status = 0 global instr, cadence, barytime0, nrm, barytime, flux global xmin, xmax, ymin, ymax, xr, yr, xlab, ylab global clobb, outf, verb, logf, rinf, col, bjdref, cade, cmdLine # log the call if rinfile.lower() == 'none': rinfile = '' hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPRANGE -- ' call += 'infile='+infile+' ' call += 'rinfile='+rinfile+' ' call += 'outfile='+outfile+' ' call += 'column='+column+' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber='+overwrite+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) clobb = clobber outf = outfile verb = verbose logf = logfile rinf = rinfile cmdLine = cLine # start time kepmsg.clock('KEPRANGE started at: ',logfile,verbose) # test log file logfile = kepmsg.test(logfile) # clobber output file if clobber: status = kepio.clobber(outfile,logfile,verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPRANGE: ' + outfile + ' exists. Use --clobber' status = kepmsg.err(logfile,message,verbose) ## open input file if status == 0: instr, status = kepio.openfits(infile,'readonly',logfile,verbose) if status == 0: tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr,infile,logfile,verbose,status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence cade = cadenom # fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr,infile,logfile,verbose) # input data if status == 0: table = instr[1].data # filter out NaNs work1 = []; work2 = [] col = column if status == 0: barytime, status = kepio.readtimecol(infile,table,logfile,verbose) if status == 0: try: flux = instr[1].data.field(col) except: message = 'ERROR -- KEPRANGE: no column named ' + col + ' in table ' + infile + '[1]' status = kepmsg.err(file,message,verbose) if status == 0: for i in range(len(barytime)): if (numpy.isfinite(barytime[i]) and numpy.isfinite(flux[i]) and flux[i] != 0.0): work1.append(barytime[i] + bjdref) work2.append(flux[i]) barytime = array(work1,dtype='float64') flux = array(work2,dtype='float32') / cadenom # clean up x-axis unit if status == 0: barytime0 = float(int(tstart / 100) * 100.0) barytime = barytime - barytime0 xlab = 'BJD $-$ %d' % barytime0 # clean up y-axis units if status == 0: nrm = len(str(int(flux.max())))-1 flux = flux / 10**nrm ylab = '10$^%d$ e$^-$ s$^{-1}$' % nrm # data limits xmin = barytime.min() xmax = barytime.max() ymin = flux.min() ymax = flux.max() xr = xmax - xmin yr = ymax - ymin flux[0] = 0.0 flux[-1] = 0.0 # plot new light curve if status == 0: try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} pylab.rcParams.update(params) except: print 'ERROR -- KEPRANGE: install latex for scientific plotting' status = 1 if status == 0: pylab.figure(figsize=[xsize,ysize]) pylab.clf() plotlc(cmdLine) # close input file if status == 0: status = kepio.closefits(instr,logfile,verbose)
def kepdynamic(infile, outfile, fcol, pmin, pmax, nfreq, deltat, nslice, plot, plotscale, cmap, clobber, verbose, logfile, status, cmdLine=False): # startup parameters status = 0 labelsize = 24 ticksize = 16 xsize = 12 ysize = 6 lcolor = '#0000ff' lwidth = 1.0 fcolor = '#ffff00' falpha = 0.2 numpy.seterr(all="ignore") # log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile, hashline, verbose) call = 'KEPDYNAMIC -- ' call += 'infile=' + infile + ' ' call += 'outfile=' + outfile + ' ' call += 'fcol=' + fcol + ' ' call += 'pmin=' + str(pmin) + ' ' call += 'pmax=' + str(pmax) + ' ' call += 'nfreq=' + str(nfreq) + ' ' call += 'deltat=' + str(deltat) + ' ' call += 'nslice=' + str(nslice) + ' ' plotit = 'n' if (plot): plotit = 'y' call += 'plot=' + plotit + ' ' call += 'plotscale=' + plotscale + ' ' call += 'cmap=' + str(cmap) + ' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber=' + overwrite + ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose=' + chatter + ' ' call += 'logfile=' + logfile kepmsg.log(logfile, call + '\n', verbose) # start time kepmsg.clock('Start time is', logfile, verbose) # test log file logfile = kepmsg.test(logfile) # error checking if status == 0 and pmin >= pmax: message = 'ERROR -- KEPDYNAMIC: PMIN must be less than PMAX' status = kepmsg.err(logfile, message, verbose) # clobber output file if clobber: status = kepio.clobber(outfile, logfile, verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPDYNAMIC: ' + outfile + ' exists. Use clobber' status = kepmsg.err(logfile, message, verbose) # plot color map if status == 0 and cmap == 'browse': status = keplab.cmap_plot() # open input file if status == 0: instr, status = kepio.openfits(infile, 'readonly', logfile, verbose) if status == 0: tstart, tstop, bjdref, cadence, status = kepio.timekeys( instr, infile, logfile, verbose, status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence # fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr, file, logfile, verbose) # read table columns if status == 0: barytime, status = kepio.readtimecol(infile, instr[1].data, logfile, verbose) if status == 0: signal, status = kepio.readfitscol(infile, instr[1].data, fcol, logfile, verbose) if status == 0: barytime = barytime + bjdref signal = signal / cadenom # remove infinite data from time series if status == 0: incols = [barytime, signal] outcols = kepstat.removeinfinlc(signal, incols) barytime = outcols[0] signal = outcols[1] # period to frequency conversion if status == 0: fmin = 1.0 / pmax fmax = 1.0 / pmin deltaf = (fmax - fmin) / nfreq # determine bounds of time slices if status == 0: t1 = [] t2 = [] dt = barytime[-1] - barytime[0] dt -= deltat if dt < 0: message = 'ERROR -- KEPDYNAMIC: time slices are larger than data range' status = kepmsg.err(logfile, message, verbose) ds = dt / (nslice - 1) for i in range(nslice): t1.append(barytime[0] + ds * float(i)) t2.append(barytime[0] + deltat + ds * float(i)) # loop through time slices if status == 0: dynam = [] for i in range(nslice): x = [] y = [] for j in range(len(barytime)): if (barytime[j] >= t1[i] and barytime[j] <= t2[i]): x.append(barytime[j]) y.append(signal[j]) x = array(x, dtype='float64') y = array(y, dtype='float32') y = y - median(y) # determine FT power fr, power = kepfourier.ft(x, y, fmin, fmax, deltaf, False) for j in range(len(power)): dynam.append(power[j]) print('Timeslice: %.4f Pmax: %.2E' % ((t2[i] + t1[i]) / 2, power.max())) # define shape of results array dynam = array(dynam, dtype='float64') dynam.shape = len(t1), len(power) # write output file if status == 0: instr.append(ImageHDU()) instr[-1].data = dynam.transpose() instr[-1].header.update('EXTNAME', 'DYNAMIC FT', 'extension name') instr[-1].header.update('WCSAXES', 2, 'number of WCS axes') instr[-1].header.update('CRPIX1', 0.5, 'reference pixel along axis 1') instr[-1].header.update('CRPIX2', 0.5, 'reference pixel along axis 2') instr[-1].header.update('CRVAL1', t1[0], 'time at reference pixel (BJD)') instr[-1].header.update('CRVAL2', fmin, 'frequency at reference pixel (1/day)') instr[-1].header.update('CDELT1', (barytime[-1] - barytime[0]) / nslice, 'pixel scale in dimension 1 (days)') instr[-1].header.update('CDELT2', deltaf, 'pixel scale in dimension 2 (1/day)') instr[-1].header.update('CTYPE1', 'BJD', 'data type of dimension 1') instr[-1].header.update('CTYPE2', 'FREQUENCY', 'data type of dimension 2') instr.writeto(outfile) # history keyword in output file if status == 0: status = kepkey.history(call, instr[0], outfile, logfile, verbose) # close input file if status == 0: status = kepio.closefits(instr, logfile, verbose) # clean up x-axis unit if status == 0: time0 = float(int(barytime[0] / 100) * 100.0) barytime = barytime - time0 xlab = 'BJD $-$ %d' % time0 # image intensity min and max if status == 0: if 'rithmic' in plotscale: dynam = numpy.log10(dynam) elif 'sq' in plotscale: dynam = numpy.sqrt(dynam) elif 'logoflog' in plotscale: dynam = numpy.log10(numpy.abs(numpy.log10(dynam))) # dynam = -dynam nstat = 2 pixels = [] for i in range(dynam.shape[0]): for j in range(dynam.shape[1]): pixels.append(dynam[i, j]) pixels = array(sort(pixels), dtype=float32) if int(float(len(pixels)) * 0.1 + 0.5) > nstat: nstat = int(float(len(pixels)) * 0.1 + 0.5) zmin = median(pixels[:nstat]) zmax = median(pixels[-1:]) if isnan(zmax): zmax = median(pixels[-nstat / 2:]) if isnan(zmax): zmax = numpy.nanmax(pixels) # plot power spectrum if status == 0 and plot: params = { 'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight': 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize } rcParams.update(params) pylab.figure(1, figsize=[xsize, ysize]) pylab.clf() pylab.axes([0.08, 0.113, 0.91, 0.86]) dynam = dynam.transpose() pylab.imshow(dynam, origin='lower', aspect='auto', cmap=cmap, vmin=zmin, vmax=zmax, extent=[barytime[0], barytime[-1], fmin, fmax], interpolation='bilinear') xlabel(xlab, {'color': 'k'}) ylabel(r'Frequency (d$^{-1}$)', {'color': 'k'}) grid() pylab.savefig(re.sub('\.\S+', '.png', outfile), dpi=100) # render plot if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() return status ## end time if (status == 0): message = 'KEPDYNAMIC completed at' else: message = '\nKEPDYNAMIC aborted at' kepmsg.clock(message, logfile, verbose)
def kepfold(infile,outfile,period,phasezero,bindata,binmethod,threshold,niter,nbins, rejqual,plottype,plotlab,clobber,verbose,logfile,status,cmdLine=False): # startup parameters status = 0 labelsize = 32; ticksize = 18; xsize = 18; ysize = 10 lcolor = '#0000ff'; lwidth = 2.0; fcolor = '#ffff00'; falpha = 0.2 # log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPFOLD -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'period='+str(period)+' ' call += 'phasezero='+str(phasezero)+' ' binit = 'n' if (bindata): binit = 'y' call += 'bindata='+binit+' ' call += 'binmethod='+binmethod+' ' call += 'threshold='+str(threshold)+' ' call += 'niter='+str(niter)+' ' call += 'nbins='+str(nbins)+' ' qflag = 'n' if (rejqual): qflag = 'y' call += 'rejqual='+qflag+ ' ' call += 'plottype='+plottype+ ' ' call += 'plotlab='+plotlab+ ' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber='+overwrite+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) # start time kepmsg.clock('KEPFOLD started at',logfile,verbose) # test log file logfile = kepmsg.test(logfile) # clobber output file if clobber: status = kepio.clobber(outfile,logfile,verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPFOLD: ' + outfile + ' exists. Use --clobber' status = kepmsg.err(logfile,message,verbose) # open input file if status == 0: instr, status = kepio.openfits(infile,'readonly',logfile,verbose) if status == 0: tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr,infile,logfile,verbose,status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence # fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr,file,logfile,verbose) # input data if status == 0: table = instr[1].data incards = instr[1].header.cards try: sap = instr[1].data.field('SAP_FLUX') except: try: sap = instr[1].data.field('ap_raw_flux') except: sap = zeros(len(table.field(0))) try: saperr = instr[1].data.field('SAP_FLUX_ERR') except: try: saperr = instr[1].data.field('ap_raw_err') except: saperr = zeros(len(table.field(0))) try: pdc = instr[1].data.field('PDCSAP_FLUX') except: try: pdc = instr[1].data.field('ap_corr_flux') except: pdc = zeros(len(table.field(0))) try: pdcerr = instr[1].data.field('PDCSAP_FLUX_ERR') except: try: pdcerr = instr[1].data.field('ap_corr_err') except: pdcerr = zeros(len(table.field(0))) try: cbv = instr[1].data.field('CBVSAP_FLUX') except: cbv = zeros(len(table.field(0))) if 'cbv' in plottype: txt = 'ERROR -- KEPFOLD: CBVSAP_FLUX column is not populated. Use kepcotrend' status = kepmsg.err(logfile,txt,verbose) try: det = instr[1].data.field('DETSAP_FLUX') except: det = zeros(len(table.field(0))) if 'det' in plottype: txt = 'ERROR -- KEPFOLD: DETSAP_FLUX column is not populated. Use kepflatten' status = kepmsg.err(logfile,txt,verbose) try: deterr = instr[1].data.field('DETSAP_FLUX_ERR') except: deterr = zeros(len(table.field(0))) if 'det' in plottype: txt = 'ERROR -- KEPFOLD: DETSAP_FLUX_ERR column is not populated. Use kepflatten' status = kepmsg.err(logfile,txt,verbose) try: quality = instr[1].data.field('SAP_QUALITY') except: quality = zeros(len(table.field(0))) if qualflag: txt = 'WARNING -- KEPFOLD: Cannot find a QUALITY data column' kepmsg.warn(logfile,txt) if status == 0: barytime, status = kepio.readtimecol(infile,table,logfile,verbose) barytime1 = copy(barytime) # filter out NaNs and quality > 0 work1 = []; work2 = []; work3 = []; work4 = []; work5 = []; work6 = []; work8 = []; work9 = [] if status == 0: if 'sap' in plottype: datacol = copy(sap) errcol = copy(saperr) if 'pdc' in plottype: datacol = copy(pdc) errcol = copy(pdcerr) if 'cbv' in plottype: datacol = copy(cbv) errcol = copy(saperr) if 'det' in plottype: datacol = copy(det) errcol = copy(deterr) for i in range(len(barytime)): if (numpy.isfinite(barytime[i]) and numpy.isfinite(datacol[i]) and datacol[i] != 0.0 and numpy.isfinite(errcol[i]) and errcol[i] > 0.0): if rejqual and quality[i] == 0: work1.append(barytime[i]) work2.append(sap[i]) work3.append(saperr[i]) work4.append(pdc[i]) work5.append(pdcerr[i]) work6.append(cbv[i]) work8.append(det[i]) work9.append(deterr[i]) elif not rejqual: work1.append(barytime[i]) work2.append(sap[i]) work3.append(saperr[i]) work4.append(pdc[i]) work5.append(pdcerr[i]) work6.append(cbv[i]) work8.append(det[i]) work9.append(deterr[i]) barytime = array(work1,dtype='float64') sap = array(work2,dtype='float32') / cadenom saperr = array(work3,dtype='float32') / cadenom pdc = array(work4,dtype='float32') / cadenom pdcerr = array(work5,dtype='float32') / cadenom cbv = array(work6,dtype='float32') / cadenom det = array(work8,dtype='float32') / cadenom deterr = array(work9,dtype='float32') / cadenom # calculate phase if status == 0: if phasezero < bjdref: phasezero += bjdref date1 = (barytime1 + bjdref - phasezero) phase1 = (date1 / period) - floor(date1/period) date2 = (barytime + bjdref - phasezero) phase2 = (date2 / period) - floor(date2/period) phase2 = array(phase2,'float32') # sort phases if status == 0: ptuple = [] phase3 = []; sap3 = []; saperr3 = [] pdc3 = []; pdcerr3 = [] cbv3 = []; cbverr3 = [] det3 = []; deterr3 = [] for i in range(len(phase2)): ptuple.append([phase2[i], sap[i], saperr[i], pdc[i], pdcerr[i], cbv[i], saperr[i], det[i], deterr[i]]) phsort = sorted(ptuple,key=lambda ph: ph[0]) for i in range(len(phsort)): phase3.append(phsort[i][0]) sap3.append(phsort[i][1]) saperr3.append(phsort[i][2]) pdc3.append(phsort[i][3]) pdcerr3.append(phsort[i][4]) cbv3.append(phsort[i][5]) cbverr3.append(phsort[i][6]) det3.append(phsort[i][7]) deterr3.append(phsort[i][8]) phase3 = array(phase3,'float32') sap3 = array(sap3,'float32') saperr3 = array(saperr3,'float32') pdc3 = array(pdc3,'float32') pdcerr3 = array(pdcerr3,'float32') cbv3 = array(cbv3,'float32') cbverr3 = array(cbverr3,'float32') det3 = array(det3,'float32') deterr3 = array(deterr3,'float32') # bin phases if status == 0 and bindata: work1 = array([sap3[0]],'float32') work2 = array([saperr3[0]],'float32') work3 = array([pdc3[0]],'float32') work4 = array([pdcerr3[0]],'float32') work5 = array([cbv3[0]],'float32') work6 = array([cbverr3[0]],'float32') work7 = array([det3[0]],'float32') work8 = array([deterr3[0]],'float32') phase4 = array([],'float32') sap4 = array([],'float32') saperr4 = array([],'float32') pdc4 = array([],'float32') pdcerr4 = array([],'float32') cbv4 = array([],'float32') cbverr4 = array([],'float32') det4 = array([],'float32') deterr4 = array([],'float32') dt = 1.0 / nbins nb = 0.0 rng = numpy.append(phase3,phase3[0]+1.0) for i in range(len(rng)): if rng[i] < nb * dt or rng[i] >= (nb + 1.0) * dt: if len(work1) > 0: phase4 = append(phase4,(nb + 0.5) * dt) if (binmethod == 'mean'): sap4 = append(sap4,kepstat.mean(work1)) saperr4 = append(saperr4,kepstat.mean_err(work2)) pdc4 = append(pdc4,kepstat.mean(work3)) pdcerr4 = append(pdcerr4,kepstat.mean_err(work4)) cbv4 = append(cbv4,kepstat.mean(work5)) cbverr4 = append(cbverr4,kepstat.mean_err(work6)) det4 = append(det4,kepstat.mean(work7)) deterr4 = append(deterr4,kepstat.mean_err(work8)) elif (binmethod == 'median'): sap4 = append(sap4,kepstat.median(work1,logfile)) saperr4 = append(saperr4,kepstat.mean_err(work2)) pdc4 = append(pdc4,kepstat.median(work3,logfile)) pdcerr4 = append(pdcerr4,kepstat.mean_err(work4)) cbv4 = append(cbv4,kepstat.median(work5,logfile)) cbverr4 = append(cbverr4,kepstat.mean_err(work6)) det4 = append(det4,kepstat.median(work7,logfile)) deterr4 = append(deterr4,kepstat.mean_err(work8)) else: coeffs, errors, covar, iiter, sigma, chi2, dof, fit, plotx, ploty, status = \ kepfit.lsqclip('poly0',[scipy.stats.nanmean(work1)],arange(0.0,float(len(work1)),1.0),work1,work2, threshold,threshold,niter,logfile,False) sap4 = append(sap4,coeffs[0]) saperr4 = append(saperr4,kepstat.mean_err(work2)) coeffs, errors, covar, iiter, sigma, chi2, dof, fit, plotx, ploty, status = \ kepfit.lsqclip('poly0',[scipy.stats.nanmean(work3)],arange(0.0,float(len(work3)),1.0),work3,work4, threshold,threshold,niter,logfile,False) pdc4 = append(pdc4,coeffs[0]) pdcerr4 = append(pdcerr4,kepstat.mean_err(work4)) coeffs, errors, covar, iiter, sigma, chi2, dof, fit, plotx, ploty, status = \ kepfit.lsqclip('poly0',[scipy.stats.nanmean(work5)],arange(0.0,float(len(work5)),1.0),work5,work6, threshold,threshold,niter,logfile,False) cbv4 = append(cbv4,coeffs[0]) cbverr4 = append(cbverr4,kepstat.mean_err(work6)) coeffs, errors, covar, iiter, sigma, chi2, dof, fit, plotx, ploty, status = \ kepfit.lsqclip('poly0',[scipy.stats.nanmean(work7)],arange(0.0,float(len(work7)),1.0),work7,work8, threshold,threshold,niter,logfile,False) det4 = append(det4,coeffs[0]) deterr4 = append(deterr4,kepstat.mean_err(work8)) work1 = array([],'float32') work2 = array([],'float32') work3 = array([],'float32') work4 = array([],'float32') work5 = array([],'float32') work6 = array([],'float32') work7 = array([],'float32') work8 = array([],'float32') nb += 1.0 else: work1 = append(work1,sap3[i]) work2 = append(work2,saperr3[i]) work3 = append(work3,pdc3[i]) work4 = append(work4,pdcerr3[i]) work5 = append(work5,cbv3[i]) work6 = append(work6,cbverr3[i]) work7 = append(work7,det3[i]) work8 = append(work8,deterr3[i]) # update HDU1 for output file if status == 0: cols = (instr[1].columns + ColDefs([Column(name='PHASE',format='E',array=phase1)])) instr[1] = pyfits.new_table(cols) instr[1].header.cards['TTYPE'+str(len(instr[1].columns))].comment = 'column title: phase' instr[1].header.cards['TFORM'+str(len(instr[1].columns))].comment = 'data type: float32' for i in range(len(incards)): if incards[i].key not in instr[1].header.keys(): instr[1].header.update(incards[i].key, incards[i].value, incards[i].comment) else: instr[1].header.cards[incards[i].key].comment = incards[i].comment instr[1].header.update('PERIOD',period,'period defining the phase [d]') instr[1].header.update('BJD0',phasezero,'time of phase zero [BJD]') # write new phased data extension for output file if status == 0 and bindata: col1 = Column(name='PHASE',format='E',array=phase4) col2 = Column(name='SAP_FLUX',format='E',unit='e/s',array=sap4/cadenom) col3 = Column(name='SAP_FLUX_ERR',format='E',unit='e/s',array=saperr4/cadenom) col4 = Column(name='PDC_FLUX',format='E',unit='e/s',array=pdc4/cadenom) col5 = Column(name='PDC_FLUX_ERR',format='E',unit='e/s',array=pdcerr4/cadenom) col6 = Column(name='CBV_FLUX',format='E',unit='e/s',array=cbv4/cadenom) col7 = Column(name='DET_FLUX',format='E',array=det4/cadenom) col8 = Column(name='DET_FLUX_ERR',format='E',array=deterr4/cadenom) cols = ColDefs([col1,col2,col3,col4,col5,col6,col7,col8]) instr.append(new_table(cols)) instr[-1].header.cards['TTYPE1'].comment = 'column title: phase' instr[-1].header.cards['TTYPE2'].comment = 'column title: simple aperture photometry' instr[-1].header.cards['TTYPE3'].comment = 'column title: SAP 1-sigma error' instr[-1].header.cards['TTYPE4'].comment = 'column title: pipeline conditioned photometry' instr[-1].header.cards['TTYPE5'].comment = 'column title: PDC 1-sigma error' instr[-1].header.cards['TTYPE6'].comment = 'column title: cotrended basis vector photometry' instr[-1].header.cards['TTYPE7'].comment = 'column title: Detrended aperture photometry' instr[-1].header.cards['TTYPE8'].comment = 'column title: DET 1-sigma error' instr[-1].header.cards['TFORM1'].comment = 'column type: float32' instr[-1].header.cards['TFORM2'].comment = 'column type: float32' instr[-1].header.cards['TFORM3'].comment = 'column type: float32' instr[-1].header.cards['TFORM4'].comment = 'column type: float32' instr[-1].header.cards['TFORM5'].comment = 'column type: float32' instr[-1].header.cards['TFORM6'].comment = 'column type: float32' instr[-1].header.cards['TFORM7'].comment = 'column type: float32' instr[-1].header.cards['TFORM8'].comment = 'column type: float32' instr[-1].header.cards['TUNIT2'].comment = 'column units: electrons per second' instr[-1].header.cards['TUNIT3'].comment = 'column units: electrons per second' instr[-1].header.cards['TUNIT4'].comment = 'column units: electrons per second' instr[-1].header.cards['TUNIT5'].comment = 'column units: electrons per second' instr[-1].header.cards['TUNIT6'].comment = 'column units: electrons per second' instr[-1].header.update('EXTNAME','FOLDED','extension name') instr[-1].header.update('PERIOD',period,'period defining the phase [d]') instr[-1].header.update('BJD0',phasezero,'time of phase zero [BJD]') instr[-1].header.update('BINMETHD',binmethod,'phase binning method') if binmethod =='sigclip': instr[-1].header.update('THRSHOLD',threshold,'sigma-clipping threshold [sigma]') instr[-1].header.update('NITER',niter,'max number of sigma-clipping iterations') # history keyword in output file if status == 0: status = kepkey.history(call,instr[0],outfile,logfile,verbose) instr.writeto(outfile) # clean up x-axis unit if status == 0: ptime1 = array([],'float32') ptime2 = array([],'float32') pout1 = array([],'float32') pout2 = array([],'float32') if bindata: work = sap4 if plottype == 'pdc': work = pdc4 if plottype == 'cbv': work = cbv4 if plottype == 'det': work = det4 for i in range(len(phase4)): if (phase4[i] > 0.5): ptime2 = append(ptime2,phase4[i] - 1.0) pout2 = append(pout2,work[i]) ptime2 = append(ptime2,phase4) pout2 = append(pout2,work) for i in range(len(phase4)): if (phase4[i] <= 0.5): ptime2 = append(ptime2,phase4[i] + 1.0) pout2 = append(pout2,work[i]) work = sap3 if plottype == 'pdc': work = pdc3 if plottype == 'cbv': work = cbv3 if plottype == 'det': work = det3 for i in range(len(phase3)): if (phase3[i] > 0.5): ptime1 = append(ptime1,phase3[i] - 1.0) pout1 = append(pout1,work[i]) ptime1 = append(ptime1,phase3) pout1 = append(pout1,work) for i in range(len(phase3)): if (phase3[i] <= 0.5): ptime1 = append(ptime1,phase3[i] + 1.0) pout1 = append(pout1,work[i]) xlab = 'Orbital Phase ($\phi$)' # clean up y-axis units if status == 0: nrm = len(str(int(pout1[isfinite(pout1)].max())))-1 pout1 = pout1 / 10**nrm pout2 = pout2 / 10**nrm if nrm == 0: ylab = plotlab else: ylab = '10$^%d$ %s' % (nrm, plotlab) # data limits xmin = ptime1.min() xmax = ptime1.max() ymin = pout1[isfinite(pout1)].min() ymax = pout1[isfinite(pout1)].max() xr = xmax - xmin yr = ymax - ymin ptime1 = insert(ptime1,[0],[ptime1[0]]) ptime1 = append(ptime1,[ptime1[-1]]) pout1 = insert(pout1,[0],[0.0]) pout1 = append(pout1,0.0) if bindata: ptime2 = insert(ptime2,[0],ptime2[0] - 1.0 / nbins) ptime2 = insert(ptime2,[0],ptime2[0]) ptime2 = append(ptime2,[ptime2[-1] + 1.0 / nbins, ptime2[-1] + 1.0 / nbins]) pout2 = insert(pout2,[0],[pout2[-1]]) pout2 = insert(pout2,[0],[0.0]) pout2 = append(pout2,[pout2[2],0.0]) # plot new light curve if status == 0 and plottype != 'none': try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 18, 'legend.fontsize': 18, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} pylab.rcParams.update(params) except: print 'ERROR -- KEPFOLD: install latex for scientific plotting' status = 1 if status == 0 and plottype != 'none': pylab.figure(figsize=[17,7]) pylab.clf() ax = pylab.axes([0.06,0.11,0.93,0.86]) pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) labels = ax.get_yticklabels() setp(labels, 'rotation', 90) if bindata: pylab.fill(ptime2,pout2,color=fcolor,linewidth=0.0,alpha=falpha) else: if 'det' in plottype: pylab.fill(ptime1,pout1,color=fcolor,linewidth=0.0,alpha=falpha) pylab.plot(ptime1,pout1,color=lcolor,linestyle='',linewidth=lwidth,marker='.') if bindata: pylab.plot(ptime2[1:-1],pout2[1:-1],color='r',linestyle='-',linewidth=lwidth,marker='') xlabel(xlab, {'color' : 'k'}) ylabel(ylab, {'color' : 'k'}) xlim(-0.49999,1.49999) if ymin >= 0.0: ylim(ymin-yr*0.01,ymax+yr*0.01) # ylim(0.96001,1.03999) else: ylim(1.0e-10,ymax+yr*0.01) grid() if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() # close input file if status == 0: status = kepio.closefits(instr,logfile,verbose) # stop time kepmsg.clock('KEPFOLD ended at: ',logfile,verbose)
def kepdraw(infile,outfile,datacol,ploterr,errcol,quality, lcolor,lwidth,fcolor,falpha,labelsize,ticksize, xsize,ysize,fullrange,chooserange,y1,y2,plotgrid, ylabel,plottype,verbose,logfile,status,cmdLine=False): # log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPDRAW -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'datacol='+datacol+' ' perr = 'n' if (ploterr): perr = 'y' call += 'ploterr='+perr+ ' ' call += 'errcol='+errcol+' ' qual = 'n' if (quality): qual = 'y' call += 'quality='+qual+ ' ' call += 'lcolor='+str(lcolor)+' ' call += 'lwidth='+str(lwidth)+' ' call += 'fcolor='+str(fcolor)+' ' call += 'falpha='+str(falpha)+' ' call += 'labelsize='+str(labelsize)+' ' call += 'ticksize='+str(ticksize)+' ' call += 'xsize='+str(xsize)+' ' call += 'ysize='+str(ysize)+' ' frange = 'n' if (fullrange): frange = 'y' call += 'fullrange='+frange+ ' ' crange = 'n' if (chooserange): crange = 'y' call += 'chooserange='+crange+ ' ' call += 'ymin='+str(y1)+' ' call += 'ymax='+str(y2)+' ' pgrid = 'n' if (plotgrid): pgrid = 'y' call += 'plotgrid='+pgrid+ ' ' call += 'ylabel='+str(ylabel)+' ' call += 'plottype='+plottype+' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) # start time kepmsg.clock('KEPDRAW started at',logfile,verbose) # test log file logfile = kepmsg.test(logfile) # open input file if status == 0: struct, status = kepio.openfits(infile,'readonly',logfile,verbose) if status == 0: tstart, tstop, bjdref, cadence, status = kepio.timekeys(struct,infile,logfile,verbose,status) # read table structure if status == 0: table, status = kepio.readfitstab(infile,struct[1],logfile,verbose) # read table columns if status == 0: intime, status = kepio.readtimecol(infile,table,logfile,verbose) intime += bjdref indata, status = kepio.readfitscol(infile,table,datacol,logfile,verbose) indataerr, status = kepio.readfitscol(infile,table,errcol,logfile,verbose) # read table quality column if status == 0 and quality: try: qualtest = table.field('SAP_QUALITY') except: message = 'ERROR -- KEPDRAW: no SAP_QUALITY column found in file ' + infile message += '. Use kepdraw quality=n' status = kepmsg.err(logfile,message,verbose) # close infile if status == 0: status = kepio.closefits(struct,logfile,verbose) # remove infinities and bad data if status == 0: if numpy.isnan(numpy.nansum(indataerr)): indataerr[:] = 1.0e-5 work1 = numpy.array([intime, indata, indataerr],dtype='float64') work1 = numpy.rot90(work1,3) work1 = work1[~numpy.isnan(work1).any(1)] work1 = work1[~numpy.isinf(work1).any(1)] barytime = numpy.array(work1[:,2],dtype='float64') data = numpy.array(work1[:,1],dtype='float32') dataerr = numpy.array(work1[:,0],dtype='float32') if len(barytime) == 0: message = 'ERROR -- KEPDRAW: Plotting arrays are full of NaN' status = kepmsg.err(logfile,message,verbose) # clean up x-axis unit if status == 0: barytime0 = float(int(tstart / 100) * 100.0) barytime -= barytime0 xlab = 'BJD $-$ %d' % barytime0 # clean up y-axis units try: nrm = len(str(int(numpy.nanmax(data))))-1 except: nrm = 0 data = data / 10**nrm if 'e$^-$ s$^{-1}$' in ylabel or 'default' in ylabel: if nrm == 0: ylab1 = 'e$^-$ s$^{-1}$' else: ylab1 = '10$^%d$ e$^-$ s$^{-1}$' % nrm else: ylab1 = re.sub('_','-',ylabel) # data limits xmin = numpy.nanmin(barytime) xmax = numpy.nanmax(barytime) ymin = numpy.nanmin(data) ymax = numpy.nanmax(data) xr = xmax - xmin yr = ymax - ymin barytime = insert(barytime,[0],[barytime[0]]) barytime = append(barytime,[barytime[-1]]) data = insert(data,[0],[0.0]) data = append(data,0.0) # define plot formats try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} pylab.rcParams.update(params) except: pass # define size of plot on monitor screen pylab.figure(figsize=[xsize,ysize]) # delete any fossil plots in the matplotlib window pylab.clf() # position axes inside the plotting window ax = pylab.subplot(111) pylab.subplots_adjust(0.07,0.1,0.92,0.88) # force tick labels to be absolute rather than relative pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) # rotate y labels by 90 deg labels = ax.get_yticklabels() setp(labels, 'rotation', 90, fontsize=ticksize) # if plot type is 'fast' plot data time series as points if plottype == 'fast': pylab.plot(barytime,data,'o',color=lcolor) # if plot type is 'pretty' plot data time series as an unbroken line, retaining data gaps else: ltime = numpy.array([],dtype='float64') ldata = numpy.array([],dtype='float32') dt = 0 work1 = 2.0 * cadence / 86400 for i in range(1,len(data)-1): dt = barytime[i] - barytime[i-1] if dt < work1: ltime = numpy.append(ltime,barytime[i]) ldata = numpy.append(ldata,data[i]) else: pylab.plot(ltime,ldata,color=lcolor,linestyle='-',linewidth=lwidth) ltime = numpy.array([],dtype='float64') ldata = numpy.array([],dtype='float32') pylab.plot(ltime,ldata,color=lcolor,linestyle='-',linewidth=lwidth) # plot the fill color below data time series, with no data gaps pylab.fill(barytime,data,fc=fcolor,linewidth=0.0,alpha=falpha) # define plot x and y limits pylab.xlim(xmin-xr*0.01,xmax+xr*0.01) if ymin-yr*0.01 <= 0.0 or fullrange: pylab.ylim(1.0e-10,ymax+yr*0.01) else: pylab.ylim(ymin-yr*0.01,ymax+yr*0.01) if chooserange: pylab.ylim(y1,y2) # plot labels pylab.xlabel(xlab, {'color' : 'k'}) try: pylab.ylabel(ylab1, {'color' : 'k'}) except: ylab1 = '10**%d e-/s' % nrm pylab.ylabel(ylab1, {'color' : 'k'}) # make grid on plot if plotgrid: pylab.grid() # save plot to file if status == 0 and outfile.lower() != 'none': pylab.savefig(outfile) # render plot if cmdLine: # pylab.show() pylab.show(block=True) else: pylab.ion() pylab.plot([]) pylab.ioff() # end time if (status == 0): message = 'KEPDRAW completed at' else: message = '\nKEPDRAW aborted at' kepmsg.clock(message,logfile,verbose)
def kepclip(infile, outfile, ranges, plot, plotcol, clobber, verbose, logfile, status, cmdLine=False): # startup parameters status = 0 labelsize = 32 ticksize = 24 xsize = 18 ysize = 10 lcolor = '#0000ff' lwidth = 1.0 fcolor = '#ffff00' falpha = 0.2 # log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile, hashline, verbose) call = 'KEPCLIP -- ' call += 'infile=' + infile + ' ' call += 'outfile=' + outfile + ' ' call += 'ranges=' + ranges + ' ' plotit = 'n' if (plot): plotit = 'y' call += 'plot=' + plotit + ' ' call += 'plotcol=' + plotcol + ' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber=' + overwrite + ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose=' + chatter + ' ' call += 'logfile=' + logfile kepmsg.log(logfile, call + '\n', verbose) # start time kepmsg.clock('KEPCLIP started at', logfile, verbose) # test log file logfile = kepmsg.test(logfile) # clobber output file if clobber: status = kepio.clobber(outfile, logfile, verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPCLIP: ' + outfile + ' exists. Use --clobber' status = kepmsg.err(logfile, message, verbose) # time ranges for region if status == 0: t1 = [] t2 = [] t1, t2, status = kepio.timeranges(ranges, logfile, verbose) # open input file if status == 0: instr, status = kepio.openfits(infile, 'readonly', logfile, verbose) tstart, tstop, bjdref, cadence, status = kepio.timekeys( instr, infile, logfile, verbose, status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence # fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr, file, logfile, verbose) # input data if status == 0: table = instr[1].data # read time and flux columns if status == 0: barytime, status = kepio.readtimecol(infile, table, logfile, verbose) if status == 0: flux, status = kepio.readfitscol(infile, table, plotcol, logfile, verbose) if status == 0: barytime = barytime + bjdref if 'flux' in plotcol.lower(): flux = flux / cadenom # filter input data table if status == 0: naxis2 = 0 work1 = array([], 'float64') work2 = array([], 'float32') for i in range(len(barytime)): if (numpy.isfinite(barytime[i]) and numpy.isfinite(flux[i]) and flux[i] != 0.0): reject = False for j in range(len(t1)): if (barytime[i] >= t1[j] and barytime[i] <= t2[j]): reject = True if not reject: table[naxis2] = table[i] work1 = append(work1, barytime[i]) work2 = append(work2, flux[i]) naxis2 += 1 # comment keyword in output file if status == 0: status = kepkey.history(call, instr[0], outfile, logfile, verbose) # write output file if status == 0: instr[1].data = table[:naxis2] comment = 'NaN cadences removed from data' status = kepkey.new('NANCLEAN', True, comment, instr[1], outfile, logfile, verbose) instr.writeto(outfile) # clean up x-axis unit if status == 0: barytime0 = float(int(tstart / 100) * 100.0) barytime = work1 - barytime0 xlab = 'BJD $-$ %d' % barytime0 # clean up y-axis units if status == 0: try: nrm = len(str(int(work2.max()))) - 1 except: nrm = 0 flux = work2 / 10**nrm ylab = '10$^%d$ e$^-$ s$^{-1}$' % nrm # data limits xmin = barytime.min() xmax = barytime.max() ymin = flux.min() ymax = flux.max() xr = xmax - xmin yr = ymax - ymin # plotting arguments if status == 0 and plot: try: params = { 'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight': 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize } rcParams.update(params) except: print('ERROR -- KEPCLIP: install latex for scientific plotting') status = 1 # clear window, plot box if status == 0 and plot: pylab.figure(figsize=[xsize, ysize]) pylab.clf() ax = pylab.axes([0.05, 0.1, 0.94, 0.88]) # force tick labels to be absolute rather than relative pylab.gca().xaxis.set_major_formatter( pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter( pylab.ScalarFormatter(useOffset=False)) # rotate y labels by 90 deg labels = ax.get_yticklabels() setp(labels, 'rotation', 90, fontsize=12) # plot line data ltime = [barytime[0]] ldata = [flux[0]] for i in range(1, len(flux)): if (barytime[i - 1] > barytime[i] - 0.025): ltime.append(barytime[i]) ldata.append(flux[i]) else: ltime = array(ltime, dtype=float64) ldata = array(ldata, dtype=float64) pylab.plot(ltime, ldata, color=lcolor, linestyle='-', linewidth=lwidth) ltime = [] ldata = [] ltime = array(ltime, dtype=float64) ldata = array(ldata, dtype=float64) pylab.plot(ltime, ldata, color=lcolor, linestyle='-', linewidth=lwidth) # plot fill data barytime = insert(barytime, [0], [barytime[0]]) barytime = append(barytime, [barytime[-1]]) flux = insert(flux, [0], [0.0]) flux = append(flux, [0.0]) fill(barytime, flux, fc=fcolor, linewidth=0.0, alpha=falpha) xlim(xmin - xr * 0.01, xmax + xr * 0.01) if ymin - yr * 0.01 <= 0.0: ylim(1.0e-10, ymax + yr * 0.01) else: ylim(ymin - yr * 0.01, ymax + yr * 0.01) xlabel(xlab, {'color': 'k'}) ylabel(ylab, {'color': 'k'}) grid() # render plot if status == 0 and plot: if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() # close input file if status == 0: status = kepio.closefits(instr, logfile, verbose) # end time if (status == 0): message = 'KEPCLIP completed at' else: message = '\nKEPCLIP aborted at' kepmsg.clock(message, logfile, verbose)
def kepfilter(infile,outfile,datacol,function,cutoff,passband,plot,plotlab, clobber,verbose,logfile,status,cmdLine=False): ## startup parameters status = 0 numpy.seterr(all="ignore") labelsize = 24 ticksize = 16 xsize = 16 ysize = 6 lcolor = '#0000ff' lwidth = 1.0 fcolor = '#ffff00' falpha = 0.2 ## log the call hashline = '----------------------------------------------------------------------------' kepmsg.log(logfile,hashline,verbose) call = 'KEPFILTER -- ' call += 'infile='+infile+' ' call += 'outfile='+outfile+' ' call += 'datacol='+str(datacol)+' ' call += 'function='+str(function)+' ' call += 'cutoff='+str(cutoff)+' ' call += 'passband='+str(passband)+' ' plotit = 'n' if (plot): plotit = 'y' call += 'plot='+plotit+ ' ' call += 'plotlab='+str(plotlab)+' ' overwrite = 'n' if (clobber): overwrite = 'y' call += 'clobber='+overwrite+ ' ' chatter = 'n' if (verbose): chatter = 'y' call += 'verbose='+chatter+' ' call += 'logfile='+logfile kepmsg.log(logfile,call+'\n',verbose) ## start time kepmsg.clock('KEPFILTER started at',logfile,verbose) ## test log file logfile = kepmsg.test(logfile) ## clobber output file if clobber: status = kepio.clobber(outfile,logfile,verbose) if kepio.fileexists(outfile): message = 'ERROR -- KEPFILTER: ' + outfile + ' exists. Use clobber=yes' status = kepmsg.err(logfile,message,verbose) ## open input file if status == 0: instr, status = kepio.openfits(infile,'readonly',logfile,verbose) tstart, tstop, bjdref, cadence, status = kepio.timekeys(instr,infile,logfile,verbose,status) if status == 0: try: work = instr[0].header['FILEVER'] cadenom = 1.0 except: cadenom = cadence ## fudge non-compliant FITS keywords with no values if status == 0: instr = kepkey.emptykeys(instr,file,logfile,verbose) ## read table structure if status == 0: table, status = kepio.readfitstab(infile,instr[1],logfile,verbose) # read time and flux columns if status == 0: barytime, status = kepio.readtimecol(infile,table,logfile,verbose) flux, status = kepio.readsapcol(infile,table,logfile,verbose) # filter input data table if status == 0: try: nanclean = instr[1].header['NANCLEAN'] except: naxis2 = 0 for i in range(len(table.field(0))): if (numpy.isfinite(barytime[i]) and numpy.isfinite(flux[i]) and flux[i] != 0.0): table[naxis2] = table[i] naxis2 += 1 instr[1].data = table[:naxis2] comment = 'NaN cadences removed from data' status = kepkey.new('NANCLEAN',True,comment,instr[1],outfile,logfile,verbose) ## read table columns if status == 0: intime, status = kepio.readtimecol(infile,instr[1].data,logfile,verbose) if status == 0: indata, status = kepio.readfitscol(infile,instr[1].data,datacol,logfile,verbose) if status == 0: intime = intime + bjdref indata = indata / cadenom ## define data sampling if status == 0: tr = 1.0 / (cadence / 86400) timescale = 1.0 / (cutoff / tr) ## define convolution function if status == 0: if function == 'boxcar': filtfunc = numpy.ones(numpy.ceil(timescale)) elif function == 'gauss': timescale /= 2 dx = numpy.ceil(timescale * 10 + 1) filtfunc = kepfunc.gauss() filtfunc = filtfunc([1.0,dx/2-1.0,timescale],linspace(0,dx-1,dx)) elif function == 'sinc': dx = numpy.ceil(timescale * 12 + 1) fx = linspace(0,dx-1,dx) fx = fx - dx / 2 + 0.5 fx /= timescale filtfunc = numpy.sinc(fx) filtfunc /= numpy.sum(filtfunc) ## pad time series at both ends with noise model if status == 0: ave, sigma = kepstat.stdev(indata[:len(filtfunc)]) padded = append(kepstat.randarray(np.ones(len(filtfunc)) * ave, np.ones(len(filtfunc)) * sigma), indata) ave, sigma = kepstat.stdev(indata[-len(filtfunc):]) padded = append(padded, kepstat.randarray(np.ones(len(filtfunc)) * ave, np.ones(len(filtfunc)) * sigma)) ## convolve data if status == 0: convolved = convolve(padded,filtfunc,'same') ## remove padding from the output array if status == 0: if function == 'boxcar': outdata = convolved[len(filtfunc):-len(filtfunc)] else: outdata = convolved[len(filtfunc):-len(filtfunc)] ## subtract low frequencies if status == 0 and passband == 'high': outmedian = median(outdata) outdata = indata - outdata + outmedian ## comment keyword in output file if status == 0: status = kepkey.history(call,instr[0],outfile,logfile,verbose) ## clean up x-axis unit if status == 0: intime0 = float(int(tstart / 100) * 100.0) if intime0 < 2.4e6: intime0 += 2.4e6 ptime = intime - intime0 xlab = 'BJD $-$ %d' % intime0 ## clean up y-axis units if status == 0: pout = indata * 1.0 pout2 = outdata * 1.0 nrm = len(str(int(numpy.nanmax(pout))))-1 pout = pout / 10**nrm pout2 = pout2 / 10**nrm ylab = '10$^%d$ %s' % (nrm, plotlab) ## data limits xmin = ptime.min() xmax = ptime.max() ymin = numpy.nanmin(pout) ymax = numpy.nanmax(pout) xr = xmax - xmin yr = ymax - ymin ptime = insert(ptime,[0],[ptime[0]]) ptime = append(ptime,[ptime[-1]]) pout = insert(pout,[0],[0.0]) pout = append(pout,0.0) pout2 = insert(pout2,[0],[0.0]) pout2 = append(pout2,0.0) ## plot light curve if status == 0 and plot: try: params = {'backend': 'png', 'axes.linewidth': 2.5, 'axes.labelsize': labelsize, 'axes.font': 'sans-serif', 'axes.fontweight' : 'bold', 'text.fontsize': 12, 'legend.fontsize': 12, 'xtick.labelsize': ticksize, 'ytick.labelsize': ticksize} rcParams.update(params) except: print('ERROR -- KEPFILTER: install latex for scientific plotting') status = 1 if status == 0 and plot: pylab.figure(figsize=[xsize,ysize]) pylab.clf() ## plot filtered data ax = pylab.axes([0.06,0.1,0.93,0.87]) pylab.gca().xaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) pylab.gca().yaxis.set_major_formatter(pylab.ScalarFormatter(useOffset=False)) labels = ax.get_yticklabels() setp(labels, 'rotation', 90, fontsize=12) pylab.plot(ptime,pout,color='#ff9900',linestyle='-',linewidth=lwidth) fill(ptime,pout,color=fcolor,linewidth=0.0,alpha=falpha) if passband == 'low': pylab.plot(ptime[1:-1],pout2[1:-1],color=lcolor,linestyle='-',linewidth=lwidth) else: pylab.plot(ptime,pout2,color=lcolor,linestyle='-',linewidth=lwidth) fill(ptime,pout2,color=lcolor,linewidth=0.0,alpha=falpha) xlabel(xlab, {'color' : 'k'}) ylabel(ylab, {'color' : 'k'}) xlim(xmin-xr*0.01,xmax+xr*0.01) if ymin >= 0.0: ylim(ymin-yr*0.01,ymax+yr*0.01) else: ylim(1.0e-10,ymax+yr*0.01) pylab.grid() # render plot if cmdLine: pylab.show() else: pylab.ion() pylab.plot([]) pylab.ioff() ## write output file if status == 0: for i in range(len(outdata)): instr[1].data.field(datacol)[i] = outdata[i] instr.writeto(outfile) ## close input file if status == 0: status = kepio.closefits(instr,logfile,verbose) ## end time if (status == 0): message = 'KEPFILTER completed at' else: message = '\nKEPFILTER aborted at' kepmsg.clock(message,logfile,verbose)