Galaxy Data Definitions

Define allowed quantities for FRB galaxies.

Uncertainty is valid for any quantity with _err add-on (e.g. W1_err). Also supports _loerr and _uperr suffixes.

Overview

This module defines constants, valid field names, and data structures used throughout the FRB galaxies package. It serves as a central registry for allowed values in galaxy data dictionaries and provides validation lists for data integrity.

Constants and Valid Fields

Photometric Data

frb.galaxies.defs.valid_photom = ['SDSS_u', 'SDSS_g', 'SDSS_r', 'SDSS_i', 'SDSS_z', 'WASP_g', 'WASP_r', 'WASP_i', 'WASP_z', 'Pan-STARRS_g', 'Pan-STARRS_r', 'Pan-STARRS_i', 'Pan-STARRS_z', 'Pan-STARRS_y', 'HSC_g', 'HSC_r', 'HSC_i', 'HSC_z', 'HSC_Y', 'VLT_FORS2_u', 'VLT_FORS2_g', 'VLT_FORS2_R', 'VLT_FORS2_I', 'VLT_FORS2_z', 'VLT_HAWKI_J', 'VLT_HAWKI_H', 'VLT_HAWKI_Ks', 'GMOS_S_u', 'GMOS_S_g', 'GMOS_S_r', 'GMOS_S_i', 'GMOS_S_z', 'GMOS_N_u', 'GMOS_N_g', 'GMOS_N_r', 'GMOS_N_i', 'GMOS_N_z', 'NOT_u', 'NOT_g', 'NOT_r', 'NOT_i', 'NOT_z', 'NIRI_J', 'Subaru_MOIRCS_J', 'LRISb_U', 'LRISb_G', 'LRISb_V', 'LRISb_B', 'LRISr_V', 'LRISr_R', 'LRISr_I', 'DEIMOS_r', 'VISTA_Y', 'VISTA_J', 'VISTA_H', 'VISTA_Ks', 'MMIRS_J', 'MMIRS_H', 'MMIRS_K', '2MASS_j', 'WIRC_j', '2MASS_h', 'WIRC_h', '2MASS_k', 'WIRC_k', '6dF_Bj', '6dF_Rf', '6dF_H', '6dF_J', '6dF_K', 'WFC3_F300X', 'WFC3_F110W', 'WFC3_F160W', 'WFC3_F763M', 'WISE_W1', 'WISE_W2', 'WISE_W3', 'WISE_W4', 'Spitzer_3.6', 'Spitzer_4.5', 'GALEX_FUV', 'GALEX_NUV', 'DECam_u', 'DECam_g', 'DECam_r', 'DECam_i', 'DECam_z', 'NSC_u', 'NSC_g', 'NSC_r', 'NSC_i', 'NSC_z', 'NSC_Y', 'NSC_VR', 'DES_g', 'DES_r', 'DES_i', 'DES_z', 'DES_Y', 'DELVE_g', 'DELVE_r', 'DELVE_i', 'DELVE_z', 'DECaL_g', 'DECaL_r', 'DECaL_z', 'Euclid_VIS', 'Euclid_J', 'Euclid_H', 'Euclid_Y', 'SOAR_U', 'SOAR_g', 'SOAR_r', 'SOAR_i', 'SOAR_z', 'SOAR_bessell_B', 'SOAR_bessell_V', 'SOAR_bessell_R', 'SOAR_cousins_R', 'SOAR_stromgren_v', 'SOAR_stromgren_b', 'SOAR_stromgren_y', 'EBV']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

List of valid photometric filter names including:

  • Survey filters: DES (u,g,r,i,z,Y), SDSS (u,g,r,i,z), DECaLS (g,r,z)

  • Near-IR: VISTA (Y,J,H,Ks), 2MASS (J,H,K), WISE (W1,W2,W3,W4)

  • Space-based: HST various filters, Spitzer IRAC channels

  • Ground-based: Pan-STARRS (g,r,i,z,y), LSST projected bands

frb.galaxies.defs.valid_flux = ['SDSS_u_flux', 'SDSS_g_flux', 'SDSS_r_flux', 'SDSS_i_flux', 'SDSS_z_flux', 'WASP_g_flux', 'WASP_r_flux', 'WASP_i_flux', 'WASP_z_flux', 'Pan-STARRS_g_flux', 'Pan-STARRS_r_flux', 'Pan-STARRS_i_flux', 'Pan-STARRS_z_flux', 'Pan-STARRS_y_flux', 'HSC_g_flux', 'HSC_r_flux', 'HSC_i_flux', 'HSC_z_flux', 'HSC_Y_flux', 'VLT_FORS2_u_flux', 'VLT_FORS2_g_flux', 'VLT_FORS2_R_flux', 'VLT_FORS2_I_flux', 'VLT_FORS2_z_flux', 'VLT_HAWKI_J_flux', 'VLT_HAWKI_H_flux', 'VLT_HAWKI_Ks_flux', 'GMOS_S_u_flux', 'GMOS_S_g_flux', 'GMOS_S_r_flux', 'GMOS_S_i_flux', 'GMOS_S_z_flux', 'GMOS_N_u_flux', 'GMOS_N_g_flux', 'GMOS_N_r_flux', 'GMOS_N_i_flux', 'GMOS_N_z_flux', 'NOT_u_flux', 'NOT_g_flux', 'NOT_r_flux', 'NOT_i_flux', 'NOT_z_flux', 'NIRI_J_flux', 'Subaru_MOIRCS_J_flux', 'LRISb_U_flux', 'LRISb_G_flux', 'LRISb_V_flux', 'LRISb_B_flux', 'LRISr_V_flux', 'LRISr_R_flux', 'LRISr_I_flux', 'DEIMOS_r_flux', 'VISTA_Y_flux', 'VISTA_J_flux', 'VISTA_H_flux', 'VISTA_Ks_flux', 'MMIRS_J_flux', 'MMIRS_H_flux', 'MMIRS_K_flux', '2MASS_j_flux', 'WIRC_j_flux', '2MASS_h_flux', 'WIRC_h_flux', '2MASS_k_flux', 'WIRC_k_flux', '6dF_Bj_flux', '6dF_Rf_flux', '6dF_H_flux', '6dF_J_flux', '6dF_K_flux', 'WFC3_F300X_flux', 'WFC3_F110W_flux', 'WFC3_F160W_flux', 'WFC3_F763M_flux', 'WISE_W1_flux', 'WISE_W2_flux', 'WISE_W3_flux', 'WISE_W4_flux', 'Spitzer_3.6_flux', 'Spitzer_4.5_flux', 'GALEX_FUV_flux', 'GALEX_NUV_flux', 'DECam_u_flux', 'DECam_g_flux', 'DECam_r_flux', 'DECam_i_flux', 'DECam_z_flux', 'NSC_u_flux', 'NSC_g_flux', 'NSC_r_flux', 'NSC_i_flux', 'NSC_z_flux', 'NSC_Y_flux', 'NSC_VR_flux', 'DES_g_flux', 'DES_r_flux', 'DES_i_flux', 'DES_z_flux', 'DES_Y_flux', 'DELVE_g_flux', 'DELVE_r_flux', 'DELVE_i_flux', 'DELVE_z_flux', 'DECaL_g_flux', 'DECaL_r_flux', 'DECaL_z_flux', 'Euclid_VIS_flux', 'Euclid_J_flux', 'Euclid_H_flux', 'Euclid_Y_flux', 'SOAR_U_flux', 'SOAR_g_flux', 'SOAR_r_flux', 'SOAR_i_flux', 'SOAR_z_flux', 'SOAR_bessell_B_flux', 'SOAR_bessell_V_flux', 'SOAR_bessell_R_flux', 'SOAR_cousins_R_flux', 'SOAR_stromgren_v_flux', 'SOAR_stromgren_b_flux', 'SOAR_stromgren_y_flux']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Corresponding flux measurements for each photometric band, in mJy units.

frb.galaxies.defs.valid_filters = ['SDSS_u', 'SDSS_g', 'SDSS_r', 'SDSS_i', 'SDSS_z', 'WASP_g', 'WASP_r', 'WASP_i', 'WASP_z', 'Pan-STARRS_g', 'Pan-STARRS_r', 'Pan-STARRS_i', 'Pan-STARRS_z', 'Pan-STARRS_y', 'HSC_g', 'HSC_r', 'HSC_i', 'HSC_z', 'HSC_Y', 'VLT_FORS2_u', 'VLT_FORS2_g', 'VLT_FORS2_R', 'VLT_FORS2_I', 'VLT_FORS2_z', 'VLT_HAWKI_J', 'VLT_HAWKI_H', 'VLT_HAWKI_Ks', 'GMOS_S_u', 'GMOS_S_g', 'GMOS_S_r', 'GMOS_S_i', 'GMOS_S_z', 'GMOS_N_u', 'GMOS_N_g', 'GMOS_N_r', 'GMOS_N_i', 'GMOS_N_z', 'NOT_u', 'NOT_g', 'NOT_r', 'NOT_i', 'NOT_z', 'NIRI_J', 'Subaru_MOIRCS_J', 'LRISb_U', 'LRISb_G', 'LRISb_V', 'LRISb_B', 'LRISr_V', 'LRISr_R', 'LRISr_I', 'DEIMOS_r', 'VISTA_Y', 'VISTA_J', 'VISTA_H', 'VISTA_Ks', 'MMIRS_J', 'MMIRS_H', 'MMIRS_K', '2MASS_j', 'WIRC_j', '2MASS_h', 'WIRC_h', '2MASS_k', 'WIRC_k', '6dF_Bj', '6dF_Rf', '6dF_H', '6dF_J', '6dF_K', 'WFC3_F300X', 'WFC3_F110W', 'WFC3_F160W', 'WFC3_F763M', 'WISE_W1', 'WISE_W2', 'WISE_W3', 'WISE_W4', 'Spitzer_3.6', 'Spitzer_4.5', 'GALEX_FUV', 'GALEX_NUV', 'DECam_u', 'DECam_g', 'DECam_r', 'DECam_i', 'DECam_z', 'NSC_u', 'NSC_g', 'NSC_r', 'NSC_i', 'NSC_z', 'NSC_Y', 'NSC_VR', 'DES_g', 'DES_r', 'DES_i', 'DES_z', 'DES_Y', 'DELVE_g', 'DELVE_r', 'DELVE_i', 'DELVE_z', 'DECaL_g', 'DECaL_r', 'DECaL_z', 'Euclid_VIS', 'Euclid_J', 'Euclid_H', 'Euclid_Y', 'SOAR_U', 'SOAR_g', 'SOAR_r', 'SOAR_i', 'SOAR_z', 'SOAR_bessell_B', 'SOAR_bessell_V', 'SOAR_bessell_R', 'SOAR_cousins_R', 'SOAR_stromgren_v', 'SOAR_stromgren_b', 'SOAR_stromgren_y']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Complete list of recognized filter systems across all surveys.

Derived Physical Properties

frb.galaxies.defs.valid_derived_photom = ['z_SED', 'Mtotal', 'Mstar', 'Mstar_spec', 'f_AGN', 'agn_tau', 'u-r', 'Lnu_r', 'M_r', 'AV_young', 'AV_old', 'age_mass', 'SFR_SED', 'SFR_photom', 'SFR_radio', 'lg_sSFR', 'EBV_photom', 'EBV_spec', 'Z_photom', 'Z_spec', 'Z_stellar', 'Z_gas']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Derived quantities from photometric SED fitting:

  • Stellar properties: Mstar, Mtotal, age_mass, Z_stellar

  • Star formation: SFR_photom, SFR_SED, lg_sSFR

  • Dust extinction: EBV_photom, AV_young, AV_old

  • AGN contribution: f_AGN, agn_tau

  • Rest-frame properties: u-r, M_r, Lnu_r

frb.galaxies.defs.valid_derived_nebular = ['AV_nebular', 'SFR_nebular']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Properties derived from nebular emission line analysis:

  • Extinction: AV_nebular from Balmer decrement

  • Star formation: SFR_nebular from Hα, [OII]

  • Metallicity: Z_gas from emission line ratios

  • Excitation: Ionization parameter, electron density

Nebular Emission Lines

frb.galaxies.defs.valid_neb_lines = ['Halpha', 'Hbeta', 'Hgamma', '[NII] 6548', '[NII] 6584', '[OII] 3726', '[OII] 3729', '[OIII] 4959', '[OIII] 5007', '[SII] 6716', '[SII] 6731']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Recognized emission lines for nebular analysis:

  • Hydrogen Balmer series: Ha, Hb, Hg, Hd, H8, H9, H10, H11

  • Oxygen lines: [OII]_3727, [OIII]_4959, [OIII]_5007, [OI]_6300

  • Nitrogen lines: [NII]_6548, [NII]_6583

  • Sulfur lines: [SII]_6717, [SII]_6731, [SIII]_6312

  • Other ions: [NeIII]_3869, [ArIII]_7136, HeI_5876, HeII_4686

Redshift Information

frb.galaxies.defs.valid_z = ['z', 'z_phot', 'z_spec', 'z_FRB']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Valid redshift measurement types:

  • z: Preferred redshift value

  • z_spec: Spectroscopic redshift

  • z_phot: Photometric redshift

  • z_SED: SED fitting redshift

  • Error values: z_err, z_spec_err, z_phot_err

Morphological Properties

frb.galaxies.defs.valid_morphology = ['reff_ang', 'reff_kpc', 'n', 'PA', 'b/a', 'ra', 'dec', 'n', 'q', 'amp', 'phi_G']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Morphological parameters from imaging analysis:

  • Profile fitting: n (Sersic index), Re (effective radius)

  • Ellipticity: ellip, position_angle, inclination

  • Surface brightness: mu_e (effective surface brightness)

  • Concentration: C (concentration index), A (asymmetry)

  • Multi-component: bulge/disk decomposition parameters

Positional Information

frb.galaxies.defs.valid_offsets = ['ang_best', 'ang_avg', 'physical']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Offset measurements between FRB and galaxy positions:

  • ang_best: Angular offset from localization centroid (arcsec)

  • ang_avg: Averaged angular offset over error distribution (arcsec)

  • physical: Physical offset in kpc (uses ang_best)

frb.galaxies.defs.valid_positional_error = ['ra_astrometric', 'dec_astrometric', 'ra_source', 'dec_source']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Position uncertainty components:

  • Astrometric errors: ra_astrometric, dec_astrometric (arcsec)

  • Source errors: ra_source, dec_source (arcsec)

  • Includes systematic and random error contributions

Reference Information

frb.galaxies.defs.valid_ref = ['SDSS_u_ref', 'SDSS_g_ref', 'SDSS_r_ref', 'SDSS_i_ref', 'SDSS_z_ref', 'WASP_g_ref', 'WASP_r_ref', 'WASP_i_ref', 'WASP_z_ref', 'Pan-STARRS_g_ref', 'Pan-STARRS_r_ref', 'Pan-STARRS_i_ref', 'Pan-STARRS_z_ref', 'Pan-STARRS_y_ref', 'HSC_g_ref', 'HSC_r_ref', 'HSC_i_ref', 'HSC_z_ref', 'HSC_Y_ref', 'VLT_FORS2_u_ref', 'VLT_FORS2_g_ref', 'VLT_FORS2_R_ref', 'VLT_FORS2_I_ref', 'VLT_FORS2_z_ref', 'VLT_HAWKI_J_ref', 'VLT_HAWKI_H_ref', 'VLT_HAWKI_Ks_ref', 'GMOS_S_u_ref', 'GMOS_S_g_ref', 'GMOS_S_r_ref', 'GMOS_S_i_ref', 'GMOS_S_z_ref', 'GMOS_N_u_ref', 'GMOS_N_g_ref', 'GMOS_N_r_ref', 'GMOS_N_i_ref', 'GMOS_N_z_ref', 'NOT_u_ref', 'NOT_g_ref', 'NOT_r_ref', 'NOT_i_ref', 'NOT_z_ref', 'NIRI_J_ref', 'Subaru_MOIRCS_J_ref', 'LRISb_U_ref', 'LRISb_G_ref', 'LRISb_V_ref', 'LRISb_B_ref', 'LRISr_V_ref', 'LRISr_R_ref', 'LRISr_I_ref', 'DEIMOS_r_ref', 'VISTA_Y_ref', 'VISTA_J_ref', 'VISTA_H_ref', 'VISTA_Ks_ref', 'MMIRS_J_ref', 'MMIRS_H_ref', 'MMIRS_K_ref', '2MASS_j_ref', 'WIRC_j_ref', '2MASS_h_ref', 'WIRC_h_ref', '2MASS_k_ref', 'WIRC_k_ref', '6dF_Bj_ref', '6dF_Rf_ref', '6dF_H_ref', '6dF_J_ref', '6dF_K_ref', 'WFC3_F300X_ref', 'WFC3_F110W_ref', 'WFC3_F160W_ref', 'WFC3_F763M_ref', 'WISE_W1_ref', 'WISE_W2_ref', 'WISE_W3_ref', 'WISE_W4_ref', 'Spitzer_3.6_ref', 'Spitzer_4.5_ref', 'GALEX_FUV_ref', 'GALEX_NUV_ref', 'DECam_u_ref', 'DECam_g_ref', 'DECam_r_ref', 'DECam_i_ref', 'DECam_z_ref', 'NSC_u_ref', 'NSC_g_ref', 'NSC_r_ref', 'NSC_i_ref', 'NSC_z_ref', 'NSC_Y_ref', 'NSC_VR_ref', 'DES_g_ref', 'DES_r_ref', 'DES_i_ref', 'DES_z_ref', 'DES_Y_ref', 'DELVE_g_ref', 'DELVE_r_ref', 'DELVE_i_ref', 'DELVE_z_ref', 'DECaL_g_ref', 'DECaL_r_ref', 'DECaL_z_ref', 'Euclid_VIS_ref', 'Euclid_J_ref', 'Euclid_H_ref', 'Euclid_Y_ref', 'SOAR_U_ref', 'SOAR_g_ref', 'SOAR_r_ref', 'SOAR_i_ref', 'SOAR_z_ref', 'SOAR_bessell_B_ref', 'SOAR_bessell_V_ref', 'SOAR_bessell_R_ref', 'SOAR_cousins_R_ref', 'SOAR_stromgren_v_ref', 'SOAR_stromgren_b_ref', 'SOAR_stromgren_y_ref']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Reference tags for measurements, following ADS bibcode format.

frb.galaxies.defs.valid_neb_ref = ['Halpha_ref', 'Hbeta_ref', 'Hgamma_ref', '[NII] 6548_ref', '[NII] 6584_ref', '[OII] 3726_ref', '[OII] 3729_ref', '[OIII] 4959_ref', '[OIII] 5007_ref', '[SII] 6716_ref', '[SII] 6731_ref']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

References specific to nebular line measurements.

frb.galaxies.defs.valid_derived_ref = ['z_SED_ref', 'Mtotal_ref', 'Mstar_ref', 'Mstar_spec_ref', 'f_AGN_ref', 'agn_tau_ref', 'u-r_ref', 'Lnu_r_ref', 'M_r_ref', 'AV_young_ref', 'AV_old_ref', 'age_mass_ref', 'SFR_SED_ref', 'SFR_photom_ref', 'SFR_radio_ref', 'lg_sSFR_ref', 'EBV_photom_ref', 'EBV_spec_ref', 'Z_photom_ref', 'Z_spec_ref', 'Z_stellar_ref', 'Z_gas_ref', 'AV_nebular_ref', 'SFR_nebular_ref', 'UV_filter_ref', 'IR_filter_ref', 'UV_SB_ref', 'IR_SB_ref', 'UV_global_ref', 'IR_global_ref', 'SSFR_ref', 'SMStar_ref', 'reff_iso_ref', 'UVff_ref', 'IRff_ref', 'IRfe_ref', 'IRlim_ref']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

References for derived physical property calculations.

Survey-Specific Constants

frb.galaxies.defs.DES_bands = ['g', 'r', 'i', 'z', 'Y']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Dark Energy Survey filter bands: [‘u’, ‘g’, ‘r’, ‘i’, ‘z’, ‘Y’]

frb.galaxies.defs.SDSS_bands = ['u', 'g', 'r', 'i', 'z']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

SDSS filter bands: [‘u’, ‘g’, ‘r’, ‘i’, ‘z’]

frb.galaxies.defs.PanSTARRS_bands = ['g', 'r', 'i', 'z', 'y']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

Pan-STARRS filter bands: [‘g’, ‘r’, ‘i’, ‘z’, ‘y’]

frb.galaxies.defs.WISE_bands = ['W1', 'W2', 'W3', 'W4']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

WISE infrared bands: [‘W1’, ‘W2’, ‘W3’, ‘W4’]

frb.galaxies.defs.VISTA_bands = ['Y', 'J', 'H', 'Ks']

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

VISTA near-infrared bands: [‘Y’, ‘J’, ‘H’, ‘Ks’]

Data Validation

The definitions in this module are used throughout the package for:

Input Validation
  • Checking that dictionary keys correspond to recognized fields

  • Ensuring consistent naming conventions across modules

  • Preventing typos in field names

Data Integrity
  • Validating measurements against expected ranges

  • Cross-checking reference formats

  • Maintaining compatibility with external databases

Documentation
  • Providing complete lists of supported measurements

  • Defining units and conventions for each quantity

  • Enabling automatic documentation generation

Usage Examples

Validation in FRBGalaxy objects:

from frb.galaxies import defs
from frb.galaxies.frbgalaxy import FRBGalaxy

# Create galaxy object
galaxy = FRBGalaxy(ra=180.0, dec=45.0, frb=frb_object)

# Add photometry - keys must be in valid_photom
galaxy.photom['DES_g'] = 22.5
galaxy.photom['DES_r'] = 21.8
galaxy.photom['DES_i'] = 21.3

# Validate photometry dictionary
valid_keys = set(galaxy.photom.keys()).issubset(set(defs.valid_photom))
print(f"All photometry keys valid: {valid_keys}")

Checking available measurements:

# See what emission lines are supported
print("Supported emission lines:")
for line in defs.valid_neb_lines[:10]:  # First 10
    print(f"  {line}")

# Check derived property options
print("\\nPhysical properties from SED fitting:")
for prop in defs.valid_derived_photom[:8]:
    print(f"  {prop}")

Working with survey bands:

# Build photometry for specific survey
des_filters = ['DES_' + band for band in defs.DES_bands]
print(f"DES filters: {des_filters}")

# Check if galaxy has complete DES photometry
has_des = all(filt in galaxy.photom for filt in des_filters)
print(f"Complete DES photometry: {has_des}")

Validation during data ingestion:

def validate_galaxy_data(data_dict, data_type):
    """Validate galaxy data against definitions"""

    if data_type == 'photom':
        valid_list = defs.valid_photom + defs.valid_flux + defs.valid_ref
    elif data_type == 'derived':
        valid_list = defs.valid_derived_photom + defs.valid_derived_nebular
    elif data_type == 'neb_lines':
        valid_list = defs.valid_neb_lines + defs.valid_neb_ref
    elif data_type == 'morphology':
        valid_list = defs.valid_morphology
    else:
        return False

    invalid_keys = set(data_dict.keys()) - set(valid_list)
    if invalid_keys:
        print(f"Invalid keys found: {invalid_keys}")
        return False
    return True

# Example usage
photom_data = {'DES_g': 22.1, 'DES_r': 21.5, 'invalid_filter': 20.0}
is_valid = validate_galaxy_data(photom_data, 'photom')