diff --git a/doc/changes.rst b/doc/changes.rst index 21e32fd8..d5ce888e 100644 --- a/doc/changes.rst +++ b/doc/changes.rst @@ -5,7 +5,9 @@ redrock Change Log 0.20.2 (unreleased) ------------------- -* No changes yet. +* Module file cleanup env vars moved to desimodules (PR `#313`_). + +.. _`#313`: https://github.com/desihub/redrock/pull/313 0.20.1 (2024-06-04) ------------------- diff --git a/etc/redrock.module b/etc/redrock.module index a32c2e43..228be7d4 100644 --- a/etc/redrock.module +++ b/etc/redrock.module @@ -76,9 +76,3 @@ setenv [string toupper $product] $PRODUCT_DIR # # Add any non-standard Module code below this point. # -# MPI or multiprocessing handle parallelism, not OpenMP via numpy/MKL -# -setenv KMP_AFFINITY disabled -setenv MPICH_GNI_FORK_MODE FULLCOPY -setenv OMP_NUM_THREADS 1 -setenv HDF5_USE_FILE_LOCKING FALSE diff --git a/py/redrock/external/desi.py b/py/redrock/external/desi.py index c43bc7df..6b0df9d6 100644 --- a/py/redrock/external/desi.py +++ b/py/redrock/external/desi.py @@ -107,8 +107,10 @@ def write_zbest(outfile, zbest, fibermap, exp_fibermap, tsnr2, Modifies input tables.meta['EXTNAME'] """ + # header keywords for both PRIMARY and REDSHIFTS HDU header = _get_header(templates, archetypes, spec_header) + zbest.meta.update(header) zbest.meta['EXTNAME'] = 'REDSHIFTS' fibermap.meta['EXTNAME'] = 'FIBERMAP' exp_fibermap.meta['EXTNAME'] = 'EXP_FIBERMAP' diff --git a/py/redrock/templates.py b/py/redrock/templates.py index cc6d855c..d3f83bb7 100644 --- a/py/redrock/templates.py +++ b/py/redrock/templates.py @@ -404,7 +404,7 @@ def header2templatefiles(hdr, template_dir=None): return filenames -def load_templates_from_header(hdr, template_dir=None): +def load_templates_from_header(hdr, template_dir=None, asdict=False): """Return templates matching header keywords Args: @@ -412,11 +412,12 @@ def load_templates_from_header(hdr, template_dir=None): Options: template_dir (str): full path to redrock-templates directory - + asdict (bool): return dict keyed by (spectype, subtype) instead of list + Returns list of Template objects """ template_filenames = header2templatefiles(hdr, template_dir=template_dir) - return load_templates(template_filenames) + return load_templates(template_filenames, asdict=asdict) def load_templates(template_path=None, zscan_galaxy=None, zscan_star=None, zscan_qso=None, asdict=False): diff --git a/py/redrock/zfind.py b/py/redrock/zfind.py index 70349f61..bd2cde12 100644 --- a/py/redrock/zfind.py +++ b/py/redrock/zfind.py @@ -110,7 +110,8 @@ def calc_deltachi2(chi2, z, zwarn, dvlimit=constants.max_velo_diff): zwarn : array of zwarn values Options: - dvlimit: exclude candidates that are closer than dvlimit [km/s] + dvlimit: exclude candidates that are closer than dvlimit [km/s], + uses minimum value of the pair Returns (deltachi2, setzwarn) where `deltachi2` is array of chi2 differences to next best good fit, and `setzwarn` is boolean array of whether @@ -123,9 +124,14 @@ def calc_deltachi2(chi2, z, zwarn, dvlimit=constants.max_velo_diff): nz = len(chi2) deltachi2 = np.zeros(nz) okfit = (zwarn & badfit_mask) == 0 + + # if no dvlimit passed, use constant threshold + if np.isscalar(dvlimit): + dvlimit = np.full(nz, dvlimit) + for i in range(len(chi2)-1): dv = get_dv(z[i+1:], z[i]) - ii = (np.abs(dv)>dvlimit) & okfit[i+1:] + ii = (np.abs(dv)>np.minimum(dvlimit[i],dvlimit[i+1:])) & okfit[i+1:] if np.any(ii): dchi2 = chi2[i+1:] - chi2[i] deltachi2[i] = np.min(dchi2[ii]) @@ -139,9 +145,10 @@ def calc_deltachi2(chi2, z, zwarn, dvlimit=constants.max_velo_diff): noti[i] = False alldeltachi2 = np.absolute(chi2[noti] - chi2[i]) alldv = np.absolute(get_dv(z=z[noti], zref=z[i])) + alldvlimit = np.minimum(dvlimit[i], dvlimit[noti]) zwarn = np.any( okfit[noti] & (alldeltachi2 < constants.min_deltachi2) & - (alldv >= dvlimit) ) + (alldv >= alldvlimit) ) if zwarn: setzwarn[i] = True @@ -476,13 +483,6 @@ def zfind(targets, templates, mp_procs=1, nminima=3, archetypes=None, priors=Non else: spectype, subtype = parse_fulltype(fulltype) - # set max_velo_diff differently for STARs, but watch out - # for archtypes which have spectype as list instead of scalar - if (np.isscalar(spectype) and spectype.upper() == 'STAR') or spectype[0].upper() == 'STAR': - max_velo_diff = constants.max_velo_diff_star - else: - max_velo_diff = constants.max_velo_diff - #Have to create arrays of correct length since using dict of #np arrays instead of astropy Table nmin = len(tmp['chi2']) @@ -496,6 +496,15 @@ def zfind(targets, templates, mp_procs=1, nminima=3, archetypes=None, priors=Non tmp['subtype'] = np.array([subtype]).reshape((nmin, 1)) tmp['ncoeff'] = np.array([tmp['coeff'].shape[1]]*nmin).reshape((nmin, 1)) + + # set max_velo_diff differently for STARs, but watch out + # for archtypes which have spectype as list instead of scalar + if (np.isscalar(spectype) and spectype.upper() == 'STAR') or spectype[0].upper() == 'STAR': + max_velo_diff = constants.max_velo_diff_star + else: + max_velo_diff = constants.max_velo_diff + tmp['max_velo_diff'] = np.full((nmin,1), max_velo_diff) + tzfit.append(tmp) del allresults[tid][fulltype]['zfit'] @@ -570,10 +579,13 @@ def zfind(targets, templates, mp_procs=1, nminima=3, archetypes=None, priors=Non #- calc deltachi2 and set ZW.SMALL_DELTA_CHI2 flag deltachi2, setzwarn = calc_deltachi2(tzfit['chi2'], tzfit['z'], tzfit['zwarn'], - dvlimit=max_velo_diff) + dvlimit=tzfit['max_velo_diff']) tzfit['deltachi2'] = deltachi2 tzfit['zwarn'][setzwarn] |= ZW.SMALL_DELTA_CHI2 + # remove max_velo_diff column + del tzfit['max_velo_diff'] + # Store # Here convert to astropy table allzfit.append(astropy.table.Table(tzfit)) diff --git a/requirements.txt b/requirements.txt index 2197f552..748dfb8b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ # Based on desimodules/22.2. +numpy<2.0 astropy scipy h5py