From 789b9608776309772193903b3dba3f25b027edfd Mon Sep 17 00:00:00 2001 From: allyson Date: Tue, 23 Jul 2024 15:34:06 -0700 Subject: [PATCH 1/4] pass max_velo_diff arg to deltachi2 comparison --- py/redrock/zfind.py | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/py/redrock/zfind.py b/py/redrock/zfind.py index 70349f6..324b211 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 max 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(len(chi2), 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.max(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.maximum(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,12 @@ 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 here? + # Store # Here convert to astropy table allzfit.append(astropy.table.Table(tzfit)) From b216f8814a23bef4821b460b17fa7e174e73cc64 Mon Sep 17 00:00:00 2001 From: allyson Date: Tue, 23 Jul 2024 16:24:30 -0700 Subject: [PATCH 2/4] convert dvlimit to array --- py/redrock/zfind.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/py/redrock/zfind.py b/py/redrock/zfind.py index 324b211..7859f13 100644 --- a/py/redrock/zfind.py +++ b/py/redrock/zfind.py @@ -121,13 +121,14 @@ def calc_deltachi2(chi2, z, zwarn, dvlimit=constants.max_velo_diff): what the next chi2 would have been. This can also occur for the last N targets if all N of them are within dvlimit of each other. ''' + print(chi2,z,zwarn,dvlimit) 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(len(chi2), dvlimit) + dvlimit = np.full(nz, dvlimit) for i in range(len(chi2)-1): dv = get_dv(z[i+1:], z[i]) @@ -504,7 +505,7 @@ def zfind(targets, templates, mp_procs=1, nminima=3, archetypes=None, priors=Non 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'] From 64743682fe096e2413063e71c528629f7b67829c Mon Sep 17 00:00:00 2001 From: allyson Date: Tue, 23 Jul 2024 17:08:14 -0700 Subject: [PATCH 3/4] delete velo_diff column --- py/redrock/zfind.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/py/redrock/zfind.py b/py/redrock/zfind.py index 7859f13..49d69a5 100644 --- a/py/redrock/zfind.py +++ b/py/redrock/zfind.py @@ -121,7 +121,6 @@ def calc_deltachi2(chi2, z, zwarn, dvlimit=constants.max_velo_diff): what the next chi2 would have been. This can also occur for the last N targets if all N of them are within dvlimit of each other. ''' - print(chi2,z,zwarn,dvlimit) nz = len(chi2) deltachi2 = np.zeros(nz) okfit = (zwarn & badfit_mask) == 0 @@ -132,7 +131,7 @@ def calc_deltachi2(chi2, z, zwarn, dvlimit=constants.max_velo_diff): for i in range(len(chi2)-1): dv = get_dv(z[i+1:], z[i]) - ii = (np.abs(dv)>np.max(dvlimit[i],dvlimit[i+1:])) & okfit[i+1:] + ii = (np.abs(dv)>np.maximum(dvlimit[i],dvlimit[i+1:])) & okfit[i+1:] if np.any(ii): dchi2 = chi2[i+1:] - chi2[i] deltachi2[i] = np.min(dchi2[ii]) @@ -584,7 +583,8 @@ def zfind(targets, templates, mp_procs=1, nminima=3, archetypes=None, priors=Non tzfit['deltachi2'] = deltachi2 tzfit['zwarn'][setzwarn] |= ZW.SMALL_DELTA_CHI2 - # remove max_velo_diff_column here? + # remove max_velo_diff column + del tzfit['max_velo_diff'] # Store # Here convert to astropy table From ebf0ee22017d6e7f7d31474f0250d2892b2627c1 Mon Sep 17 00:00:00 2001 From: allyson Date: Fri, 26 Jul 2024 14:20:37 -0700 Subject: [PATCH 4/4] uses minimum max_velo_diff of pair when ranking N best fits --- py/redrock/zfind.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/py/redrock/zfind.py b/py/redrock/zfind.py index 49d69a5..10ed454 100644 --- a/py/redrock/zfind.py +++ b/py/redrock/zfind.py @@ -111,7 +111,7 @@ def calc_deltachi2(chi2, z, zwarn, dvlimit=constants.max_velo_diff): Options: dvlimit: exclude candidates that are closer than dvlimit [km/s], - uses max value of the pair + uses minumum 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 @@ -131,7 +131,7 @@ def calc_deltachi2(chi2, z, zwarn, dvlimit=constants.max_velo_diff): for i in range(len(chi2)-1): dv = get_dv(z[i+1:], z[i]) - ii = (np.abs(dv)>np.maximum(dvlimit[i],dvlimit[i+1:])) & 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]) @@ -145,7 +145,7 @@ 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.maximum(dvlimit[i], dvlimit[noti]) + alldvlimit = np.minimum(dvlimit[i], dvlimit[noti]) zwarn = np.any( okfit[noti] & (alldeltachi2 < constants.min_deltachi2) & (alldv >= alldvlimit) )