def test_pick_models(): # download the needed files vega_fname = download_rename("vega.hd5") filename = download_rename("beast_example_phat_seds.grid.hd5") filters = [ "HST_WFC3_F275W", "HST_WFC3_F336W", "HST_ACS_WFC_F475W", "HST_ACS_WFC_F814W", "HST_WFC3_F110W", "HST_WFC3_F160W", ] mag_cuts = [1.0] make_ast_input_list.pick_models( filename, filters, mag_cuts, vega_fname=vega_fname, outfile="/tmp/test_inputAST.txt", ranseed=1234, ) table_new = Table.read("/tmp/test_inputAST.txt", format="ascii") # download cached version of the file and compare it to new file cached_table_filename = download_rename("cache_inputAST.txt") table_cache = Table.read(cached_table_filename, format="csv", delimiter=" ") compare_tables(table_new, table_cache)
def test_ast_pick_models(self): """ Generate the artifial star test (AST) inputs using a cached version of the sed grid and compare the result to a cached version. """ # download files specific to this test cached_table_filename = download_rename( "phat_small/cache_inputAST.txt") mag_cuts = [1.0] seds_fname = self.seds_fname_cache if self.dset != "phat": seds_fname = download_rename( "phat_small/beast_example_phat_seds.grid.hd5") else: seds_fname = self.seds_fname_cache outname = tempfile.NamedTemporaryFile(suffix=".txt").name make_ast_input_list.pick_models( seds_fname, self.settings.filters, mag_cuts, outfile=outname, ranseed=1234, ) table_new = Table.read(outname, format="ascii") # download cached version of the file and compare it to new file table_cache = Table.read(cached_table_filename, format="csv", delimiter=" ") compare_tables(table_new, table_cache)
def test_pick_models(): # download the needed files vega_fname = download_rename('vega.hd5') filename = download_rename('beast_example_phat_seds.grid.hd5') filters = ['HST_WFC3_F275W', 'HST_WFC3_F336W', 'HST_ACS_WFC_F475W', 'HST_ACS_WFC_F814W', 'HST_WFC3_F110W', 'HST_WFC3_F160W'] mag_cuts = [1.] table_out = make_ast_input_list.pick_models(filename, filters, mag_cuts, vega_fname=vega_fname, outfile='/tmp/test_inputAST.txt', ranseed=1234) table_new = Table.read('/tmp/test_inputAST.txt', format='ascii') # download cached version of the file and compare it to new file cached_table_filename = download_rename('cache_inputAST.txt') table_cache = Table.read(cached_table_filename, format='csv', delimiter=' ') compare_tables(table_new, table_cache)
modelsedgridfile, settings.filters, mag_cuts, Nfilters, N_fluxes, min_N_per_flux, outfile_chosenSEDs, bins_outfile, bright_cut=bright_cuts, ) else: chosen_seds = make_ast_input_list.pick_models( modelsedgridfile, settings.filters, mag_cuts, Nfilters, N_per_age, Nrealize, outfile_chosenSEDs, ) # Assign positions for ASTs outfile_inputAST = os.path.join(outdir, settings.project + "_inputAST.txt") make_ast_xy_list.pick_positions_from_map( chosen_seds, input_map=settings.ast_bg_map_file, N_bins=settings.ast_bg_nbins, Npermodel=10, outfile=outfile_inputAST, refimage=settings.ast_reference_image,
def run_beast_production(basename, physicsmodel=False, ast=False, observationmodel=False, trim=False, fitting=False, resume=False, source_density='', sub_source_density=''): """ Turns the original command-line version of run_beast_production.py into something callable from within a function Parameters ---------- basename : string name of the gst file (assuming it's located in ./data/) For the info related to the other inputs, see the argparse info at the bottom """ # before doing ANYTHING, force datamodel to re-import (otherwise, any # changes within this python session will not be loaded!) importlib.reload(datamodel) # check input parameters, print what is the problem, stop run_beast verify_params.verify_input_format(datamodel) # update the filenames as needed for production # - photometry sub-file datamodel.obsfile = basename.replace( '.fits', '_with_sourceden' + '_SD_' + source_density.replace('_', '-') + '_sub' + sub_source_density + '.fits') # - stats files stats_filebase = "%s/%s"%(datamodel.project,datamodel.project) \ + '_sd' + source_density.replace('_','-') \ + '_sub' + sub_source_density sed_trimname = stats_filebase + '_sed_trim.grid.hd5' # - trimmed noise model noisemodel_trimname = stats_filebase + '_noisemodel_trim.hd5' # - SED grid #modelsedgrid_filename = "%s/%s_seds.grid.hd5"%(datamodel.project, # datamodel.project) modelsedgrid_filename = "METAL_seds.grid.hd5" print("***run information***") print(" project = " + datamodel.project) print(" obsfile = " + datamodel.obsfile) print(" astfile = " + datamodel.astfile) print(" noisefile = " + datamodel.noisefile) print(" trimmed sedfile = " + sed_trimname) print("trimmed noisefiles = " + noisemodel_trimname) print(" stats filebase = " + stats_filebase) # make sure the project directory exists pdir = create_project_dir(datamodel.project) if physicsmodel: # download and load the isochrones (iso_fname, oiso) = make_iso_table(datamodel.project, oiso=datamodel.oiso, logtmin=datamodel.logt[0], logtmax=datamodel.logt[1], dlogt=datamodel.logt[2], z=datamodel.z) if hasattr(datamodel, 'add_spectral_properties_kwargs'): extra_kwargs = datamodel.add_spectral_properties_kwargs else: extra_kwargs = None if hasattr(datamodel, 'velocity'): redshift = (datamodel.velocity / const.c).decompose().value else: redshift = 0 # generate the spectral library (no dust extinction) (spec_fname, g_spec) = make_spectral_grid( datamodel.project, oiso, osl=datamodel.osl, redshift=redshift, distance=datamodel.distances, distance_unit=datamodel.distance_unit, add_spectral_properties_kwargs=extra_kwargs) # add the stellar priors as weights # also computes the grid weights for the stellar part (pspec_fname, g_pspec) = add_stellar_priors(datamodel.project, g_spec) # generate the SED grid by integrating the filter response functions # effect of dust extinction applied before filter integration # also computes the dust priors as weights (seds_fname, g_seds) = make_extinguished_sed_grid( datamodel.project, g_pspec, datamodel.filters, extLaw=datamodel.extLaw, av=datamodel.avs, rv=datamodel.rvs, fA=datamodel.fAs, rv_prior_model=datamodel.rv_prior_model, av_prior_model=datamodel.av_prior_model, fA_prior_model=datamodel.fA_prior_model, spec_fname=modelsedgrid_filename, add_spectral_properties_kwargs=extra_kwargs) if ast: N_models = datamodel.ast_models_selected_per_age Nfilters = datamodel.ast_bands_above_maglimit Nrealize = datamodel.ast_realization_per_model mag_cuts = datamodel.ast_maglimit obsdata = datamodel.get_obscat(basename, datamodel.filters) if len(mag_cuts) == 1: tmp_cuts = mag_cuts min_mags = np.zeros(len(datamodel.filters)) for k, filtername in enumerate(obsdata.filters): sfiltername = obsdata.data.resolve_alias(filtername) sfiltername = sfiltername.replace('rate', 'vega') sfiltername = sfiltername.replace('RATE', 'VEGA') keep, = np.where(obsdata[sfiltername] < 99.) min_mags[k] = np.percentile(obsdata[keep][sfiltername], 90.) # max. mags from the gst observation cat. mag_cuts = min_mags + tmp_cuts outfile = './' + datamodel.project + '/' + datamodel.project + '_inputAST.txt' outfile_params = './' + datamodel.project + '/' + datamodel.project + '_ASTparams.fits' chosen_seds = pick_models(modelsedgrid_filename, datamodel.filters, mag_cuts, Nfilter=Nfilters, N_stars=N_models, Nrealize=Nrealize, outfile=outfile, outfile_params=outfile_params) if datamodel.ast_with_positions == True: separation = datamodel.ast_pixel_distribution filename = datamodel.project + '/' + datamodel.project + '_inputAST.txt' if datamodel.ast_reference_image is not None: # With reference image, use the background or source density map if available if datamodel.ast_density_table is not None: pick_positions_from_map( obsdata, chosen_seds, datamodel.ast_density_table, datamodel.ast_N_bins, datamodel.ast_realization_per_model, outfile=filename, refimage=datamodel.ast_reference_image, refimage_hdu=0, Nrealize=1, set_coord_boundary=datamodel.ast_coord_boundary) else: pick_positions(obsdata, filename, separation, refimage=datamodel.ast_reference_image) else: # Without reference image, we can only use this function if datamodel.ast_density_table is None: pick_positions(obsdata, filename, separation) else: print( "To use ast_density_table, ast_reference_image must be specified." ) if observationmodel: print('Generating noise model from ASTs and absflux A matrix') # get the modesedgrid on which to generate the noisemodel modelsedgrid = FileSEDGrid(modelsedgrid_filename) # generate the AST noise model noisemodel.make_toothpick_noise_model( \ datamodel.noisefile, datamodel.astfile, modelsedgrid, use_rate=True, absflux_a_matrix=datamodel.absflux_a_matrix) if trim: print('Trimming the model and noise grids') # read in the observed data obsdata = datamodel.get_obscat(basename, datamodel.filters) # get the modesedgrid on which to generate the noisemodel modelsedgrid = FileSEDGrid(modelsedgrid_filename) # read in the noise model just created noisemodel_vals = noisemodel.get_noisemodelcat(datamodel.noisefile) # trim the model sedgrid trim_grid.trim_models(modelsedgrid, noisemodel_vals, obsdata, sed_trimname, noisemodel_trimname, sigma_fac=3.) if fitting: start_time = time.clock() # read in the the AST noise model noisemodel_vals = noisemodel.get_noisemodelcat(noisemodel_trimname) # read in the observed data obsdata = datamodel.get_obscat(datamodel.obsfile, datamodel.filters) # output files statsfile = stats_filebase + '_stats.fits' pdf1dfile = statsfile.replace('stats.fits', 'pdf1d.fits') lnpfile = statsfile.replace('stats.fits', 'lnp.hd5') fit.summary_table_memory(obsdata, noisemodel_vals, sed_trimname, resume=resume, threshold=-10., save_every_npts=100, lnp_npts=500, stats_outname=statsfile, pdf1d_outname=pdf1dfile, lnp_outname=lnpfile, surveyname=datamodel.surveyname) new_time = time.clock() print('time to fit: ', (new_time - start_time) / 60., ' min')
def make_ast_inputs(flux_bin_method=True): """ Make the list of artificial stars to be run through the photometry pipeline Parameters ---------- flux_bin_method : boolean (default=True) If True, use the flux bin method to select SEDs. If False, randomly select SEDs from the model grid. """ # before doing ANYTHING, force datamodel to re-import (otherwise, any # changes within this python session will not be loaded!) importlib.reload(datamodel) # check input parameters verify_params.verify_input_format(datamodel) # read in the photometry catalog obsdata = datamodel.get_obscat(datamodel.obsfile, datamodel.filters) # -------------------- # select SEDs # -------------------- Nrealize = datamodel.ast_realization_per_model Nfilters = datamodel.ast_bands_above_maglimit # file names for stars and corresponding SED parameters outfile_seds = "./{0}/{0}_inputAST_seds.txt".format(datamodel.project) outfile_params = "./{0}/{0}_ASTparams.fits".format(datamodel.project) # if the SED file doesn't exist, create SEDs if not os.path.isfile(outfile_seds): print("Selecting SEDs for ASTs") if flux_bin_method: N_fluxes = datamodel.ast_n_flux_bins min_N_per_flux = datamodel.ast_n_per_flux_bin bins_outfile = "./{0}/{0}_ASTfluxbins.txt".format(datamodel.project) modelsedgrid_filename = "./{0}/{0}_seds.grid.hd5".format(datamodel.project) chosen_seds = pick_models_toothpick_style( modelsedgrid_filename, datamodel.filters, Nfilters, N_fluxes, min_N_per_flux, outfile=outfile_seds, outfile_params=outfile_params, bins_outfile=bins_outfile, ) else: # construct magnitude cuts mag_cuts = datamodel.ast_maglimit if len(mag_cuts) == 1: tmp_cuts = mag_cuts min_mags = np.zeros(len(datamodel.filters)) for k, filtername in enumerate(obsdata.filters): sfiltername = obsdata.data.resolve_alias(filtername) sfiltername = sfiltername.replace("rate", "vega") sfiltername = sfiltername.replace("RATE", "VEGA") (keep,) = np.where(obsdata[sfiltername] < 99.0) min_mags[k] = np.percentile(obsdata[keep][sfiltername], 90.0) # max. mags from the gst observation cat. mag_cuts = min_mags + tmp_cuts N_models = datamodel.ast_models_selected_per_age chosen_seds = pick_models( modelsedgrid_filename, datamodel.filters, mag_cuts, Nfilter=Nfilters, N_stars=N_models, Nrealize=Nrealize, outfile=outfile_seds, outfile_params=outfile_params, ) # if the SED file does exist, read them in else: print("Reading existing AST SEDs") chosen_seds = Table.read(outfile_seds, format="ascii") # -------------------- # assign positions # -------------------- # if we want ASTs with positions included (rather than just the fluxes from # the section above) if datamodel.ast_with_positions: print("Assigning positions to artifical stars") outfile = "./{0}/{0}_inputAST.txt".format(datamodel.project) # if we're replicating SEDs across source density or background bins if datamodel.ast_density_table is not None: make_ast_xy_list.pick_positions_from_map( obsdata, chosen_seds, datamodel.ast_density_table, datamodel.ast_N_bins, datamodel.ast_realization_per_model, outfile=outfile, refimage=datamodel.ast_reference_image, refimage_hdu=1, wcs_origin=1, Nrealize=1, set_coord_boundary=datamodel.ast_coord_boundary, region_from_filters="all", ) # if we're not using SD/background maps, SEDs will be distributed # based on catalog sources else: make_ast_xy_list.pick_positions( obsdata, outfile, datamodel.ast_pixel_distribution, refimage=datamodel.ast_reference_image, )
def make_ast_inputs(beast_settings_info, pick_method="flux_bin_method"): """ Make the list of artificial stars to be run through the photometry pipeline Parameters ---------- beast_settings_info : string or beast.tools.beast_settings.beast_settings instance if string: file name with beast settings if class: beast.tools.beast_settings.beast_settings instance pick_method : string (default = "flux_bin_method") By default, use the flux bin method to select SEDs. If set to "random_seds", randomly select SEDs from the model grid. If set to "suppl_seds", supplement the existing input ASTs by randomly selecting additional SEDs from the list of non-selected models. """ # process beast settings info if isinstance(beast_settings_info, str): settings = beast_settings.beast_settings(beast_settings_info) elif isinstance(beast_settings_info, beast_settings.beast_settings): settings = beast_settings_info else: raise TypeError( "beast_settings_info must be string or beast.tools.beast_settings.beast_settings instance" ) # read in the photometry catalog obsdata = Observations(settings.obsfile, settings.filters, obs_colnames=settings.obs_colnames) # -------------------- # select SEDs # -------------------- modelsedgrid_filename = "./{0}/{0}_seds.grid.hd5".format(settings.project) Nrealize = settings.ast_realization_per_model # file names for stars and corresponding SED parameters if pick_method == "suppl_seds": outfile_seds = "./{0}/{0}_inputAST_seds_suppl.txt".format( settings.project) outfile_params = "./{0}/{0}_ASTparams_suppl.fits".format( settings.project) else: outfile_seds = "./{0}/{0}_inputAST_seds.txt".format(settings.project) outfile_params = "./{0}/{0}_ASTparams.fits".format(settings.project) # if the SED file doesn't exist, create SEDs if not os.path.isfile(outfile_seds): print("Selecting SEDs for ASTs") if pick_method == "flux_bin_method": N_fluxes = settings.ast_n_flux_bins min_N_per_flux = settings.ast_n_per_flux_bin bins_outfile = "./{0}/{0}_ASTfluxbins.txt".format(settings.project) chosen_seds = pick_models_toothpick_style( modelsedgrid_filename, settings.filters, N_fluxes, min_N_per_flux, outfile=outfile_seds, outfile_params=outfile_params, bins_outfile=bins_outfile, ) if pick_method == "random_pick": # construct magnitude cuts mag_cuts = settings.ast_maglimit Nfilters = settings.ast_bands_above_maglimit if len(mag_cuts) == 1: tmp_cuts = mag_cuts min_mags = np.zeros(len(settings.filters)) for k, filtername in enumerate(obsdata.filters): sfiltername = obsdata.filter_aliases[filtername] sfiltername = sfiltername.replace("rate", "vega") sfiltername = sfiltername.replace("RATE", "VEGA") (keep, ) = np.where(obsdata[sfiltername] < 99.0) min_mags[k] = np.percentile(obsdata[keep][sfiltername], 90.0) # max. mags from the gst observation cat. mag_cuts = min_mags + tmp_cuts N_models = settings.ast_models_selected_per_age chosen_seds = pick_models( modelsedgrid_filename, settings.filters, mag_cuts, Nfilter=Nfilters, N_stars=N_models, Nrealize=Nrealize, outfile=outfile_seds, outfile_params=outfile_params, ) if pick_method == "suppl_seds": print("Supplementing ASTs") nAST = settings.ast_N_supplement existingASTfile = settings.ast_existing_file mag_cuts = settings.ast_suppl_maglimit color_cuts = settings.ast_suppl_colorlimit chosen_seds = supplement_ast( modelsedgrid_filename, settings.filters, nAST=nAST, existingASTfile=existingASTfile, outASTfile=outfile_seds, outASTfile_params=outfile_params, mag_cuts=mag_cuts, color_cuts=color_cuts, ) # if the SED file does exist, read them in else: print("Reading existing AST SEDs") chosen_seds = Table.read(outfile_seds, format="ascii") # -------------------- # assign positions # -------------------- # if we want ASTs with positions included (rather than just the fluxes from # the section above) if settings.ast_with_positions: print("Assigning positions to artifical stars") outfile = "./{0}/{0}_inputAST.txt".format(settings.project) if pick_method == "suppl_seds": outfile = "./{0}/{0}_inputAST_suppl.txt".format(settings.project) # if we're replicating SEDs across source density or background bins if settings.ast_density_table is not None: if hasattr(settings, "ast_reference_image_hdu_extension"): hdu_ext = settings.ast_reference_image_hdu_extension else: hdu_ext = 1 make_ast_xy_list.pick_positions_from_map( obsdata, chosen_seds, settings.ast_density_table, settings.sd_binmode, settings.sd_Nbins, settings.sd_binwidth, settings.sd_custom, settings.ast_realization_per_model, outfile=outfile, refimage=settings.ast_reference_image, refimage_hdu=hdu_ext, wcs_origin=1, Nrealize=1, set_coord_boundary=settings.ast_coord_boundary, region_from_filters="all", erode_boundary=settings.ast_erode_selection_region, ) # if we're not using SD/background maps, SEDs will be distributed # based on catalog sources else: make_ast_xy_list.pick_positions( obsdata, outfile_seds, outfile, settings.ast_pixel_distribution, refimage=settings.ast_reference_image, )
datamodel.filters) min_mags = np.zeros(len(datamodel.filters)) for k, filtername in enumerate(obsdata.filters): sfiltername = obsdata.data.resolve_alias(filtername) sfiltername = sfiltername.replace('rate', 'vega') sfiltername = sfiltername.replace('RATE', 'VEGA') keep, = np.where(obsdata[sfiltername] < 99.) min_mags[k] = np.percentile(obsdata[keep][sfiltername], 90.) # max. mags from the gst observation cat. mag_cuts = min_mags + tmp_cuts pick_models(modelsedgrid, mag_cuts, Nfilter=Nfilters, N_stars=N_models, Nrealize=Nrealize) if datamodel.ast_with_positions == True: separation = datamodel.ast_pixel_distribution filename = datamodel.project + '/' + datamodel.project + '_inputAST.txt' if datamodel.ast_reference_image is not None: pick_positions(filename, separation, refimage=datamodel.ast_reference_image) else: pick_positions(filename, separation) if args.observationmodel:
min_mags = np.zeros(len(datamodel.filters)) for k, filtername in enumerate(obsdata.filters): sfiltername = obsdata.data.resolve_alias(filtername) sfiltername = sfiltername.replace('rate', 'vega') sfiltername = sfiltername.replace('RATE', 'VEGA') keep, = np.where(obsdata[sfiltername] < 99.) min_mags[k] = np.percentile(obsdata[keep][sfiltername], 90.) # max. mags from the gst observation cat. mag_cuts = min_mags + tmp_cuts outfile = './' + datamodel.project + '/' + datamodel.project + '_inputAST.txt' pick_models(modelsedgridfile, datamodel.filters, mag_cuts, Nfilter=Nfilters, N_stars=N_models, Nrealize=Nrealize, outfile=outfile) if datamodel.ast_with_positions == True: separation = datamodel.ast_pixel_distribution filename = datamodel.project + '/' + datamodel.project + '_inputAST.txt' if datamodel.ast_reference_image is not None: pick_positions(obsdata, filename, separation, refimage=datamodel.ast_reference_image) else: pick_positions(obsdata, filename, separation)
min_mags = np.zeros(len(datamodel.filters)) for k, filtername in enumerate(obsdata.filters): sfiltername = obsdata.data.resolve_alias(filtername) sfiltername = sfiltername.replace('rate', 'vega') sfiltername = sfiltername.replace('RATE', 'VEGA') keep, = np.where(obsdata[sfiltername] < 99.) min_mags[k] = np.percentile(obsdata[keep][sfiltername], 90.) # max. mags from the gst observation cat. mag_cuts = min_mags + tmp_cuts print(modelsedgrid) outfile = './' + datamodel.project + '/' + datamodel.project + '_inputAST.txt' outfile_params = './' + datamodel.project + '/' + datamodel.project + '_ASTparams.fits' chosen_seds = pick_models(modelsedgridfile, datamodel.filters, mag_cuts, Nfilter=Nfilters, N_stars=N_models, Nrealize=Nrealize, outfile=outfile, outfile_params=outfile_params) if datamodel.ast_with_positions == True: separation = datamodel.ast_pixel_distribution filename = datamodel.project + '/' + datamodel.project + '_inputAST.txt' if datamodel.ast_reference_image is not None: # With reference image, use the background or source density map if available if datamodel.ast_density_table is not None: pick_positions_from_map(obsdata, chosen_seds, datamodel.ast_density_table, datamodel.ast_N_bins, datamodel.ast_realization_per_model, outfile=filename,
def make_ast_inputs(flux_bin_method=True): """ Make the list of artificial stars to be run through the photometry pipeline Parameters ---------- flux_bin_method : boolean (default=True) If True, use the flux bin method to select SEDs. If False, randomly select SEDs from the model grid. """ # before doing ANYTHING, force datamodel to re-import (otherwise, any # changes within this python session will not be loaded!) importlib.reload(datamodel) # check input parameters verify_params.verify_input_format(datamodel) # construct magnitude cuts mag_cuts = datamodel.ast_maglimit obsdata = datamodel.get_obscat(datamodel.obsfile, datamodel.filters) if len(mag_cuts) == 1: tmp_cuts = mag_cuts min_mags = np.zeros(len(datamodel.filters)) for k, filtername in enumerate(obsdata.filters): sfiltername = obsdata.data.resolve_alias(filtername) sfiltername = sfiltername.replace("rate", "vega") sfiltername = sfiltername.replace("RATE", "VEGA") keep, = np.where(obsdata[sfiltername] < 99.0) min_mags[k] = np.percentile(obsdata[keep][sfiltername], 90.0) # max. mags from the gst observation cat. mag_cuts = min_mags + tmp_cuts # -------------------- # select SEDs # -------------------- Nrealize = datamodel.ast_realization_per_model Nfilters = datamodel.ast_bands_above_maglimit # file names for stars and corresponding SED parameters outfile = "./" + datamodel.project + "/" + datamodel.project + "_inputAST.txt" outfile_params = ( "./" + datamodel.project + "/" + datamodel.project + "_ASTparams.fits" ) if flux_bin_method: N_fluxes = datamodel.ast_n_flux_bins min_N_per_flux = datamodel.ast_n_per_flux_bin bins_outfile = ( "./" + datamodel.project + "/" + datamodel.project + "_ASTfluxbins.txt" ) chosen_seds = pick_models_toothpick_style( modelsedgrid_filename, datamodel.filters, mag_cuts, Nfilters, N_fluxes, min_N_per_flux, outfile=outfile, outfile_params=outfile_params, bins_outfile=bins_outfile, ) else: N_models = datamodel.ast_models_selected_per_age chosen_seds = pick_models( modelsedgrid_filename, datamodel.filters, mag_cuts, Nfilter=Nfilters, N_stars=N_models, Nrealize=Nrealize, outfile=outfile, outfile_params=outfile_params, ) # -------------------- # assign positions # -------------------- if datamodel.ast_with_positions: separation = datamodel.ast_pixel_distribution filename = datamodel.project + "/" + datamodel.project + "_inputAST.txt" if datamodel.ast_reference_image is not None: # With reference image, use one of these options if datamodel.ast_source_density_table is not None: pick_positions_from_map( obsdata, chosen_seds, datamodel.ast_source_density_table, datamodel.ast_N_bins, datamodel.ast_realization_per_model, outfile=filename, refimage=datamodel.ast_reference_image, refimage_hdu=0, Nrealize=1, set_coord_boundary=datamodel.ast_coord_boundary, ) elif datamodel.ast_background_table is not None: pick_positions_from_map( obsdata, chosen_seds, datamodel.ast_background_table, datamodel.ast_N_bins, datamodel.ast_realization_per_model, outfile=filename, refimage=datamodel.ast_reference_image, refimage_hdu=0, Nrealize=1, set_coord_boundary=datamodel.ast_coord_boundary, ) else: pick_positions( obsdata, filename, separation, refimage=datamodel.ast_reference_image, ) else: # Without reference image, we can only use this function if ( datamodel.ast_source_density_table is None and datamodel.ast_background_table is None ): pick_positions(obsdata, filename, separation) else: print( "To use ast_source_density_table or ast_background_table, ast_reference_image must be specified." )