def test_clump_field_parameters(): """ Make sure clump finding on fields with field parameters works. """ def _also_density(field, data): factor = data.get_field_parameter("factor") return factor * data["density"] ds = data_dir_load(i30) ds.add_field("also_density", function=_also_density, units=ds.fields.gas.density.units, sampling_type="cell", validators=[ValidateParameter("factor")]) data_source = ds.disk([0.5, 0.5, 0.5], [0., 0., 1.], (8, 'kpc'), (1, 'kpc')) data_source.set_field_parameter("factor", 1) step = 2.0 field = ("gas", "density") c_min = 10**np.floor(np.log10(data_source[field]).min()) c_max = 10**np.floor(np.log10(data_source[field]).max() + 1) master_clump_1 = Clump(data_source, ("gas", "density")) master_clump_1.add_validator("min_cells", 20) master_clump_2 = Clump(data_source, ("gas", "also_density")) master_clump_2.add_validator("min_cells", 20) find_clumps(master_clump_1, c_min, c_max, step) find_clumps(master_clump_2, c_min, c_max, step) leaf_clumps_1 = get_lowest_clumps(master_clump_1) leaf_clumps_2 = get_lowest_clumps(master_clump_2) for c1, c2 in zip(leaf_clumps_1, leaf_clumps_2): assert_array_equal(c1["gas", "density"], c2["gas", "density"])
def test_clump_tree_save(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) ds = data_dir_load(i30) data_source = ds.disk([0.5, 0.5, 0.5], [0., 0., 1.], (8, 'kpc'), (1, 'kpc')) field = ("gas", "density") step = 2.0 c_min = 10**np.floor(np.log10(data_source[field]).min() ) c_max = 10**np.floor(np.log10(data_source[field]).max()+1) master_clump = Clump(data_source, field) master_clump.add_info_item("center_of_mass") master_clump.add_validator("min_cells", 20) find_clumps(master_clump, c_min, c_max, step) leaf_clumps = get_lowest_clumps(master_clump) fn = master_clump.save_as_dataset(fields=["density", "x", "y", "z", "particle_mass"]) ds2 = load(fn) # compare clumps in the tree t1 = [c for c in master_clump] t2 = [c for c in ds2.tree] mt1 = ds.arr([c.info["cell_mass"][1] for c in t1]) mt2 = ds2.arr([c["clump", "cell_mass"] for c in t2]) it1 = np.argsort(mt1).d.astype(int) it2 = np.argsort(mt2).d.astype(int) assert_array_equal(mt1[it1], mt2[it2]) for i1, i2 in zip(it1, it2): ct1 = t1[i1] ct2 = t2[i2] assert_array_equal(ct1["gas", "density"], ct2["grid", "density"]) assert_array_equal(ct1["all", "particle_mass"], ct2["all", "particle_mass"]) # compare leaf clumps c1 = [c for c in leaf_clumps] c2 = [c for c in ds2.leaves] mc1 = ds.arr([c.info["cell_mass"][1] for c in c1]) mc2 = ds2.arr([c["clump", "cell_mass"] for c in c2]) ic1 = np.argsort(mc1).d.astype(int) ic2 = np.argsort(mc2).d.astype(int) assert_array_equal(mc1[ic1], mc2[ic2]) os.chdir(curdir) shutil.rmtree(tmpdir)
def test_clump_finding(): n_c = 8 n_p = 1 dims = (n_c, n_c, n_c) density = np.ones(dims) high_rho = 10. # add a couple disconnected density enhancements density[2, 2, 2] = high_rho density[6, 6, 6] = high_rho # put a particle at the center of one of them dx = 1. / n_c px = 2.5 * dx * np.ones(n_p) data = { "density": density, "particle_mass": np.ones(n_p), "particle_position_x": px, "particle_position_y": px, "particle_position_z": px } ds = load_uniform_grid(data, dims) ad = ds.all_data() master_clump = Clump(ad, ("gas", "density")) master_clump.add_validator("min_cells", 1) find_clumps(master_clump, 0.5, 2. * high_rho, 10.) # there should be two children assert_equal(len(master_clump.children), 2) leaf_clumps = get_lowest_clumps(master_clump) # two leaf clumps assert_equal(len(leaf_clumps), 2) # check some clump fields assert_equal(master_clump.children[0]["density"][0].size, 1) assert_equal(master_clump.children[0]["density"][0], ad["density"].max()) assert_equal(master_clump.children[0]["particle_mass"].size, 1) assert_array_equal(master_clump.children[0]["particle_mass"], ad["particle_mass"]) assert_equal(master_clump.children[1]["density"][0].size, 1) assert_equal(master_clump.children[1]["density"][0], ad["density"].max()) assert_equal(master_clump.children[1]["particle_mass"].size, 0)
def ytclumpfind_H2(ds, dd, field, n_cut, c_max=None, step=3, N_cell_min=10, save=False, plot=False, saveplot=False, fold_out='./'): ''' The way it's implemented now only works for single "density" field. Parameter --------- ds: yt StreamDataset dd: YTRegion field: tuple tuple of str, e.g., ("gas", "density") or ("io", "....") or ("gas", "averaged_density"), etc... or just ("density") or ("stream", "density") n_cut: float or int defines lowest contour level to start searching from. e.g., density to cut the clouds. step: int multiplicative interval between subsequent contours N_cell_min: int min. number of cell s.t. clump identified is not spurious save: Boolean if true, save the clump tree as a reloadable dataset plot: Boolean if true, will plot leaf clump saveplot: boolean if true, will save figure instead of showing it fold_out: str directory to save figures Return ------ master_clump: the top of a hierarchy of clumps leaf_clumps: list of individual clumps that have no children of their own ''' if plot: assert saveplot is True # c_min = 10**np.floor(np.log10(dd[field]).min() ) # c_max = 10**np.floor(np.log10(dd[field]).max()+1) # if n_cut < 1.e-5: # n_cut = 1.0 # to make sure whatever comes out after multiplicative by # step won't be too small if step <= 1.0: step += 1 c_min = n_cut if c_max is None: c_max = (dd[field]).max() # assert np.isnan(c_min) is False and np.isnan(c_max) is False print "min/max value for finding contours: ", c_min, c_max # this "base clump" just covers the whole domain. master_clump = Clump(dd, field) # weed out clumps < N_cell_min cells. master_clump.add_validator("min_cells", N_cell_min) find_clumps(master_clump, c_min, c_max, step) if save: fn = master_clump.save_as_dataset( fields=list(field)), # "particle_mass"]) # # To reload the clump dataset # cds = yt.load(fn) # leaf_clumps_reloaded = cds.leaves # traverse clump hierarchy to get list of all 'leaf' clumps, which are the # individual clumps that have no children of their own leaf_clumps = get_lowest_clumps(master_clump) # print "printing sth here...", ds.tree["clump", field] # # *** AttributeError: 'StreamDataset' object has no attribute 'tree' if plot: plotclumps(ds=ds, leaf_clumps=leaf_clumps, field=field, master_clump=master_clump, saveplot=saveplot, fold_out=fold_out, n_cut=n_cut, N_cell_min=N_cell_min, step=step ) return master_clump, leaf_clumps