Exemplo n.º 1
0
 def __init__(self, starlight_dir, db, sample, galaxy_id, err_factor=None, blue_clip=None):
     self.starlightDir = starlight_dir
     self.galaxyId = galaxy_id
     self.sample = sample
     self._errFactor = err_factor
     self._blueClip = blue_clip
     self._dc = DecompContainer()
     self._dc.loadHDF5(db, sample, galaxy_id)
     self._gridTemplate, self._runTemplate = self._getTemplates()
     self._createDirs()
Exemplo n.º 2
0
################################################################################

parser = argparse.ArgumentParser(description='Plot Bulge/Disk decomposition.')

parser.add_argument('galaxyId', type=str, nargs=1,
                    help='CALIFA galaxy ID. Ex.: K0001')
parser.add_argument('--sample', dest='sample', default= 'sample004',
                    help='Sample file. Default: sample004.')
parser.add_argument('--db', dest='db', default='data/decomposition.005.h5',
                    help='HDF5 database path.')

args = parser.parse_args()
galaxyId = args.galaxyId[0]
sampleId = path.basename(args.sample)

c = DecompContainer()
c.loadHDF5(args.db, sampleId, galaxyId)
t = c.fitParams
t_1p = c.firstPassParams
l_obs_1p = t_1p['wl'][:]
flag_bad_1p = (t_1p['flag'] > 0.0) | (t_1p['chi2'] > 20.0)

box_radius = c.attrs['box_radius']
target_vd = c.attrs['target_vd']
PSF_FWHM = c.attrs['PSF_FWHM']
galaxyName = c.attrs['object_name']
flux_unit = c.attrs['flux_unit']
flag_bad = (t['flag'] > 0.0) | (t['chi2'] > 20.0)
flag_ok = ~flag_bad
fit_l_obs = t['wl']
masked_wl = load_line_mask('data/starlight/Mask.mE', fit_l_obs)
Exemplo n.º 3
0
class GridManager(object):
    
    def __init__(self, starlight_dir, db, sample, galaxy_id, err_factor=None, blue_clip=None):
        self.starlightDir = starlight_dir
        self.galaxyId = galaxy_id
        self.sample = sample
        self._errFactor = err_factor
        self._blueClip = blue_clip
        self._dc = DecompContainer()
        self._dc.loadHDF5(db, sample, galaxy_id)
        self._gridTemplate, self._runTemplate = self._getTemplates()
        self._createDirs()

        
    def _getTemplates(self):
        template_path = path.join(self.starlightDir, 'grid.template.in')
        grid = GridFile.fromFile(self.starlightDir, template_path)
        grid.setLogDir('log') 
        grid.fluxUnit = self._dc.attrs['flux_unit']
        run = grid.runs.pop()
        run.lumDistanceMpc = self._dc.attrs['distance_Mpc']
        grid.clearRuns()
        return grid, run

    
    def _createDirs(self):
        obs_dir = path.normpath(self._gridTemplate.obsDirAbs)
        out_dir = path.normpath(self._gridTemplate.outDirAbs)
        log_dir = path.normpath(self._gridTemplate.logDirAbs)

        makedirs(obs_dir + '_bulge')
        makedirs(obs_dir + '_disk')
        makedirs(obs_dir + '_total')
        
        makedirs(out_dir + '_bulge')
        makedirs(out_dir + '_disk')
        makedirs(out_dir + '_total')
        
        makedirs(log_dir + '_bulge')
        makedirs(log_dir + '_disk')
        makedirs(log_dir + '_total')
        
        
    def _getZoneSpectra(self, component):
        comp = getattr(self._dc, component)
        l_obs = comp.wl
        f_obs, f_err, f_flag = comp.asZones(self._dc.zones)
        f_obs = np.hstack((comp.i_f_obs[:, np.newaxis], f_obs))
        if self._errFactor is None:
            f_err = np.hstack((comp.i_f_err[:, np.newaxis], f_err))
        else:
            f_err = np.ones_like(f_obs) * (self._errFactor * f_obs.mean(axis=0))
        f_flag = np.hstack((comp.i_f_flag[:, np.newaxis], f_flag))
        if self._blueClip is not None:
            f_flag[l_obs < self._blueClip] = True
        return l_obs, f_obs, f_err, f_flag
        
        
    def _getGrid(self, component, l_obs, f_obs, f_err, f_flag, zone1, zone2):
        grid = self._gridTemplate.copy()
        if zone1 != zone2:
            grid.name = 'grid_%04d-%04d' % (zone1, zone2)
        else:
            grid.name = 'grid_%04d' % zone1
        grid.setObsDir(grid.obsDir + '_%s' % component)
        grid.setOutDir(grid.outDir + '_%s' % component)
        grid.setLogDir(grid.logDir + '_%s' % component)
        grid.randPhone = -958089828
        # grid.seed()
        
        for z in xrange(zone1, zone2):
            print 'Creating inputs for %s, zone %d' % (component, z)
            run = self._createRun(component, l_obs, f_obs, f_err, f_flag, z, grid.obsDirAbs)
            if run is not None:
                grid.runs.append(run)
            else:
                print 'Skipping zone %d of %s' % (z, component)
        return grid


    def _createRun(self, component, l_obs, f_obs, f_err, f_flag, z, obs_dir):
        n_good = (f_flag == 0.0).sum()
        if n_good <= 400:
            return None
        new_run = self._runTemplate.copy()
        new_run.inFile = '%s_%04d_%s.%s.in' % (self.galaxyId, z, self.sample, component)
        new_run.outFile = '%s_%04d_%s.%s.out' % (self.galaxyId, z, self.sample, component)
        write_table(l_obs, f_obs[:, z], f_err[:, z], f_flag[:, z],
                    path.join(obs_dir, new_run.inFile))
        return new_run


    def gridIterator(self, chunk_size):
        for component in ['bulge', 'disk', 'total']:
            l_obs, f_obs, f_err, f_flag = self._getZoneSpectra(component)
            N_zone = f_obs.shape[1]
            print 'Component %s: %d zones in chunks of %d' % (component, N_zone, chunk_size)
            for z in xrange(0, N_zone, chunk_size):
                yield self._getGrid(component, l_obs, f_obs, f_err, f_flag, z, z + chunk_size)
Exemplo n.º 4
0
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