Esempio n. 1
0
    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
Esempio n. 2
0
 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
Esempio n. 5
0
    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