Beispiel #1
0
    def mapmake_full(self, nside, mapname):
        def _make_alm(mi):

            print("Making %i" % mi)

            mmode = self.mmode(mi)
            sphmode = self.beamtransfer.project_vector_telescope_to_sky(mi, mmode)

            return sphmode

        alm_list = mpiutil.parallel_map(_make_alm, list(range(self.telescope.mmax + 1)))

        if mpiutil.rank0:

            alm = np.zeros(
                (
                    self.telescope.nfreq,
                    self.telescope.num_pol_sky,
                    self.telescope.lmax + 1,
                    self.telescope.lmax + 1,
                ),
                dtype=np.complex128,
            )

            for mi in range(self.telescope.mmax + 1):

                alm[..., mi] = alm_list[mi]

            skymap = hputil.sphtrans_inv_sky(alm, nside)

            with h5py.File(self.output_directory + "/" + mapname, "w") as f:
                f.create_dataset("/map", data=skymap)

        mpiutil.barrier()
Beispiel #2
0
    def mapmake_svd(self, nside, mapname):

        self.generate_mmodes_svd()

        def _make_alm(mi):

            svdmode = self.mmode_svd(mi)

            sphmode = self.beamtransfer.project_vector_svd_to_sky(mi, svdmode)

            return sphmode

        alm_list = mpiutil.parallel_map(_make_alm,
                                        range(self.telescope.mmax + 1))

        if mpiutil.rank0:

            alm = np.zeros((self.telescope.nfreq, self.telescope.num_pol_sky,
                            self.telescope.lmax + 1, self.telescope.lmax + 1),
                           dtype=np.complex128)

            for mi in range(self.telescope.mmax + 1):

                alm[..., mi] = alm_list[mi]

            skymap = hputil.sphtrans_inv_sky(alm, nside)

            with h5py.File(self.output_directory + '/' + mapname, 'w') as f:
                f.create_dataset('/map', data=skymap)
                f.attrs['frequency'] = self.beamtransfer.telescope.frequencies
                f.attrs['polarization'] = np.array(
                    ['I', 'Q', 'U',
                     'V'])[:self.beamtransfer.telescope.num_pol_sky]

        mpiutil.barrier()
Beispiel #3
0
    def mapmake_kl(self, nside, mapname, wiener=False):

        mapfile = self.output_directory + "/" + mapname

        if os.path.exists(mapfile):
            if mpiutil.rank0:
                print("File %s exists. Skipping...")
            return

        kl = self.manager.kltransforms[self.klname]

        if not kl.inverse:
            raise Exception("Need the inverse to make a meaningful map.")

        def _make_alm(mi):
            print("Making %i" % mi)

            klmode = self.mmode_kl(mi)

            if wiener:
                evals = kl.evals_m(mi, self.klthreshold)

                if evals is not None:
                    klmode *= evals / (1.0 + evals)

            isvdmode = kl.project_vector_kl_to_svd(
                mi, klmode, threshold=self.klthreshold
            )

            sphmode = self.beamtransfer.project_vector_svd_to_sky(mi, isvdmode)

            return sphmode

        alm_list = mpiutil.parallel_map(_make_alm, list(range(self.telescope.mmax + 1)))

        if mpiutil.rank0:

            alm = np.zeros(
                (
                    self.telescope.nfreq,
                    self.telescope.num_pol_sky,
                    self.telescope.lmax + 1,
                    self.telescope.lmax + 1,
                ),
                dtype=np.complex128,
            )

            # Determine whether to use m=0 or not
            mlist = list(range(1 if self.no_m_zero else 0, self.telescope.mmax + 1))

            for mi in mlist:

                alm[..., mi] = alm_list[mi]

            skymap = hputil.sphtrans_inv_sky(alm, nside)

            with h5py.File(mapfile, "w") as f:
                f.create_dataset("/map", data=skymap)

        mpiutil.barrier()
Beispiel #4
0
    def mapmake_svd(self, nside, mapname):

        self.generate_mmodes_svd()

        def _make_alm(mi):

            svdmode = self.mmode_svd(mi)

            sphmode = self.beamtransfer.project_vector_svd_to_sky(mi, svdmode)

            return sphmode

        alm_list = mpiutil.parallel_map(_make_alm, range(self.telescope.mmax + 1))

        if mpiutil.rank0:

            alm = np.zeros((self.telescope.nfreq, self.telescope.num_pol_sky, self.telescope.lmax + 1,
                            self.telescope.lmax + 1), dtype=np.complex128)

            for mi in range(self.telescope.mmax + 1):

                alm[..., mi] = alm_list[mi]

            skymap = hputil.sphtrans_inv_sky(alm, nside)

            with h5py.File(self.output_directory + '/' + mapname, 'w') as f:
                f.create_dataset('/map', data=skymap)

        mpiutil.barrier()
Beispiel #5
0
    def powerspectrum(self):

        import scipy.linalg as la


        if os.path.exists(self._psfile):
            print "File %s exists. Skipping..." % self._psfile
            return

        ps = self.manager.psestimators[self.psname]
        ps.genbands()

        def _q_estimate(mi):

            return ps.q_estimator(mi, self.mmode_kl(mi))

        # Determine whether to use m=0 or not
        mlist = range(1 if self.no_m_zero else 0, self.telescope.mmax + 1)
        qvals = mpiutil.parallel_map(_q_estimate, mlist)

        qtotal = np.array(qvals).sum(axis=0)

        fisher, bias = ps.fisher_bias()

        powerspectrum =  np.dot(la.inv(fisher), qtotal - bias)


        if mpiutil.rank0:
            with h5py.File(self._psfile, 'w') as f:


                cv = la.inv(fisher)
                err = cv.diagonal()**0.5
                cr = cv / np.outer(err, err)

                f.create_dataset('fisher/', data=fisher)
#                f.create_dataset('bias/', data=self.bias)
                f.create_dataset('covariance/', data=cv)
                f.create_dataset('error/', data=err)
                f.create_dataset('correlation/', data=cr)

                f.create_dataset('bandpower/', data=ps.band_power)
                #f.create_dataset('k_start/', data=ps.k_start)
                #f.create_dataset('k_end/', data=ps.k_end)
                #f.create_dataset('k_center/', data=ps.k_center)
                #f.create_dataset('psvalues/', data=ps.psvalues)

                f.create_dataset('powerspectrum', data=powerspectrum)

        # Delete cache of bands for memory reasons
        del ps.clarray
        ps.clarray = None

        mpiutil.barrier()

        return powerspectrum
Beispiel #6
0
    def powerspectrum(self):

        import scipy.linalg as la


        if os.path.exists(self._psfile):
            print "File %s exists. Skipping..." % self._psfile
            return

        ps = self.manager.psestimators[self.psname]
        ps.genbands()

        def _q_estimate(mi):

            return ps.q_estimator(mi, self.mmode_kl(mi))

        # Determine whether to use m=0 or not
        mlist = range(1 if self.no_m_zero else 0, self.telescope.mmax + 1)
        qvals = mpiutil.parallel_map(_q_estimate, mlist)

        qtotal = np.array(qvals).sum(axis=0)

        fisher, bias = ps.fisher_bias()

        powerspectrum =  np.dot(la.inv(fisher), qtotal - bias)


        if mpiutil.rank0:
            with h5py.File(self._psfile, 'w') as f:


                cv = la.inv(fisher)
                err = cv.diagonal()**0.5
                cr = cv / np.outer(err, err)

                f.create_dataset('fisher/', data=fisher)
#                f.create_dataset('bias/', data=self.bias)
                f.create_dataset('covariance/', data=cv)
                f.create_dataset('error/', data=err)
                f.create_dataset('correlation/', data=cr)

                f.create_dataset('bandpower/', data=ps.band_power)
                #f.create_dataset('k_start/', data=ps.k_start)
                #f.create_dataset('k_end/', data=ps.k_end)
                #f.create_dataset('k_center/', data=ps.k_center)
                #f.create_dataset('psvalues/', data=ps.psvalues)

                f.create_dataset('powerspectrum', data=powerspectrum)

        # Delete cache of bands for memory reasons
        del ps.clarray
        ps.clarray = None

        mpiutil.barrier()

        return powerspectrum
Beispiel #7
0
    def mapmake_kl(self, nside, mapname, wiener=False):

        mapfile = self.output_directory + '/' + mapname

        if os.path.exists(mapfile):
            if mpiutil.rank0:
                print "File %s exists. Skipping..."
            return

        kl = self.manager.kltransforms[self.klname]

        if not kl.inverse:
            raise Exception("Need the inverse to make a meaningful map.")

        def _make_alm(mi):
            print "Making %i" % mi

            klmode = self.mmode_kl(mi)

            if wiener:
                evals = kl.evals_m(mi, self.klthreshold)

                if evals is not None:
                    klmode *= (evals / (1.0 + evals))

            isvdmode = kl.project_vector_kl_to_svd(mi, klmode, threshold=self.klthreshold)

            sphmode = self.beamtransfer.project_vector_svd_to_sky(mi, isvdmode)

            return sphmode

        alm_list = mpiutil.parallel_map(_make_alm, range(self.telescope.mmax + 1), root=0, method='rand')

        if mpiutil.rank0:

            alm = np.zeros((self.telescope.nfreq, self.telescope.num_pol_sky, self.telescope.lmax + 1,
                            self.telescope.lmax + 1), dtype=np.complex128)

            # Determine whether to use m=0 or not
            mlist = range(1 if self.no_m_zero else 0, self.telescope.mmax + 1)

            for mi in mlist:

                alm[..., mi] = alm_list[mi]

            skymap = hputil.sphtrans_inv_sky(alm, nside)

            with h5py.File(mapfile, 'w') as f:
                f.create_dataset('/map', data=skymap)
                f.attrs['frequency'] = self.beamtransfer.telescope.frequencies
                f.attrs['polarization'] = np.array(['I', 'Q', 'U', 'V'])[:self.beamtransfer.telescope.num_pol_sky]

        mpiutil.barrier()
Beispiel #8
0
    def mapmake_kl(self, nside, mapname, wiener=False):

        mapfile = self.output_directory + '/' + mapname

        if os.path.exists(mapfile):
            if mpiutil.rank0:
                print "File %s exists. Skipping..."
            return

        kl = self.manager.kltransforms[self.klname]

        if not kl.inverse:
            raise Exception("Need the inverse to make a meaningful map.")

        def _make_alm(mi):
            print "Making %i" % mi

            klmode = self.mmode_kl(mi)

            if wiener:
                evals = kl.evals_m(mi, self.klthreshold)

                if evals is not None:
                    klmode *= (evals / (1.0 + evals))

            isvdmode = kl.project_vector_kl_to_svd(mi, klmode, threshold=self.klthreshold)

            sphmode = self.beamtransfer.project_vector_svd_to_sky(mi, isvdmode)

            return sphmode

        alm_list = mpiutil.parallel_map(_make_alm, range(self.telescope.mmax + 1))

        if mpiutil.rank0:

            alm = np.zeros((self.telescope.nfreq, self.telescope.num_pol_sky, self.telescope.lmax + 1,
                            self.telescope.lmax + 1), dtype=np.complex128)

            # Determine whether to use m=0 or not
            mlist = range(1 if self.no_m_zero else 0, self.telescope.mmax + 1)

            for mi in mlist:

                alm[..., mi] = alm_list[mi]

            skymap = hputil.sphtrans_inv_sky(alm, nside)

            with h5py.File(mapfile, 'w') as f:
                f.create_dataset('/map', data=skymap)
                f.attrs['frequency'] = self.beamtransfer.telescope.frequencies
                f.attrs['polarization'] = np.array(['I', 'Q', 'U', 'V'])[:self.beamtransfer.telescope.num_pol_sky]

        mpiutil.barrier()
Beispiel #9
0
    def mapmake_full(self, nside, mapname, nbin=None, dirty=False, method='svd', normalize=True, threshold=1.0e3):

        nfreq = self.telescope.nfreq
        if nbin is not None and (nbin <= 0 or nbin >= nfreq): # invalid nbin
            nbin = None

        def _make_alm(mi):

            print "Making %i" % mi

            mmode = self.mmode(mi)
            if dirty:
                sphmode = self.beamtransfer.project_vector_backward_dirty(mi, mmode, nbin, normalize, threshold)
            else:
                if method == 'svd':
                    sphmode = self.beamtransfer.project_vector_telescope_to_sky(mi, mmode, nbin)
                elif method == 'tk':
                    sphmode = self.beamtransfer.project_vector_telescope_to_sky_tk(mi, mmode, nbin)
                else:
                    raise ValueError('Unknown map-making method %s' % method)

            return sphmode

        alm_list = mpiutil.parallel_map(_make_alm, range(self.telescope.mmax + 1))

        if mpiutil.rank0:

            # get center freq of each bin
            if nbin is not None:
                n, s, e = mpiutil.split_m(nfreq, nbin)
                cfreqs = np.array([ self.beamtransfer.telescope.frequencies[(s[i]+e[i])/2] for i in range(nbin) ])
            else:
                nbin = nfreq
                cfreqs = self.beamtransfer.telescope.frequencies

            alm = np.zeros((nbin, self.telescope.num_pol_sky, self.telescope.lmax + 1,
                            self.telescope.lmax + 1), dtype=np.complex128)

            for mi in range(self.telescope.mmax + 1):

                alm[..., mi] = alm_list[mi]

            skymap = hputil.sphtrans_inv_sky(alm, nside)

            with h5py.File(self.output_directory + '/' + mapname, 'w') as f:
                f.create_dataset('/map', data=skymap)
                f.attrs['frequency'] = cfreqs
                f.attrs['polarization'] = np.array(['I', 'Q', 'U', 'V'])[:self.beamtransfer.telescope.num_pol_sky]

        mpiutil.barrier()
Beispiel #10
0
def cross_powerspectrum(timestreams, psname, psfile):

    import scipy.linalg as la

    if os.path.exists(psfile):
        print "File %s exists. Skipping..." % psfile
        return

    products = timestreams[0].manager

    ps = products.psestimators[psname]
    ps.genbands()

    nstream = len(timestreams)

    def _q_estimate(mi):

        qp = np.zeros((nstream, nstream, ps.nbands), dtype=np.float64)

        for ti in range(nstream):
            for tj in range(ti + 1, nstream):

                print "Making m=%i (%i, %i)" % (mi, ti, tj)

                si = timestreams[ti]
                sj = timestreams[tj]

                qp[ti, tj] = ps.q_estimator(mi, si.mmode_kl(mi),
                                            sj.mmode_kl(mi))
                qp[tj, ti] = qp[ti, tj]

        return qp

    # Determine whether to use m=0 or not
    mlist = range(1 if timestreams[0].no_m_zero else 0,
                  products.telescope.mmax + 1)
    qvals = mpiutil.parallel_map(_q_estimate, mlist)

    qtotal = np.array(qvals).sum(axis=0)

    fisher, bias = ps.fisher_bias()

    # Subtract bias and reshape into new array
    qtotal = (qtotal - bias).reshape(nstream**2, ps.nbands).T

    powerspectrum = np.dot(la.inv(fisher), qtotal)
    powerspectrum = powerspectrum.T.reshape(nstream, nstream, ps.nbands)

    if mpiutil.rank0:
        with h5py.File(psfile, 'w') as f:

            cv = la.inv(fisher)
            err = cv.diagonal()**0.5
            cr = cv / np.outer(err, err)

            f.create_dataset('fisher/', data=fisher)
            #                f.create_dataset('bias/', data=self.bias)
            f.create_dataset('covariance/', data=cv)
            f.create_dataset('error/', data=err)
            f.create_dataset('correlation/', data=cr)

            f.create_dataset('bandpower/', data=ps.band_power)
            #f.create_dataset('k_start/', data=ps.k_start)
            #f.create_dataset('k_end/', data=ps.k_end)
            #f.create_dataset('k_center/', data=ps.k_center)
            #f.create_dataset('psvalues/', data=ps.psvalues)

            f.create_dataset('powerspectrum', data=powerspectrum)

    # Delete cache of bands for memory reasons
    del ps.clarray
    ps.clarray = None

    mpiutil.barrier()

    return powerspectrum
Beispiel #11
0
    def mapmake_full(self,
                     nside,
                     mapname,
                     nbin=None,
                     dirty=False,
                     method='svd',
                     normalize=True,
                     threshold=1.0e3):

        nfreq = self.telescope.nfreq
        if nbin is not None and (nbin <= 0 or nbin >= nfreq):  # invalid nbin
            nbin = None

        def _make_alm(mi):

            print "Making %i" % mi

            mmode = self.mmode(mi)
            if dirty:
                sphmode = self.beamtransfer.project_vector_backward_dirty(
                    mi, mmode, nbin, normalize, threshold)
            else:
                if method == 'svd':
                    sphmode = self.beamtransfer.project_vector_telescope_to_sky(
                        mi, mmode, nbin)
                elif method == 'tk':
                    sphmode = self.beamtransfer.project_vector_telescope_to_sky_tk(
                        mi, mmode, nbin)
                else:
                    raise ValueError('Unknown map-making method %s' % method)

            return sphmode

        alm_list = mpiutil.parallel_map(_make_alm,
                                        range(self.telescope.mmax + 1))

        if mpiutil.rank0:

            # get center freq of each bin
            if nbin is not None:
                n, s, e = mpiutil.split_m(nfreq, nbin)
                cfreqs = np.array([
                    self.beamtransfer.telescope.frequencies[(s[i] + e[i]) / 2]
                    for i in range(nbin)
                ])
            else:
                nbin = nfreq
                cfreqs = self.beamtransfer.telescope.frequencies

            alm = np.zeros((nbin, self.telescope.num_pol_sky,
                            self.telescope.lmax + 1, self.telescope.lmax + 1),
                           dtype=np.complex128)

            for mi in range(self.telescope.mmax + 1):

                alm[..., mi] = alm_list[mi]

            skymap = hputil.sphtrans_inv_sky(alm, nside)

            with h5py.File(self.output_directory + '/' + mapname, 'w') as f:
                f.create_dataset('/map', data=skymap)
                f.attrs['frequency'] = cfreqs
                f.attrs['polarization'] = np.array(
                    ['I', 'Q', 'U',
                     'V'])[:self.beamtransfer.telescope.num_pol_sky]

        mpiutil.barrier()
Beispiel #12
0
    def generate(self, regen=False):
        """Calculate the total Fisher matrix and bias and save to a file.

        Parameters
        ----------
        regen : boolean, optional
            Force regeneration if products already exist (default `False`).
        """

        if mpiutil.rank0:
            st = time.time()
            print "======== Starting PS calculation ========"

        ffile = self.psdir +'/fisher.hdf5'

        if os.path.exists(ffile) and not regen:
            print ("Fisher matrix file: %s exists. Skipping..." % ffile)
            return

        mpiutil.barrier()

        # Pre-compute all the angular power spectra for the bands
        self.genbands()

        # Use parallel map to distribute Fisher calculation
        fisher_bias = mpiutil.parallel_map(self.fisher_bias_m, range(self.telescope.mmax + 1))

        # Unpack into separate lists of the Fisher matrix and bias
        fisher, bias = zip(*fisher_bias)

        # Sum over all m-modes to get the over all Fisher and bias
        self.fisher = np.sum(np.array(fisher), axis=0).real # Be careful of the .real here
        self.bias = np.sum(np.array(bias), axis=0).real # Be careful of the .real here

        # Write out all the PS estimation products
        if mpiutil.rank0:
            et = time.time()
            print "======== Ending PS calculation (time=%f) ========" % (et - st)

            # Check to see ensure that Fisher matrix isn't all zeros.
            if not (self.fisher == 0).all():
                # Generate derived quantities (covariance, errors..)
                cv = la.inv(self.fisher)
                err = cv.diagonal()**0.5
                cr = cv / np.outer(err, err)
            else:
                cv = np.zeros_like(self.fisher)
                err = cv.diagonal()
                cr = np.zeros_like(self.fisher)

            f = h5py.File(self.psdir + '/fisher.hdf5', 'w')
            f.attrs['bandtype'] = self.bandtype

            f.create_dataset('fisher/', data=self.fisher)
            f.create_dataset('bias/', data=self.bias)
            f.create_dataset('covariance/', data=cv)
            f.create_dataset('errors/', data=err)
            f.create_dataset('correlation/', data=cr)


            f.create_dataset('band_power/', data=self.band_power)

            if self.bandtype == 'polar':
                f.create_dataset('k_start/', data=self.k_start)
                f.create_dataset('k_end/', data=self.k_end)
                f.create_dataset('k_center/', data=self.k_center)

                f.create_dataset('theta_start/', data=self.theta_start)
                f.create_dataset('theta_end/', data=self.theta_end)
                f.create_dataset('theta_center/', data=self.theta_center)

                f.create_dataset('k_bands', data=self.k_bands)
                f.create_dataset('theta_bands', data=self.theta_bands)

            elif self.bandtype == 'cartesian':

                f.create_dataset('kpar_start/', data=self.kpar_start)
                f.create_dataset('kpar_end/', data=self.kpar_end)
                f.create_dataset('kpar_center/', data=self.kpar_center)

                f.create_dataset('kperp_start/', data=self.kperp_start)
                f.create_dataset('kperp_end/', data=self.kperp_end)
                f.create_dataset('kperp_center/', data=self.kperp_center)

                f.create_dataset('kpar_bands', data=self.kpar_bands)
                f.create_dataset('kperp_bands', data=self.kperp_bands)


            f.close()
Beispiel #13
0
    def mapmake_full(self, nside, mapname, nbin=None, dirty=False, method='svd', normalize=True, threshold=1.0e3, eps=0.01, correct_order=0, prior_map_file=None):

        nfreq = self.telescope.nfreq
        if nbin is None:
            nbin = nfreq
        else:
            if (nbin < 1 or nbin > nfreq): # invalid nbin
                nbin = nfreq
            else:
                nbin = int(nbin)

        if prior_map_file is not None:
            # read in the prior sky map
            with h5py.File(prior_map_file, 'r') as f:
                prior_map = f['map'][:] # shape (nbin, npol, npix)

            # alm of the prior map
            alm0 = hputil.sphtrans_sky(prior_map, lmax=self.telescope.lmax).reshape(nbin, self.telescope.num_pol_sky, self.telescope.lmax+1, self.telescope.lmax+1) # shape (nbin, npol, lmax+1, lmax+1)
        else:
            alm0 = None

        def _make_alm(mi):

            print "Making %i" % mi

            mmode = self.mmode(mi)
            if dirty:
                sphmode = self.beamtransfer.project_vector_backward_dirty(mi, mmode, nbin, normalize, threshold)
            else:
                if method == 'svd':
                    sphmode = self.beamtransfer.project_vector_telescope_to_sky(mi, mmode, nbin)
                elif method == 'tk':
                    # sphmode = self.beamtransfer.project_vector_telescope_to_sky_tk(mi, mmode, nbin, eps=eps)
                    mmode0 = alm0[:, :, :, mi] if alm0 is not None else None
                    sphmode = self.beamtransfer.project_vector_telescope_to_sky_tk(mi, mmode, nbin, eps=eps, correct_order=correct_order, mmode0=mmode0)
                else:
                    raise ValueError('Unknown map-making method %s' % method)

            return sphmode

        alm_list = mpiutil.parallel_map(_make_alm, range(self.telescope.mmax + 1), root=0, method='rand')

        if mpiutil.rank0:

            # get center freq of each bin
            n, s, e = mpiutil.split_m(nfreq, nbin)
            cfreqs = np.array([ self.beamtransfer.telescope.frequencies[(s[i]+e[i])/2] for i in range(nbin) ])

            alm = np.zeros((nbin, self.telescope.num_pol_sky, self.telescope.lmax + 1,
                            self.telescope.lmax + 1), dtype=np.complex128)

            mlist = range(1 if self.no_m_zero else 0, self.telescope.mmax + 1)

            for mi in mlist:

                alm[..., mi] = alm_list[mi]

                alm[:, :, 100:, 1] = 0

            skymap = hputil.sphtrans_inv_sky(alm, nside)

            with h5py.File(self.output_directory + '/' + mapname, 'w') as f:
                f.create_dataset('/map', data=skymap)
                f.attrs['frequency'] = cfreqs
                f.attrs['polarization'] = np.array(['I', 'Q', 'U', 'V'])[:self.beamtransfer.telescope.num_pol_sky]

        mpiutil.barrier()
Beispiel #14
0
    def generate(self, regen=False):
        """Calculate the total Fisher matrix and bias and save to a file.

        Parameters
        ----------
        regen : boolean, optional
            Force regeneration if products already exist (default `False`).
        """

        if mpiutil.rank0:
            st = time.time()
            print "======== Starting PS calculation ========"

        ffile = self.psdir + "/fisher.hdf5"

        if os.path.exists(ffile) and not regen:
            print ("Fisher matrix file: %s exists. Skipping..." % ffile)
            return

        mpiutil.barrier()

        # Pre-compute all the angular power spectra for the bands
        self.genbands()

        # Use parallel map to distribute Fisher calculation
        fisher_bias = mpiutil.parallel_map(self.fisher_bias_m, range(self.telescope.mmax + 1))

        # Unpack into separate lists of the Fisher matrix and bias
        fisher, bias = zip(*fisher_bias)

        # Sum over all m-modes to get the over all Fisher and bias
        self.fisher = np.sum(np.array(fisher), axis=0).real  # Be careful of the .real here
        self.bias = np.sum(np.array(bias), axis=0).real  # Be careful of the .real here

        # Write out all the PS estimation products
        if mpiutil.rank0:
            et = time.time()
            print "======== Ending PS calculation (time=%f) ========" % (et - st)

            # Check to see ensure that Fisher matrix isn't all zeros.
            if not (self.fisher == 0).all():
                # Generate derived quantities (covariance, errors..)
                cv = la.inv(self.fisher)
                err = cv.diagonal() ** 0.5
                cr = cv / np.outer(err, err)
            else:
                cv = np.zeros_like(self.fisher)
                err = cv.diagonal()
                cr = np.zeros_like(self.fisher)

            f = h5py.File(self.psdir + "/fisher.hdf5", "w")
            f.attrs["bandtype"] = self.bandtype

            f.create_dataset("fisher/", data=self.fisher)
            f.create_dataset("bias/", data=self.bias)
            f.create_dataset("covariance/", data=cv)
            f.create_dataset("errors/", data=err)
            f.create_dataset("correlation/", data=cr)

            f.create_dataset("band_power/", data=self.band_power)

            if self.bandtype == "polar":
                f.create_dataset("k_start/", data=self.k_start)
                f.create_dataset("k_end/", data=self.k_end)
                f.create_dataset("k_center/", data=self.k_center)

                f.create_dataset("theta_start/", data=self.theta_start)
                f.create_dataset("theta_end/", data=self.theta_end)
                f.create_dataset("theta_center/", data=self.theta_center)

                f.create_dataset("k_bands", data=self.k_bands)
                f.create_dataset("theta_bands", data=self.theta_bands)

            elif self.bandtype == "cartesian":

                f.create_dataset("kpar_start/", data=self.kpar_start)
                f.create_dataset("kpar_end/", data=self.kpar_end)
                f.create_dataset("kpar_center/", data=self.kpar_center)

                f.create_dataset("kperp_start/", data=self.kperp_start)
                f.create_dataset("kperp_end/", data=self.kperp_end)
                f.create_dataset("kperp_center/", data=self.kperp_center)

                f.create_dataset("kpar_bands", data=self.kpar_bands)
                f.create_dataset("kperp_bands", data=self.kperp_bands)

            f.close()
separator(sec, 'gather_list')
if rank == 0:
    lst = [0.5, 2]
elif rank == 1:
    lst = ['a', False, 'xy']
elif rank == 2:
    lst = [{'x': 1}]
else:
    lst = []
lst = mpiutil.gather_list(lst, root=None)
print 'rank %d has %s after gather_list' % (rank, lst)

# parallel_map
separator(sec, 'parallel_map')
glist = range(6)
result = mpiutil.parallel_map(lambda x: x * x, glist, root=0)
if rank == 0:
    print 'result = %s' % result

# split_all
separator(sec, 'split_all')
print 'rank %d has: %s' % (rank, mpiutil.split_all(6))

# split_local
separator(sec, 'split_local')
print 'rank %d has: %s' % (rank, mpiutil.split_local(6))

# gather_array
separator(sec, 'gather_array')
if rank == 0:
    local_ary = np.array([[0, 1], [6, 7]])
Beispiel #16
0
def cross_powerspectrum(timestreams, psname, psfile):

    import scipy.linalg as la

    if os.path.exists(psfile):
        print "File %s exists. Skipping..." % psfile
        return

    products = timestreams[0].manager

    ps = products.psestimators[psname]
    ps.genbands()

    nstream = len(timestreams)

    def _q_estimate(mi):

        qp = np.zeros((nstream, nstream, ps.nbands), dtype=np.float64)

        for ti in range(nstream):
            for tj in range(ti+1, nstream):

                print "Making m=%i (%i, %i)" % (mi, ti, tj)

                si = timestreams[ti]
                sj = timestreams[tj]

                qp[ti, tj] = ps.q_estimator(mi, si.mmode_kl(mi), sj.mmode_kl(mi))
                qp[tj, ti] = qp[ti, tj]

        return qp

    # Determine whether to use m=0 or not
    mlist = range(1 if timestreams[0].no_m_zero else 0, products.telescope.mmax + 1)
    qvals = mpiutil.parallel_map(_q_estimate, mlist)

    qtotal = np.array(qvals).sum(axis=0)

    fisher, bias = ps.fisher_bias()

    # Subtract bias and reshape into new array
    qtotal = (qtotal - bias).reshape(nstream**2, ps.nbands).T

    powerspectrum =  np.dot(la.inv(fisher), qtotal)
    powerspectrum = powerspectrum.T.reshape(nstream, nstream, ps.nbands)


    if mpiutil.rank0:
        with h5py.File(psfile, 'w') as f:

            cv = la.inv(fisher)
            err = cv.diagonal()**0.5
            cr = cv / np.outer(err, err)

            f.create_dataset('fisher/', data=fisher)
#                f.create_dataset('bias/', data=self.bias)
            f.create_dataset('covariance/', data=cv)
            f.create_dataset('error/', data=err)
            f.create_dataset('correlation/', data=cr)

            f.create_dataset('bandpower/', data=ps.band_power)
            #f.create_dataset('k_start/', data=ps.k_start)
            #f.create_dataset('k_end/', data=ps.k_end)
            #f.create_dataset('k_center/', data=ps.k_center)
            #f.create_dataset('psvalues/', data=ps.psvalues)

            f.create_dataset('powerspectrum', data=powerspectrum)

    # Delete cache of bands for memory reasons
    del ps.clarray
    ps.clarray = None

    mpiutil.barrier()

    return powerspectrum