def get_1d_halo_matter(self, kind='small_r', average='box'): """ Return the 1D real-space halo-matter correlation functions, with errors estimated from the scatter in the 10 realizations """ valid_kinds = ['small_r', 'fft'] if kind not in valid_kinds: raise ValueError("valid choices for `kind` are: %s" %str(valid_kinds)) name = '_1d_halo_matter_%s' %kind if average is not None: name += '_'+average try: return getattr(self, name) except AttributeError: basename = 'corr_1d_hm{mass}_runPB_PB{box}_{a}_%s.dat' %kind d = os.path.join(self.root, 'halo-matter/config/real') loader = io.load_correlation coords = [self.a, self.mass, self.box]; dims = ['a', 'mass', 'box'] corr = SpectraSet.from_files(loader, d, basename, coords, dims, args=('1d',)) # reindex and add the errors corr = self.reindex(corr, 'r_cen', self.dr, weights='N') # compute errors errs = {} for key in corr.ndindex(dims=['a', 'mass']): xi = corr.sel(**key) data = [] for x in xi: x = x.get() data.append(x['corr']) subkey = (key['a'], key['mass']) errs[subkey] = np.diag(np.cov(np.asarray(data).T))**0.5 if average is not None: errs[subkey] /= (len(self.box))**0.5 # average? if average is not None: corr = corr.average(axis=average) # add the errors for key in corr.ndindex(): xi = corr.loc[key].get() xi['error'] = errs[(key['a'], key['mass'])] setattr(self, name, corr) return corr
def get_wg_poles(self): """ Return a dictionary holding the configuration space galaxy spectrum multipoles in redshift space, as used by the working group """ try: return self._wg_poles except AttributeError: import xarray root = os.path.join(os.environ['RSD_DIR'], 'CorrelationFunction/Results') data = np.asarray([load_data(root, box) for box in self.boxes]) ells = [0, 2] dims = ['box', 'ell'] coords = [self.boxes, ells] poles = xarray.DataArray(data, dims=dims, coords=coords) self._wg_poles = poles return poles
def get_subbox_poles(self, which, average=False, subtract_shot_noise=True): """ Return the cutsky galaxy multipoles in redshift space, measured for the subboxes """ name = '_my_poles_subboxes_%s_Mpch' %(which) if average: name += '_mean' try: return getattr(self, name) except AttributeError: # form the filename and load the data d = self.root basename = 'poles_my_cutskyN1_subbox{box:d}_%s_Mpch_unscaled_no_fkp_dk005.dat' %which # read in the data loader = io.load_power mapcols = {'power_0.real':'mono', 'power_2.real':'quad', 'power_4.real':'hexadec'} usecols = ['k', 'mono', 'quad', 'hexadec', 'modes'] kwargs = {'usecols':usecols, 'mapcols':mapcols} if which == '300': boxes = list(range(94)) else: boxes = list(range(24)) poles = SpectraSet.from_files(loader, d, basename, [boxes], ['box'], args=('1d',), kwargs=kwargs, ignore_missing=True) # remove null valid_boxes = [] for key, p in poles.nditer(): if not p.isnull(): valid_boxes.append(key['box']) poles = poles.sel(box=valid_boxes) # reindex poles = self.reindex(poles, 'k_cen', self.dk, weights='modes') # unstack the poles ells = [('mono',0), ('quad', 2), ('hexadec', 4)] poles = tools.unstack_multipoles(poles, ells, 'power') # compute errors errs = {} for ell in poles['ell'].values: data = [] for box in poles['box'].values: p = poles.sel(box=box, ell=ell).get() data.append(p['power']) errs[ell] = np.diag(np.cov(np.asarray(data).T))**0.5 if average: errs[ell] /= (len(boxes))**0.5 if subtract_shot_noise: for key in poles.ndindex(): if key['ell'] == 0: p = poles.loc[key].get() p['power'] = p['power'] - p.attrs['shot_noise'] # average? if average: poles = poles.average(axis='box') # add the errors for key in poles.ndindex(): p = poles.loc[key].get() p['error'] = errs[key['ell']] setattr(self, name, poles) return poles
def get_my_poles(self, space='redshift', scaled=False, average=False, tag="", subtract_shot_noise=True): """ Return the cutsky galaxy multipoles in redshift space, measured for my 84 box realizations """ if space not in ['real', 'redshift']: raise ValueError("`space` should be 'real' or 'redshift'") scaled_tag = 'scaled' if scaled else 'unscaled' name = '_my_poles_%s_%s' %(space, scaled_tag) if average: name += '_mean' if tag: tag = '_'+tag name += tag try: return getattr(self, name) except AttributeError: # form the filename and load the data d = os.path.join(self.root, 'nbodykit/poles') if space == 'redshift': basename = 'poles_my_cutskyN{box:d}_%s_no_fkp_dk005%s.dat' %(scaled_tag, tag) else: basename = 'poles_my_cutskyN{box:d}_real_%s_no_fkp_dk005%s.dat' %(scaled_tag, tag) # read in the data loader = io.load_power mapcols = {'power_0.real':'mono', 'power_2.real':'quad', 'power_4.real':'hexadec'} usecols = ['k', 'mono', 'quad', 'hexadec', 'modes'] kwargs = {'usecols':usecols, 'mapcols':mapcols} poles = SpectraSet.from_files(loader, d, basename, [self.boxes], ['box'], args=('1d',), kwargs=kwargs, ignore_missing=True) # remove null valid_boxes = [] for key, p in poles.nditer(): if not p.isnull(): valid_boxes.append(key['box']) poles = poles.sel(box=valid_boxes) # reindex poles = self.reindex(poles, 'k_cen', self.dk, weights='modes') # unstack the poles ells = [('mono',0), ('quad', 2), ('hexadec', 4)] poles = tools.unstack_multipoles(poles, ells, 'power') # compute errors errs = {} for ell in poles['ell'].values: data = [] for box in poles['box'].values: p = poles.sel(box=box, ell=ell).get() data.append(p['power']) errs[ell] = np.diag(np.cov(np.asarray(data).T))**0.5 if average: errs[ell] /= (len(self.boxes))**0.5 if subtract_shot_noise: for key in poles.ndindex(): if key['ell'] == 0: p = poles.loc[key].get() p['power'] = p['power'] - p.attrs['shot_noise'] # average? if average: poles = poles.average(axis='box') # add the errors for key in poles.ndindex(): p = poles.loc[key].get() p['error'] = errs[key['ell']] setattr(self, name, poles) return poles
def _get_moment(self, moments, los="", save_errors=False, name=None, sel_mu=None, ignore_cache=False): """ Internal function to return any (ell, ell_prime) moment Parameters ---------- moments : list of tuples list of tuples specifying the velocity moments to load los : str, {'x', 'y', 'z'} optional the string specifying the line-of-sight save_errors : bool, optional whether to pickle the errors for future loading name : str, optional use this string as the attribute name sel_mu : int, list of int, optional select specific only mu values ignore_cache : bool, optional if `True`, ignore any saved errors """ if name is None: name = "_plus_".join("P%d%d" %(ell, ell_prime) for (ell, ell_prime) in moments) name_ = "_" + name if los: name_ += '_%slos' %los try: return getattr(self, name_) except AttributeError: coords = [self.a, self.mass] dims = ['a', 'mass'] add_errors = True # load loader = io.load_momentum # loop over all moments toret = [] for (ell, ell_prime) in moments: columns = None if ell == 0 and ell_prime == 0: d = os.path.join(self.root, 'halo/real/density/power') tag = self.tag if 'mean' not in self.tag else '10mean' basename = 'pk_hh{mass}_runPB_%s_{a}.dat' %tag columns = ['k', 'power', 'modes'] else: d = os.path.join(self.root, 'halo/real/momentum/poles') if los: args = (ell, ell_prime, self.tag, los) basename = 'poles_P%d%d_hh{mass}_runPB_%s_{a}_%slos.dat' %args else: args = (ell, ell_prime, self.tag) basename = 'poles_P%d%d_hh{mass}_runPB_%s_{a}.dat' %args kwargs = {'sum_only':['modes'], 'force_index_match':True} if columns is not None: kwargs['columns'] = columns poles = SpectraSet.from_files(loader, d, basename, coords, dims, args=(ell,ell_prime,), kwargs=kwargs) # add the mu dimension data = np.asarray(poles.values.tolist()) poles = SpectraSet(data, coords=coords+[self.mu], dims=dims+['mu']) # reindex poles = self.reindex(poles, 'k_cen', self.dk, weights='modes') # choose specific mu if sel_mu is not None: poles = poles.sel(mu=sel_mu) # add errors if ell == 0 and ell_prime == 0: poles.add_power_errors() add_errors = False toret.append(poles) if len(moments) != 0: for i in range(1, len(moments)): for key, P in toret[i].nditer(): subkey = {k:key[k] for k in key if k in toret[0].dims} P0 = toret[0].sel(**subkey) if P0.isnull(): continue else: P0 = P0.get() P0['power'] += P.get()['power'] toret = toret[0] if add_errors: kw = {'sel_mu':sel_mu, 'save_errors':save_errors, 'name':name, 'ignore_cache':ignore_cache} self._add_errors(toret, moments, **kw) setattr(self, name_, toret) return toret