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()
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()
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()
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()
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
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
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()
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()
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()
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
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()
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()
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()
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]])
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