def select(self, data0): from esutil.numpy_util import strmatch from .select import Selector selector=Selector() logic=selector.get_logic(data0, self['setname']) # these can be applied in addition to the set logic if 'objtype' in self: if self['objtype'] is not None: logic=logic & strmatch(data0['model'],self['objtype']) for name in ['sratio','s2n','Ts2n','s2','Tmean','mag','prob']: rname='%s_range' % name if name=='mag': name='mag_auto_r' if name=='prob': name='fit_prob' if name=='s2n': name='s2n_w' if rname in self: r=self[rname] logic=logic & ((data0[name] > r[0]) & (data0[name] < r[1])) w,=where(logic) if w.size == 0: data=None else: data=data0[w] return data
def get_logic(self, data, setname): from esutil.numpy_util import strmatch logic = (data['flags']==0) | (data['flags'] == 2**16) logic=logic & (data['s2n_w'] > 10) & (data['s2n_w'] < 1.e6) # has minimal effect for use1 #logic=logic & (data['Ts2n'] > 2) & (data['Ts2n'] < 1.e6) # has minimal effect for use1 #logic=logic & (data['Tmean'] > 2) & (data['Ts2n'] < 1.e6) if setname=='use0': # default set pass elif setname=='use1': isdev=strmatch(data['model'],'gdev') isexp=strmatch(data['model'],'gexp') Ts2n20=(data['Ts2n'] > 20) logic=logic & (isexp | (isdev & Ts2n20) ) elif setname=='use2': isexp=strmatch(data['model'],'gexp') logic = logic & isexp elif setname=='use3': Ts2n20=(data['Ts2n'] > 20) logic = logic & Ts2n20 elif setname=='use4': isexp=strmatch(data['model'],'gexp') Ts2n20=(data['Ts2n'] > 20) logic = logic & isexp & Ts2n20 elif setname=='use5': # same as use1 but with Ts2n > 3.5 isdev=strmatch(data['model'],'gdev') isexp=strmatch(data['model'],'gexp') Ts2n20=(data['Ts2n'] > 20) Ts2n3_5=(data['Ts2n'] > 3.5) logic=logic & ((isexp & Ts2n3_5) | (isdev & Ts2n20) ) else: raise ValueError("bad use name: '%s'" % setname) return logic
def read_output_set(run, psfnums, shnums, objtype=None, s2n_field='s2n_w', s2n_min=None, s2n_max=None, s2_max=None, gsens_min=None, gerr_max=None, columns=None, subtract_mean=False, progress=False): """ Read some data based on the input. Multiple files may be read. If files are missing they will be skipped Note only a single shear number is expected but many psfnums can be sent. Only those with flags==0 are kept. parameters ---------- run: string run id psfnums: integers the psf numbers to read shnums: integers The shear numbers to read. objtype: string, optional optionally select only objects with this best-fit model columns: optional only return these columns subtract_mean: bool, optional Calculate the mean g and subtract it """ from esutil.numpy_util import strmatch, combine_arrlist psfnums=get_psfnums(psfnums) shnums=get_shnums(shnums) ntot=len(shnums)*len(psfnums)*62 itot=1 if progress: from progressbar import ProgressBar prog=ProgressBar(width=70, color='green') #prog=ProgressBar(width=70, color='green', block='▣', empty='□') #prog=ProgressBar(width=70, color='green', block='◧', empty='◫') #prog=ProgressBar(width=70, color='green', block='■', empty='□') #prog=ProgressBar(width=70, color='green', block='=', empty='-') datalist=[] for shnum in shnums: shlist=[] for psfnum in psfnums: for ccd in xrange(1,62+1): if progress: #prog.update(frac=float(itot)/ntot, # message='%s/%s' % (itot,ntot)) prog.update(frac=float(itot)/ntot) itot += 1 fname=get_output_path(run=run, psfnum=psfnum, shnum=shnum, ccd=ccd, ftype='shear') if os.path.exists(fname): data0=read_fits_output(run=run, psfnum=psfnum, shnum=shnum, ccd=ccd, ftype='shear', columns=columns, verbose=False) logic=(data0['flags']==0) | (data0['flags']==65536) if objtype: logic=logic & strmatch(data0['model'],objtype) if s2n_min is not None: logic=logic & (data0[s2n_field] > s2n_min) if s2n_max is not None: logic=logic & (data0[s2n_field] < s2n_max) if s2_max is not None: logic=logic & (data0['s2'] < s2_max) if gsens_min is not None: logic=logic \ & (data0['gsens'][:,0] > gsens_min) \ & (data0['gsens'][:,1] > gsens_min) if gerr_max is not None: g1err=sqrt(data0['gcov'][:,0,0]) g2err=sqrt(data0['gcov'][:,1,1]) logic=logic \ & (g1err < gerr_max) & (g2err < gerr_max) wkeep,=where(logic) if wkeep.size==0: print 'No objects passed cuts' else: data0=data0[wkeep] shlist.append(data0) shdata=combine_arrlist(shlist) if subtract_mean: g1mean = shdata['g'][:,0].mean() g2mean = shdata['g'][:,1].mean() shdata['g'][:,0] -= g1mean shdata['g'][:,1] -= g2mean datalist.append(shdata) if len(datalist)==0: raise RuntimeError("no outputs were found") data=combine_arrlist(datalist) return data