From 56d7bbac8242b10cd04114c1e3d8d71ef9c455c5 Mon Sep 17 00:00:00 2001 From: Rongpu Zhou Date: Tue, 3 Nov 2026 11:10:36 -0800 Subject: [PATCH 1/4] add back MW_TRANSMISSION columns --- py/desispec/scripts/zcatalog.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/py/desispec/scripts/zcatalog.py b/py/desispec/scripts/zcatalog.py index 32b6773bc..7ac6a04b6 100755 --- a/py/desispec/scripts/zcatalog.py +++ b/py/desispec/scripts/zcatalog.py @@ -818,9 +818,18 @@ def main(args=None): columns_basic = ['TARGETID', 'TILEID', 'HEALPIX', 'LASTNIGHT', 'Z_BEST', 'Z_CONF', 'ZERR_BEST', 'ZWARN_BEST', 'SPECTYPE_BEST', 'SUBTYPE_BEST', 'CHI2_BEST', 'DELTACHI2_BEST', 'PETAL_LOC', 'FIBER', 'COADD_FIBERSTATUS', 'TARGET_RA', 'TARGET_DEC', 'DESINAME', 'OBJTYPE', 'FIBERASSIGN_X', 'FIBERASSIGN_Y', 'PRIORITY', 'DESI_TARGET', 'BGS_TARGET', 'MWS_TARGET', 'SCND_TARGET', 'CMX_TARGET', 'SV1_DESI_TARGET', 'SV1_BGS_TARGET', 'SV1_MWS_TARGET', 'SV1_SCND_TARGET', 'SV2_DESI_TARGET', 'SV2_BGS_TARGET', 'SV2_MWS_TARGET', 'SV2_SCND_TARGET', 'SV3_DESI_TARGET', 'SV3_BGS_TARGET', 'SV3_MWS_TARGET', 'SV3_SCND_TARGET', 'COADD_NUMEXP', 'COADD_EXPTIME', 'COADD_NUMNIGHT', 'COADD_NUMTILE', 'MIN_MJD', 'MAX_MJD', 'MEAN_MJD', 'GOOD_SPEC', 'EFFTIME_SPEC', 'ZCAT_NSPEC', 'ZCAT_PRIMARY'] if args.group == 'uniqpix': columns_basic = ['UNIQPIX' if col == 'HEALPIX' else col for col in columns_basic] - columns_imaging = ['PMRA', 'PMDEC', 'REF_EPOCH', 'RELEASE', 'BRICKNAME', 'BRICKID', 'BRICK_OBJID', 'MORPHTYPE', 'EBV', 'FLUX_G', 'FLUX_R', 'FLUX_Z', 'FLUX_W1', 'FLUX_W2', 'FLUX_IVAR_G', 'FLUX_IVAR_R', 'FLUX_IVAR_Z', 'FLUX_IVAR_W1', 'FLUX_IVAR_W2', 'FIBERFLUX_G', 'FIBERFLUX_R', 'FIBERFLUX_Z', 'FIBERTOTFLUX_G', 'FIBERTOTFLUX_R', 'FIBERTOTFLUX_Z', 'MASKBITS', 'SERSIC', 'SHAPE_R', 'SHAPE_E1', 'SHAPE_E2', 'REF_ID', 'REF_CAT', 'GAIA_PHOT_G_MEAN_MAG', 'GAIA_PHOT_BP_MEAN_MAG', 'GAIA_PHOT_RP_MEAN_MAG', 'PARALLAX', 'PHOTSYS'] + columns_imaging = ['PMRA', 'PMDEC', 'REF_EPOCH', 'RELEASE', 'BRICKNAME', 'BRICKID', 'BRICK_OBJID', 'MORPHTYPE', 'EBV', 'FLUX_G', 'FLUX_R', 'FLUX_Z', 'FLUX_W1', 'FLUX_W2', 'FLUX_IVAR_G', 'FLUX_IVAR_R', 'FLUX_IVAR_Z', 'FLUX_IVAR_W1', 'FLUX_IVAR_W2', 'MW_TRANSMISSION_G', 'MW_TRANSMISSION_R', 'MW_TRANSMISSION_Z', 'MW_TRANSMISSION_W1', 'MW_TRANSMISSION_W2', 'FIBERFLUX_G', 'FIBERFLUX_R', 'FIBERFLUX_Z', 'FIBERTOTFLUX_G', 'FIBERTOTFLUX_R', 'FIBERTOTFLUX_Z', 'MASKBITS', 'SERSIC', 'SHAPE_R', 'SHAPE_E1', 'SHAPE_E2', 'REF_ID', 'REF_CAT', 'GAIA_PHOT_G_MEAN_MAG', 'GAIA_PHOT_BP_MEAN_MAG', 'GAIA_PHOT_RP_MEAN_MAG', 'PARALLAX', 'PHOTSYS'] assert len(np.intersect1d(columns_basic, columns_imaging))==0 + # Add back the MW_TRANSMISSION columns + # Extinction coefficients used for MW_TRANSMISSION_* in Legacy Surveys DR9: + ext_coeffs = {'G': 3.214, 'R': 2.165, 'Z': 1.211, 'W1': 0.184, 'W2': 0.113} + # Some entries have invalid (zero-filled) EBV values and zero-filled fluxes; zero fill their MW_TRANSMISSION_* values + invalid_ebv = (zcat['EBV']==0) & (zcat['FLUX_G']==0) & (zcat['FLUX_R']==0) & (zcat['FLUX_Z']==0) + for band, coeff in ext_coeffs.items(): + zcat['MW_TRANSMISSION_'+band] = np.zeros(len(cat), dtype=np.float32) + zcat['MW_TRANSMISSION_'+band][~invalid_ebv] = (10.**(-coeff * zcat['EBV'][~invalid_ebv] / 2.5)).astype(np.float32) + # Remove main-survey target bits for CMX and SVn surveys (they are not the actual main-survey target bits) if survey in ('cmx', 'sv1', 'sv2', 'sv3'): for col in ['DESI_TARGET', 'BGS_TARGET', 'MWS_TARGET', 'SCND_TARGET']: From dfb356fff1b9945c79fb7541ae3d9e5be851800d Mon Sep 17 00:00:00 2001 From: Rongpu Zhou Date: Tue, 3 Nov 2026 11:12:43 -0800 Subject: [PATCH 2/4] small fix --- py/desispec/scripts/zcatalog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py/desispec/scripts/zcatalog.py b/py/desispec/scripts/zcatalog.py index 7ac6a04b6..f993b4147 100755 --- a/py/desispec/scripts/zcatalog.py +++ b/py/desispec/scripts/zcatalog.py @@ -827,7 +827,7 @@ def main(args=None): # Some entries have invalid (zero-filled) EBV values and zero-filled fluxes; zero fill their MW_TRANSMISSION_* values invalid_ebv = (zcat['EBV']==0) & (zcat['FLUX_G']==0) & (zcat['FLUX_R']==0) & (zcat['FLUX_Z']==0) for band, coeff in ext_coeffs.items(): - zcat['MW_TRANSMISSION_'+band] = np.zeros(len(cat), dtype=np.float32) + zcat['MW_TRANSMISSION_'+band] = np.zeros(len(zcat), dtype=np.float32) zcat['MW_TRANSMISSION_'+band][~invalid_ebv] = (10.**(-coeff * zcat['EBV'][~invalid_ebv] / 2.5)).astype(np.float32) # Remove main-survey target bits for CMX and SVn surveys (they are not the actual main-survey target bits) From 6d8af42988dfe7e72d65c9444ea8d28b7417fe55 Mon Sep 17 00:00:00 2001 From: Rongpu Zhou Date: Tue, 3 Nov 2026 11:25:04 -0800 Subject: [PATCH 3/4] update changes.rst --- doc/changes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/changes.rst b/doc/changes.rst index 5e07ec3ed..bb15f6888 100644 --- a/doc/changes.rst +++ b/doc/changes.rst @@ -19,11 +19,14 @@ desispec Change Log - Cache camera overlap calculation for faster coaddition. - Use ``ls-dr11`` sky cutout (ls-dr11-early-v2 no longer works). - Fix timing log messages MPI barrier logic. +* Add back ``MW_TRANSMISSION_{G,R,Z,W1,W2}`` columns to zcatalogs, computed + from ``EBV`` (PR `#2913`_). .. _`#2901`: https://github.com/desihub/desispec/pull/2901 .. _`#2905`: https://github.com/desihub/desispec/pull/2905 .. _`#2907`: https://github.com/desihub/desispec/pull/2907 .. _`#2911`: https://github.com/desihub/desispec/pull/2911 +.. _`#2913`: https://github.com/desihub/desispec/pull/2913 0.73.3 (2026-10-14) ------------------- From c31b255f1f1f9e2176af2bea21b94cdbf91c94ed Mon Sep 17 00:00:00 2001 From: Rongpu Zhou Date: Tue, 3 Nov 2026 14:25:36 -0800 Subject: [PATCH 4/4] use desiutil to compute MW_TRANSMISSION values --- py/desispec/scripts/zcatalog.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/py/desispec/scripts/zcatalog.py b/py/desispec/scripts/zcatalog.py index f993b4147..a1ebd3976 100755 --- a/py/desispec/scripts/zcatalog.py +++ b/py/desispec/scripts/zcatalog.py @@ -28,6 +28,7 @@ from desiutil.log import get_logger, DEBUG from desiutil.annotate import load_csv_units +from desiutil.dust import mwdust_transmission from desiutil.names import radec_to_desiname import desiutil.depend import desiutil.healpix @@ -822,13 +823,14 @@ def main(args=None): assert len(np.intersect1d(columns_basic, columns_imaging))==0 # Add back the MW_TRANSMISSION columns - # Extinction coefficients used for MW_TRANSMISSION_* in Legacy Surveys DR9: - ext_coeffs = {'G': 3.214, 'R': 2.165, 'Z': 1.211, 'W1': 0.184, 'W2': 0.113} + # With match_legacy_surveys=True, the extinction coefficients are the ones used for MW_TRANSMISSION_* + # in Legacy Surveys DR9, which are the same for photsys N and S # Some entries have invalid (zero-filled) EBV values and zero-filled fluxes; zero fill their MW_TRANSMISSION_* values invalid_ebv = (zcat['EBV']==0) & (zcat['FLUX_G']==0) & (zcat['FLUX_R']==0) & (zcat['FLUX_Z']==0) - for band, coeff in ext_coeffs.items(): + for band in ['G', 'R', 'Z', 'W1', 'W2']: zcat['MW_TRANSMISSION_'+band] = np.zeros(len(zcat), dtype=np.float32) - zcat['MW_TRANSMISSION_'+band][~invalid_ebv] = (10.**(-coeff * zcat['EBV'][~invalid_ebv] / 2.5)).astype(np.float32) + zcat['MW_TRANSMISSION_'+band][~invalid_ebv] = mwdust_transmission( + zcat['EBV'][~invalid_ebv], band, 'S', match_legacy_surveys=True).astype(np.float32) # Remove main-survey target bits for CMX and SVn surveys (they are not the actual main-survey target bits) if survey in ('cmx', 'sv1', 'sv2', 'sv3'):