def plotCalibrations(flatsol, wvlCalFile, pixel): """ Plot weights of each wavelength bin for every single pixel Makes a plot of wavelength vs weights, twilight spectrum, and wavecal solution for each pixel """ wavesol = wavecal.load_solution(wvlCalFile) assert os.path.exists(flatsol), "{0} does not exist".format(flatsol) flat_cal = tables.open_file(flatsol, mode='r') calsoln = flat_cal.root.flatcal.calsoln.read() wavelengths = flat_cal.root.flatcal.wavelengthBins.read() beamImage = flat_cal.root.header.beamMap.read() matplotlib.rcParams['font.size'] = 10 res_id = beamImage[pixel[0], pixel[1]] index = np.where(res_id == np.array(calsoln['resid'])) weights = calsoln['weight'][index].flatten() spectrum = calsoln['spectrum'][index].flatten() errors = calsoln['err'][index].flatten() if not calsoln['bad'][index]: fig = plt.figure(figsize=(20, 10), dpi=100) ax = fig.add_subplot(1, 3, 1) ax.scatter(wavelengths, weights, label='weights', alpha=.7, color='red') ax.errorbar(wavelengths, weights, yerr=errors, label='weights', color='green', fmt='o') ax.set_title('p %d,%d' % (pixel[0], pixel[1])) ax.set_ylabel('weight') ax.set_xlabel(r'$\lambda$ ($\AA$)') ax.set_ylim( min(weights) - 2 * np.nanstd(weights), max(weights) + 2 * np.nanstd(weights)) plt.plot(wavelengths, np.poly1d(calsoln[index]['coeff'][0])(wavelengths)) # Put a plot of twilight spectrums for this pixel ax = fig.add_subplot(1, 3, 2) ax.scatter(wavelengths, spectrum, label='spectrum', alpha=.7, color='blue') ax.set_title('p %d,%d' % (pixel[0], pixel[1])) ax.set_ylim( min(spectrum) - 2 * np.nanstd(spectrum), max(spectrum) + 2 * np.nanstd(spectrum)) ax.set_ylabel('spectrum') ax.set_xlabel(r'$\lambda$ ($\AA$)') # Plot wavecal solution ax = fig.add_subplot(1, 3, 3) my_pixel = [pixel[0], pixel[1]] wavesol.plot_calibration(pixel=my_pixel, axes=ax) ax.set_title('p %d,%d' % (pixel[0], pixel[1])) plt.show() else: print('Pixel Failed Wavecal')
def wavecal_apply(o): if o.wavecal is None: getLogger(__name__).info('No wavecal to apply for {}'.format(o.h5)) return try: of = mkidpipeline.hdf.photontable.Photontable(o.h5, mode='a') of.applyWaveCal(wavecal.load_solution(o.wavecal.path)) of.file.close() except Exception as e: getLogger(__name__).critical( 'Caught exception during run of {}'.format(o.h5), exc_info=True)
def flatcal_apply(o): of = mkidpipeline.hdf.photontable.Photontable(o.h5, mode='a') of.applyFlatCal(wavecal.load_solution(o.flatcal)) of.file.close()
time.time()) args = parser.parse_args() flattner = WhiteCalibrator(args.cfgfile, cal_file_name='calsol_{}.h5'.format(timestamp)) if not os.path.isfile(flattner.cfg.h5file): raise RuntimeError('Not up to date') b2h_config = bin2hdf.Bin2HdfConfig(datadir=flattner.cfg.paths.data, beamfile=flattner.cfg.beammap.file, outdir=flattner.paths.out, starttime=flattner.cfg.start_time, inttime=flattner.cfg.expTime, x=flattner.cfg.beammap.ncols, y=flattner.cfg.beammap.ncols) bin2hdf.makehdf(b2h_config, maxprocs=1) getLogger(__name__).info('Made h5 file at {}.h5'.format( flattner.cfg.start_time)) obsfile = Photontable(flattner.h5file, mode='write') if not obsfile.wavelength_calibrated: obsfile.applyWaveCal(wavecal.load_solution(flattner.cfg.wavesol)) getLogger(__name__).info('Applied Wavecal {} to {}.h5'.format( flattner.cfg.wavesol, flattner.h5file)) if args.h5only: exit() flattner.makeCalibration()