def decomp(cube, sampleId, args): galaxyId = califa_id_from_cube(cube) c = DecompContainer() if not args.overwrite: logger.info('Checking if the decomposition is already done for %s ...' % galaxyId) try: c.loadHDF5(args.db, sampleId, galaxyId) logger.warn('Previous data found, skipping decomposition.') return c except Exception as e: print e logger.info('No previous data found, continuing decomposition.') logger.info('Starting fit for %s...' % galaxyId) dec = CALIFADecomposer(cube, grating=args.grating, nproc=args.nproc) npix = dec.K.qMask.sum() dec.minNPix = npix / 2 logger.info('Minimum number of pixels for fitting: %d' % dec.minNPix) dec.useEstimatedVariance = args.estVar dec.setSynthPSF(FWHM=args.psfFWHM, beta=args.psfBeta, size=args.psfSize) logger.warn('Computing initial model using DE algorithm (takes a LOT of time).') t1 = time.time() if not path.exists(args.maskFile): logger.error('Mask file %s not found.' % args.maskFile) exit(1) logger.info('Using mask file %s.' % args.maskFile) masked_wl = load_line_mask(args.maskFile, dec.wl) l1 = find_nearest_index(dec.wl, 4500.0) l2 = dec.Nl_obs cache_file = cube + '.initmodel' if not path.exists(cache_file): logger.info('Creating gray image for initial model.') gray_image, gray_noise, _ = dec.getSpectraSlice(l1, l2, masked_wl) else: gray_image = None gray_noise = None initial_model = bd_initial_model(gray_image, gray_noise, dec.PSF, quiet=False, nproc=args.nproc, cache_model_file=cache_file) logger.debug('Refined initial model:\n%s\n' % initial_model) logger.warn('Initial model time: %.2f\n' % (time.time() - t1)) t1 = time.time() c.zones = np.ma.array(dec.K.qZones, mask=dec.K.qZones < 0) c.initialParams = initial_model.getParams() c.attrs = dict(PSF_FWHM=args.psfFWHM, PSF_beta=args.psfBeta, PSF_size=args.psfSize, box_step=args.boxStep, box_radius=args.boxRadius, orig_file=cube, mask_file=args.maskFile, object_name=dec.K.galaxyName, flux_unit=dec.flux_unit, distance_Mpc=dec.K.distance_Mpc, x0=dec.K.x0, y0=dec.K.y0, target_vd=dec.targetVd, wl_FWHM=dec.wlFWHM) models = dec.fitSpectra(step=50*args.boxStep, box_radius=25*args.boxStep, initial_model=initial_model, mode=args.fitAlgorithm, masked_wl=masked_wl) c.firstPassParams = np.array([m.getParams() for m in models], dtype=models[0].dtype) logger.info('Done first pass modeling, time: %.2f' % (time.time() - t1)) t1 = time.time() logger.info('Smoothing parameters.') models = smooth_models(models, dec.wl, degree=1) logger.info('Starting second pass modeling...') models = dec.fitSpectra(step=args.boxStep, box_radius=args.boxRadius, initial_model=models, mode=args.fitAlgorithm, insist=False, masked_wl=masked_wl) logger.info('Done second pass modeling, time: %.2f' % (time.time() - t1)) t1 = time.time() logger.info('Computing model spectra...') c.total.f_obs = dec.flux[::args.boxStep] c.total.f_err = dec.error[::args.boxStep] c.total.f_flag = dec.flags[::args.boxStep] c.total.mask = dec.K.qMask c.total.wl = dec.wl[::args.boxStep] c.bulge.f_obs, c.disk.f_obs = dec.getModelSpectra(models, args.nproc) c.bulge.mask = dec.K.qMask c.bulge.wl = dec.wl[::args.boxStep] c.disk.mask = dec.K.qMask c.disk.wl = dec.wl[::args.boxStep] # TODO: better array and dtype handling. c.fitParams = np.array([m.getParams() for m in models], dtype=models[0].dtype) flag_bad_fit = c.fitParams['flag'][:, np.newaxis, np.newaxis] > 0.0 c.updateErrorsFlags(flag_bad_fit) c.updateIntegratedSpec() logger.info('Saving qbick planes...') fname = path.join(args.zoneFileDir, '%s_%s-planes.fits' % (galaxyId, sampleId)) save_qbick_images(c.total, dec, fname, overwrite=args.overwrite) fname = path.join(args.zoneFileDir, '%s_%s-bulge-planes.fits' % (galaxyId, sampleId)) save_qbick_images(c.bulge, dec, fname, overwrite=args.overwrite) fname = path.join(args.zoneFileDir, '%s_%s-disk-planes.fits' % (galaxyId, sampleId)) save_qbick_images(c.disk, dec, fname, overwrite=args.overwrite) logger.info('Saving to storage...') c.writeHDF5(args.db, sampleId, galaxyId, args.overwrite) logger.info('Storage complete, time: %.2f' % (time.time() - t1)) return c
initial_model.disk.I_0.value, initial_model.disk.h.value, args.modelPsfFWHM) plt.suptitle(r'Initial model: $I_e = %.3f$, $r_e = %.3f$, $n = %.3f$, $I_0 = %.3f$, $h = %.3f$, $FWHM = %.2f$' % tmp) gs.tight_layout(fig, rect=[0, 0, 1, 0.97]) pdf.savefig() logger.info('Starting first pass modeling.') t1 = time.time() first_pass_models = decomp.fitSpectra(step=100, box_radius=50, initial_model=initial_model, mode='LM') first_pass_params = np.array([m.getParams() for m in first_pass_models], dtype=first_pass_models[0].dtype) first_pass_lambdas = decomp.wl[::100] logger.info('Done first pass modeling, time: %.2f' % (time.time() - t1)) logger.info('Smoothing parameters with polynomial of degree %d.' % args.paramDegree) smoothed_models = smooth_models(first_pass_models, decomp.wl, degree=args.paramDegree) smoothed_params = np.array([m.getParams() for m in smoothed_models], dtype=smoothed_models[0].dtype) logger.info('Starting second pass modeling...') t1 = time.time() fitted_models = decomp.fitSpectra(step=1, box_radius=0, initial_model=smoothed_models, mode='LM') fitted_params = np.array([m.getParams() for m in fitted_models], dtype=fitted_models[0].dtype) logger.info('Done second pass modeling, time: %.2f' % (time.time() - t1)) logger.info('Computing model spectra.') fitted_bulge_ifs, fitted_disk_ifs = decomp.getModelSpectra(fitted_models) fitted_bulge_ifs_nopsf, fitted_disk_ifs_nopsf = decomp.getModelSpectra(fitted_models, use_PSF=False) logger.info('Average fit results:') print_params = ('I_e', 'r_e', 'n', 'PA_b', 'ell_b', 'I_0', 'h', 'PA_d', 'ell_d', ) for p in fitted_params.dtype.names:
initial_model.disk.I_0.value, initial_model.disk.h.value, args.modelPsfFWHM) plt.suptitle(r'Initial model: $I_e = %.3f$, $r_e = %.3f$, $n = %.3f$, $I_0 = %.3f$, $h = %.3f$, $FWHM = %.2f$' % tmp) gs.tight_layout(fig, rect=[0, 0, 1, 0.97]) pdf.savefig() logger.info('Starting first pass modeling.') t1 = time.time() first_pass_models = decomp.fitSpectra(step=100, box_radius=50, initial_model=initial_model, mode='NM') first_pass_params = np.array([m.getParams() for m in first_pass_models], dtype=first_pass_models[0].dtype) first_pass_lambdas = decomp.wl[::100] logger.info('Done first pass modeling, time: %.2f' % (time.time() - t1)) logger.info('Smoothing parameters.') smoothed_models = smooth_models(first_pass_models, decomp.wl, degree=1) smoothed_params = np.array([m.getParams() for m in smoothed_models], dtype=smoothed_models[0].dtype) logger.info('Starting second pass modeling...') t1 = time.time() fitted_models = decomp.fitSpectra(step=1, box_radius=0, initial_model=smoothed_models, mode='LM', insist=True) fitted_params = np.array([m.getParams() for m in fitted_models], dtype=fitted_models[0].dtype) logger.info('Done second pass modeling, time: %.2f' % (time.time() - t1)) logger.info('Computing model spectra.') fitted_bulge_spectra, fitted_disk_spectra = decomp.getModelSpectra(fitted_models) logger.info('Average fit results:') original_params = np.array([m.getParams() for m in original_models], dtype=original_models[0].dtype) print_params = ('I_e', 'r_e', 'n', 'PA_b', 'ell_b', 'I_0', 'h', 'PA_d', 'ell_d', ) for p in fitted_params.dtype.names: