<html><body>
<p>4 new commits in yt:</p>
<p><a href="https://bitbucket.org/yt_analysis/yt/commits/5bfe471daf43/">https://bitbucket.org/yt_analysis/yt/commits/5bfe471daf43/</a> Changeset:   5bfe471daf43 Branch:      yt User:        jmoloney Date:        2016-04-06 22:50:29+00:00 Summary:     Removing outdated and broken Rockstar halo loading (replaced by Rockstar frontend). Affected #:  3 files</p>
<p>diff -r 2b15ed4adb92292dc18d50f778b813f7e003cfc3 -r 5bfe471daf43204c2b8161cfa069e21ba525f11c yt/analysis_modules/halo_finding/api.py --- a/yt/analysis_modules/halo_finding/api.py +++ b/yt/analysis_modules/halo_finding/api.py @@ -28,7 +28,4 @@</p>
<pre>HaloFinder, \
LoadHaloes, \
LoadTextHalos, \</pre>
<ul><li><p>LoadTextHaloes, \</p></li>
<li><p>RockstarHalo, \</p></li>
<li><p>RockstarHaloList, \</p></li>
<li><p>LoadRockstarHalos</p></li></ul>
<p>+    LoadTextHaloes</p>
<p>diff -r 2b15ed4adb92292dc18d50f778b813f7e003cfc3 -r 5bfe471daf43204c2b8161cfa069e21ba525f11c yt/analysis_modules/halo_finding/halo_objects.py --- a/yt/analysis_modules/halo_finding/halo_objects.py +++ b/yt/analysis_modules/halo_finding/halo_objects.py @@ -560,126 +560,6 @@</p>
<pre>        return (mag_A, mag_B, mag_C, e0_vector[0], e0_vector[1],
            e0_vector[2], tilt)
</pre>
<p>-class RockstarHalo(Halo):</p>
<ul><li><p>_name = “RockstarHalo”</p></li>
<li><p># See particle_mask</p></li>
<li><p>_radjust = 4.</p></li></ul>
<p>–</p>
<ul><li><p>def maximum_density(self):</p></li>
<li><p>r"""Not implemented."""</p></li>
<li><p>return -1</p></li></ul>
<p>–</p>
<ul><li><p>def maximum_density_location(self):</p></li>
<li><p>r"""Not implemented."""</p></li>
<li><p>return self.center_of_mass()</p></li></ul>
<p>–</p>
<ul><li><p>def write_particle_list(self,handle):</p></li>
<li><p>r"""Not implemented."""</p></li>
<li><p>return -1</p></li></ul>
<p>–</p>
<ul><li><p>def virial_mass(self):</p></li>
<li><p>r"""Virial mass in Msun/h"""</p></li>
<li><p>return self.supp['m']</p></li></ul>
<p>–</p>
<ul><li><p>def virial_radius(self):</p></li>
<li><p>r"""Virial radius in Mpc/h comoving"""</p></li>
<li><p>return self.supp['r']</p></li></ul>
<p>–</p>
<ul><li><p>def __getitem__(self, key):</p></li>
<li><p># This function will try to get particle data in one of three ways,</p></li>
<li><p># in descending preference.</p></li>
<li><p># 1. From saved_fields, e.g. we've already got it.</p></li>
<li><p># 2. From the halo binary files off disk.</p></li>
<li><p># 3. Use the unique particle indexes of the halo to select a missing</p></li>
<li><p># field from a Sphere.</p></li>
<li><p>if key in self._saved_fields:</p></li>
<li><p># We've already got it.</p></li>
<li><p>return self._saved_fields[key]</p></li>
<li><p># Gotta go get it from the Rockstar binary file.</p></li>
<li><p>if key == ‘particle_index’:</p></li>
<li><p>IDs = self._get_particle_data(self.supp['id'],</p></li>
<li><p>self.halo_list.halo_to_fname, self.size, key)</p></li>
<li><p>IDs = IDs[IDs.argsort()]</p></li>
<li><p>self._saved_fields[key] = IDs</p></li>
<li><p>return self._saved_fields[key]</p></li>
<li><p># We won't store this field below in saved_fields because</p></li>
<li><p># that would mean keeping two copies of it, one in the yt</p></li>
<li><p># machinery and one here.</p></li>
<li><p>ds = self.ds.sphere(self.CoM, 4 * self.max_radius)</p></li>
<li><p>return np.take(ds[key][self._ds_sort], self.particle_mask)</p></li></ul>
<p>–</p>
<ul><li><p>def _get_particle_data(self, halo, fnames, size, field):</p></li>
<li><p># Given a list of file names, a halo, its size, and the desired field,</p></li>
<li><p># this returns the particle indices for that halo.</p></li>
<li><p>file = fnames[halo]</p></li>
<li><p>mylog.info("Getting %d particles from Rockstar binary file %s.", self.supp['num_p'], file)</p></li>
<li><p>fp = open(file, ‘rb’)</p></li>
<li><p># We need to skip past the header and all the halos.</p></li>
<li><p>fp.seek(self.halo_list._header_dt.itemsize + \</p></li>
<li><p>self.halo_list.fname_halos[file] * \</p></li>
<li><p>self.halo_list._halo_dt.itemsize, os.SEEK_CUR)</p></li>
<li><p># Now we skip ahead to where this halos particles begin.</p></li>
<li><p>fp.seek(self.supp['p_start'] * 8, os.SEEK_CUR)</p></li>
<li><p># And finally, read in the ids.</p></li>
<li><p>IDs = np.fromfile(fp, dtype=np.int64, count=self.supp['num_p'])</p></li>
<li><p>fp.close()</p></li>
<li><p>return IDs</p></li></ul>
<p>–</p>
<ul><li><p>def get_ellipsoid_parameters(self):</p></li>
<li><p>r"""Calculate the parameters that describe the ellipsoid of</p></li>
<li><p>the particles that constitute the halo.</p></li></ul>
<p>–</p>
<ul><li><p>Parameters</p></li>
<li><p>----------</p></li>
<li><p>None</p></li></ul>
<p>–</p>
<ul><li><p>Returns</p></li>
<li><p>-------</p></li>
<li><p>tuple : (cm, mag_A, mag_B, mag_C, e0_vector, tilt)</p></li>
<li><p>The 6-tuple has in order:</p></li>
<li><p>#. The center of mass as an array.</p></li>
<li><p>#. mag_A as a float.</p></li>
<li><p>#. mag_B as a float.</p></li>
<li><p>#. mag_C as a float.</p></li>
<li><p>#. e0_vector as an array.</p></li>
<li><p>#. tilt as a float.</p></li></ul>
<p>–</p>
<ul><li><p>Examples</p></li>
<li><p>--------</p></li>
<li><blockquote><blockquote><blockquote><p>params = halos[0].get_ellipsoid_parameters()</p></blockquote></blockquote></blockquote></li>
<li><p>"""</p></li>
<li><p>basic_parameters = self._get_ellipsoid_parameters_basic()</p></li>
<li><p>toreturn = [self.center_of_mass()]</p></li>
<li><p>updated = [basic_parameters[0], basic_parameters[1],</p></li>
<li><p>basic_parameters[2], np.array([basic_parameters[3],</p></li>
<li><p>basic_parameters[4], basic_parameters[5]]), basic_parameters[6]]</p></li>
<li><p>toreturn.extend(updated)</p></li>
<li><p>return tuple(toreturn)</p></li></ul>
<p>–</p>
<ul><li><p>def get_ellipsoid(self):</p></li>
<li><p>r"""Returns an ellipsoidal data object.</p></li></ul>
<p>–</p>
<ul><li><p>This will generate a new, empty ellipsoidal data object for this</p></li>
<li><p>halo.</p></li></ul>
<p>–</p>
<ul><li><p>Parameters</p></li>
<li><p>----------</p></li>
<li><p>None.</p></li></ul>
<p>–</p>
<ul><li><p>Returns</p></li>
<li><p>-------</p></li>
<li><p>ellipsoid : `yt.data_objects.data_containers.YTEllipsoid`</p></li>
<li><p>The ellipsoidal data object.</p></li></ul>
<p>–</p>
<ul><li><p>Examples</p></li>
<li><p>--------</p></li>
<li><blockquote><blockquote><blockquote><p>ell = halos[0].get_ellipsoid()</p></blockquote></blockquote></blockquote></li>
<li><p>"""</p></li>
<li><p>ep = self.get_ellipsoid_parameters()</p></li>
<li><p>ell = self.data.ds.ellipsoid(ep[0], ep[1], ep[2], ep[3],</p></li>
<li><p>ep[4], ep[5])</p></li>
<li><p>return ell</p></li></ul>
<p>–</p>
<pre>class HOPHalo(Halo):
    _name = "HOPHalo"
    pass</pre>
<p>@@ -1126,134 +1006,6 @@</p>
<pre>            f.flush()
        f.close()
</pre>
<p>-class RockstarHaloList(HaloList):</p>
<ul><li><p>_name = “Rockstar”</p></li>
<li><p>_halo_class = RockstarHalo</p></li>
<li><p># see io_internal.h in Rockstar.</p></li>
<li><p>BINARY_HEADER_SIZE=256</p></li>
<li><p>_header_dt = np.dtype([('magic', np.uint64), ('snap', np.int64),</p></li>
<li><p>('chunk', np.int64), ('scale', np.float32), ('Om', np.float32),</p></li>
<li><p>('Ol', np.float32), ('h0', np.float32),</p></li>
<li><p>('bounds', (np.float32, 6)), ('num_halos', np.int64),</p></li>
<li><p>('num_particles', np.int64), ('box_size', np.float32),</p></li>
<li><p>('particle_mass', np.float32), ('particle_type', np.int64),</p></li>
<li><p>('unused', (np.byte, BINARY_HEADER_SIZE – 4*12 – 8*6))])</p></li>
<li><p># see halo.h.</p></li>
<li><p>_halo_dt = np.dtype([('id', np.int64), ('pos', (np.float32, 6)),</p></li>
<li><p>('corevel', (np.float32, 3)), ('bulkvel', (np.float32, 3)),</p></li>
<li><p>('m', np.float32), ('r', np.float32), ('child_r', np.float32),</p></li>
<li><p>('vmax_r', np.float32),</p></li>
<li><p>('mgrav', np.float32), ('vmax', np.float32),</p></li>
<li><p>('rvmax', np.float32), ('rs', np.float32),</p></li>
<li><p>('klypin_rs', np.float32),</p></li>
<li><p>('vrms', np.float32), ('J', (np.float32, 3)),</p></li>
<li><p>('energy', np.float32), ('spin', np.float32),</p></li>
<li><p>('alt_m', (np.float32, 4)), ('Xoff', np.float32),</p></li>
<li><p>('Voff', np.float32), ('b_to_a', np.float32),</p></li>
<li><p>('c_to_a', np.float32), ('A', (np.float32, 3)),</p></li>
<li><p>('bullock_spin', np.float32), ('kin_to_pot', np.float32),</p></li>
<li><p>('num_p', np.int64),</p></li>
<li><p>('num_child_particles', np.int64), ('p_start', np.int64),</p></li>
<li><p>('desc', np.int64), ('flags', np.int64), ('n_core', np.int64),</p></li>
<li><p>('min_pos_err', np.float32), ('min_vel_err', np.float32),</p></li>
<li><p>('min_bulkvel_err', np.float32), ('padding2', np.float32),])</p></li>
<li><p># Above, padding* are due to c byte ordering which pads between</p></li>
<li><p># 4 and 8 byte values in the struct as to not overlap memory registers.</p></li>
<li><p>_tocleanup = ['padding2']</p></li></ul>
<p>–</p>
<ul><li><p>def __init__(self, ds, out_list):</p></li>
<li><p>ParallelAnalysisInterface.__init__(self)</p></li>
<li><p>mylog.info("Initializing Rockstar List")</p></li>
<li><p>self._data_source = None</p></li>
<li><p>self._groups = []</p></li>
<li><p>self._max_dens = -1</p></li>
<li><p>self.ds = ds</p></li>
<li><p>self.redshift = ds.current_redshift</p></li>
<li><p>self.out_list = out_list</p></li>
<li><p>self._data_source = ds.all_data()</p></li>
<li><p>mylog.info("Parsing Rockstar halo list")</p></li>
<li><p>self._parse_output()</p></li>
<li><p>mylog.info("Finished %s"%out_list)</p></li></ul>
<p>–</p>
<ul><li><p>def _run_finder(self):</p></li>
<li><p>pass</p></li></ul>
<p>–</p>
<ul><li><p>def __obtain_particles(self):</p></li>
<li><p>pass</p></li></ul>
<p>–</p>
<ul><li><p>def _get_dm_indices(self):</p></li>
<li><p>pass</p></li></ul>
<p>–</p>
<ul><li><p>def _get_halos_binary(self, files):</p></li>
<li><p>"""</p></li>
<li><p>Parse the binary files to get information about halos in higher</p></li>
<li><p>precision than the text file.</p></li>
<li><p>"""</p></li>
<li><p>halos = None</p></li>
<li><p>self.halo_to_fname = {}</p></li>
<li><p>self.fname_halos = {}</p></li>
<li><p>for file in files:</p></li>
<li><p>fp = open(file, ‘rb’)</p></li>
<li><p># read the header</p></li>
<li><p>header = np.fromfile(fp, dtype=self._header_dt, count=1)</p></li>
<li><p># read the halo information</p></li>
<li><p>new_halos = np.fromfile(fp, dtype=self._halo_dt,</p></li>
<li><p>count=header['num_halos'])</p></li>
<li><p># Record which binary file holds these halos.</p></li>
<li><p>for halo in new_halos['id']:</p></li>
<li><p>self.halo_to_fname[halo] = file</p></li>
<li><p># Record how many halos are stored in each binary file.</p></li>
<li><p>self.fname_halos[file] = header['num_halos']</p></li>
<li><p># Add to existing.</p></li>
<li><p>if halos is not None:</p></li>
<li><p>halos = np.concatenate((new_halos, halos))</p></li>
<li><p>else:</p></li>
<li><p>halos = new_halos.copy()</p></li>
<li><p>fp.close()</p></li>
<li><p># Sort them by mass.</p></li>
<li><p>halos.sort(order='m')</p></li>
<li><p>halos = np.flipud(halos)</p></li>
<li><p>return halos</p></li></ul>
<p>–</p>
<ul><li><p>def _parse_output(self):</p></li>
<li><p>"""</p></li>
<li><p>Read the out_*.list text file produced</p></li>
<li><p>by Rockstar into memory."""</p></li></ul>
<p>–</p>
<ul><li><p>ds = self.ds</p></li>
<li><p># In order to read the binary data, we need to figure out which</p></li>
<li><p># binary files belong to this output.</p></li>
<li><p>basedir = os.path.dirname(self.out_list)</p></li>
<li><p>s = self.out_list.split('_')[-1]</p></li>
<li><p>s = s.rstrip('.list')</p></li>
<li><p>n = int(s)</p></li>
<li><p>fglob = path.join(basedir, ‘halos_%d.*.bin’ % n)</p></li>
<li><p>files = glob.glob(fglob)</p></li>
<li><p>halos = self._get_halos_binary(files)</p></li>
<li><p>length = 1.0 / ds['Mpchcm']</p></li>
<li><p>conv = dict(pos = np.array([length, length, length,</p></li>
<li><p>1, 1, 1]), # to unitary</p></li>
<li><p>r=1.0/ds['kpchcm'], # to unitary</p></li>
<li><p>rs=1.0/ds['kpchcm'], # to unitary</p></li>
<li><p>)</p></li>
<li><p>#convert units</p></li>
<li><p>for name in self._halo_dt.names:</p></li>
<li><p>halos[name]=halos[name]*conv.get(name,1)</p></li>
<li><p># Store the halos in the halo list.</p></li>
<li><p>for i, row in enumerate(halos):</p></li>
<li><p>supp = {name:row[name] for name in self._halo_dt.names}</p></li>
<li><p># Delete the padding columns. ‘supp’ below will contain</p></li>
<li><p># repeated information, but that's OK.</p></li>
<li><p>for item in self._tocleanup: del supp[item]</p></li>
<li><p>halo = RockstarHalo(self, i, size=row['num_p'],</p></li>
<li><p>CoM=row['pos'][0:3], group_total_mass=row['m'],</p></li>
<li><p>max_radius=row['r'], bulk_vel=row['bulkvel'],</p></li>
<li><p>rms_vel=row['vrms'], supp=supp)</p></li>
<li><p>self._groups.append(halo)</p></li></ul>
<p>–</p>
<ul><li><p>def write_particle_list(self):</p></li>
<li><p>pass</p></li></ul>
<p>–</p>
<pre>class HOPHaloList(HaloList):
    """
    Run hop on *data_source* with a given density *threshold*.  If</pre>
<p>@@ -1961,22 +1713,3 @@</p>
<pre>        TextHaloList.__init__(self, ds, filename, columns, comment)

LoadTextHalos = LoadTextHaloes</pre>
<p>– -class LoadRockstarHalos(GenericHaloFinder, RockstarHaloList):</p>
<ul><li><p>r"""Load Rockstar halos off disk from Rockstar-output format.</p></li></ul>
<p>–</p>
<ul><li><p>Parameters</p></li>
<li><p>----------</p></li>
<li><p>fname : String</p></li>
<li><p>The name of the Rockstar file to read in. Default =</p></li>
<li><p>"rockstar_halos/out_0.list'.</p></li></ul>
<p>–</p>
<ul><li><p>Examples</p></li>
<li><p>--------</p></li>
<li><blockquote><blockquote><blockquote><p>ds = load("data0005")</p></blockquote></blockquote></blockquote></li>
<li><blockquote><blockquote><blockquote><p>halos = LoadRockstarHalos(ds, “other_name.out”)</p></blockquote></blockquote></blockquote></li>
<li><p>"""</p></li>
<li><p>def __init__(self, ds, filename = None):</p></li>
<li><p>if filename is None:</p></li>
<li><p>filename = ‘rockstar_halos/out_0.list’</p></li>
<li><p>RockstarHaloList.__init__(self, ds, filename)</p></li></ul>
<p>diff -r 2b15ed4adb92292dc18d50f778b813f7e003cfc3 -r 5bfe471daf43204c2b8161cfa069e21ba525f11c yt/analysis_modules/halo_finding/rockstar/rockstar.py --- a/yt/analysis_modules/halo_finding/rockstar/rockstar.py +++ b/yt/analysis_modules/halo_finding/rockstar/rockstar.py @@ -366,10 +366,3 @@</p>
<pre>self.runner.run(self.handler, self.workgroup)
         self.comm.barrier()
         self.pool.free_all()</pre>
<p>–</p>
<ul><li><p>def halo_list(self,file_name='out_0.list'):</p></li>
<li><p>"""</p></li>
<li><p>Reads in the out_0.list file and generates RockstarHaloList</p></li>
<li><p>and RockstarHalo objects.</p></li>
<li><p>"""</p></li>
<li><p>return RockstarHaloList(self.ts[0], self.outbase+'/%s'%file_name)</p></li></ul>
<p><a href="https://bitbucket.org/yt_analysis/yt/commits/17018cfdd3cf/">https://bitbucket.org/yt_analysis/yt/commits/17018cfdd3cf/</a> Changeset:   17018cfdd3cf Branch:      yt User:        jmoloney Date:        2016-04-06 23:02:35+00:00 Summary:     Removing unused import. Affected #:  1 file</p>
<p>diff -r 5bfe471daf43204c2b8161cfa069e21ba525f11c -r 17018cfdd3cf5fa2aeea5020c05fcfef34a3de21 yt/analysis_modules/halo_finding/rockstar/rockstar.py --- a/yt/analysis_modules/halo_finding/rockstar/rockstar.py +++ b/yt/analysis_modules/halo_finding/rockstar/rockstar.py @@ -21,8 +21,6 @@</p>
<pre>    is_root, mylog
from yt.utilities.parallel_tools.parallel_analysis_interface import \
    ParallelAnalysisInterface, ProcessorPool</pre>
<p>-from yt.analysis_modules.halo_finding.halo_objects import \</p>
<ul><li><p>RockstarHaloList</p></li></ul>
<pre>from yt.utilities.exceptions import YTRockstarMultiMassNotSupported

from . import rockstar_interface</pre>
<p><a href="https://bitbucket.org/yt_analysis/yt/commits/4d97401768f1/">https://bitbucket.org/yt_analysis/yt/commits/4d97401768f1/</a> Changeset:   4d97401768f1 Branch:      yt User:        jmoloney Date:        2016-04-07 17:31:12+00:00 Summary:     Removed unused imports. Affected #:  1 file</p>
<p>diff -r 17018cfdd3cf5fa2aeea5020c05fcfef34a3de21 -r 4d97401768f14c1c67a3a57ab43a77c1f08322c7 yt/analysis_modules/halo_finding/halo_objects.py --- a/yt/analysis_modules/halo_finding/halo_objects.py +++ b/yt/analysis_modules/halo_finding/halo_objects.py @@ -17,8 +17,6 @@</p>
<pre>from yt.utilities.on_demand_imports import _h5py as h5py
import math
import numpy as np</pre>
<p>-import glob -import os</p>
<pre>import os.path as path
from functools import cmp_to_key
from yt.extern.six import add_metaclass</pre>
<p><a href="https://bitbucket.org/yt_analysis/yt/commits/c7470f10bdc0/">https://bitbucket.org/yt_analysis/yt/commits/c7470f10bdc0/</a> Changeset:   c7470f10bdc0 Branch:      yt User:        ngoldbaum Date:        2016-04-07 19:38:00+00:00 Summary:     Merged in jmoloney/yt (pull request #2113)</p>
<p>Removing old Rockstar halo loading Affected #:  3 files</p>
<p>diff -r d5af145f1ac7993c2f94c2a4cc0d75824d019f98 -r c7470f10bdc0a7851036a0baa30d88f1d65e4c9c yt/analysis_modules/halo_finding/api.py --- a/yt/analysis_modules/halo_finding/api.py +++ b/yt/analysis_modules/halo_finding/api.py @@ -28,7 +28,4 @@</p>
<pre>HaloFinder, \
LoadHaloes, \
LoadTextHalos, \</pre>
<ul><li><p>LoadTextHaloes, \</p></li>
<li><p>RockstarHalo, \</p></li>
<li><p>RockstarHaloList, \</p></li>
<li><p>LoadRockstarHalos</p></li></ul>
<p>+    LoadTextHaloes</p>
<p>diff -r d5af145f1ac7993c2f94c2a4cc0d75824d019f98 -r c7470f10bdc0a7851036a0baa30d88f1d65e4c9c yt/analysis_modules/halo_finding/halo_objects.py --- a/yt/analysis_modules/halo_finding/halo_objects.py +++ b/yt/analysis_modules/halo_finding/halo_objects.py @@ -17,8 +17,6 @@</p>
<pre>from yt.utilities.on_demand_imports import _h5py as h5py
import math
import numpy as np</pre>
<p>-import glob -import os</p>
<pre>import os.path as path
from functools import cmp_to_key
from yt.extern.six import add_metaclass</pre>
<p>@@ -560,126 +558,6 @@</p>
<pre>        return (mag_A, mag_B, mag_C, e0_vector[0], e0_vector[1],
            e0_vector[2], tilt)
</pre>
<p>-class RockstarHalo(Halo):</p>
<ul><li><p>_name = “RockstarHalo”</p></li>
<li><p># See particle_mask</p></li>
<li><p>_radjust = 4.</p></li></ul>
<p>–</p>
<ul><li><p>def maximum_density(self):</p></li>
<li><p>r"""Not implemented."""</p></li>
<li><p>return -1</p></li></ul>
<p>–</p>
<ul><li><p>def maximum_density_location(self):</p></li>
<li><p>r"""Not implemented."""</p></li>
<li><p>return self.center_of_mass()</p></li></ul>
<p>–</p>
<ul><li><p>def write_particle_list(self,handle):</p></li>
<li><p>r"""Not implemented."""</p></li>
<li><p>return -1</p></li></ul>
<p>–</p>
<ul><li><p>def virial_mass(self):</p></li>
<li><p>r"""Virial mass in Msun/h"""</p></li>
<li><p>return self.supp['m']</p></li></ul>
<p>–</p>
<ul><li><p>def virial_radius(self):</p></li>
<li><p>r"""Virial radius in Mpc/h comoving"""</p></li>
<li><p>return self.supp['r']</p></li></ul>
<p>–</p>
<ul><li><p>def __getitem__(self, key):</p></li>
<li><p># This function will try to get particle data in one of three ways,</p></li>
<li><p># in descending preference.</p></li>
<li><p># 1. From saved_fields, e.g. we've already got it.</p></li>
<li><p># 2. From the halo binary files off disk.</p></li>
<li><p># 3. Use the unique particle indexes of the halo to select a missing</p></li>
<li><p># field from a Sphere.</p></li>
<li><p>if key in self._saved_fields:</p></li>
<li><p># We've already got it.</p></li>
<li><p>return self._saved_fields[key]</p></li>
<li><p># Gotta go get it from the Rockstar binary file.</p></li>
<li><p>if key == ‘particle_index’:</p></li>
<li><p>IDs = self._get_particle_data(self.supp['id'],</p></li>
<li><p>self.halo_list.halo_to_fname, self.size, key)</p></li>
<li><p>IDs = IDs[IDs.argsort()]</p></li>
<li><p>self._saved_fields[key] = IDs</p></li>
<li><p>return self._saved_fields[key]</p></li>
<li><p># We won't store this field below in saved_fields because</p></li>
<li><p># that would mean keeping two copies of it, one in the yt</p></li>
<li><p># machinery and one here.</p></li>
<li><p>ds = self.ds.sphere(self.CoM, 4 * self.max_radius)</p></li>
<li><p>return np.take(ds[key][self._ds_sort], self.particle_mask)</p></li></ul>
<p>–</p>
<ul><li><p>def _get_particle_data(self, halo, fnames, size, field):</p></li>
<li><p># Given a list of file names, a halo, its size, and the desired field,</p></li>
<li><p># this returns the particle indices for that halo.</p></li>
<li><p>file = fnames[halo]</p></li>
<li><p>mylog.info("Getting %d particles from Rockstar binary file %s.", self.supp['num_p'], file)</p></li>
<li><p>fp = open(file, ‘rb’)</p></li>
<li><p># We need to skip past the header and all the halos.</p></li>
<li><p>fp.seek(self.halo_list._header_dt.itemsize + \</p></li>
<li><p>self.halo_list.fname_halos[file] * \</p></li>
<li><p>self.halo_list._halo_dt.itemsize, os.SEEK_CUR)</p></li>
<li><p># Now we skip ahead to where this halos particles begin.</p></li>
<li><p>fp.seek(self.supp['p_start'] * 8, os.SEEK_CUR)</p></li>
<li><p># And finally, read in the ids.</p></li>
<li><p>IDs = np.fromfile(fp, dtype=np.int64, count=self.supp['num_p'])</p></li>
<li><p>fp.close()</p></li>
<li><p>return IDs</p></li></ul>
<p>–</p>
<ul><li><p>def get_ellipsoid_parameters(self):</p></li>
<li><p>r"""Calculate the parameters that describe the ellipsoid of</p></li>
<li><p>the particles that constitute the halo.</p></li></ul>
<p>–</p>
<ul><li><p>Parameters</p></li>
<li><p>----------</p></li>
<li><p>None</p></li></ul>
<p>–</p>
<ul><li><p>Returns</p></li>
<li><p>-------</p></li>
<li><p>tuple : (cm, mag_A, mag_B, mag_C, e0_vector, tilt)</p></li>
<li><p>The 6-tuple has in order:</p></li>
<li><p>#. The center of mass as an array.</p></li>
<li><p>#. mag_A as a float.</p></li>
<li><p>#. mag_B as a float.</p></li>
<li><p>#. mag_C as a float.</p></li>
<li><p>#. e0_vector as an array.</p></li>
<li><p>#. tilt as a float.</p></li></ul>
<p>–</p>
<ul><li><p>Examples</p></li>
<li><p>--------</p></li>
<li><blockquote><blockquote><blockquote><p>params = halos[0].get_ellipsoid_parameters()</p></blockquote></blockquote></blockquote></li>
<li><p>"""</p></li>
<li><p>basic_parameters = self._get_ellipsoid_parameters_basic()</p></li>
<li><p>toreturn = [self.center_of_mass()]</p></li>
<li><p>updated = [basic_parameters[0], basic_parameters[1],</p></li>
<li><p>basic_parameters[2], np.array([basic_parameters[3],</p></li>
<li><p>basic_parameters[4], basic_parameters[5]]), basic_parameters[6]]</p></li>
<li><p>toreturn.extend(updated)</p></li>
<li><p>return tuple(toreturn)</p></li></ul>
<p>–</p>
<ul><li><p>def get_ellipsoid(self):</p></li>
<li><p>r"""Returns an ellipsoidal data object.</p></li></ul>
<p>–</p>
<ul><li><p>This will generate a new, empty ellipsoidal data object for this</p></li>
<li><p>halo.</p></li></ul>
<p>–</p>
<ul><li><p>Parameters</p></li>
<li><p>----------</p></li>
<li><p>None.</p></li></ul>
<p>–</p>
<ul><li><p>Returns</p></li>
<li><p>-------</p></li>
<li><p>ellipsoid : `yt.data_objects.data_containers.YTEllipsoid`</p></li>
<li><p>The ellipsoidal data object.</p></li></ul>
<p>–</p>
<ul><li><p>Examples</p></li>
<li><p>--------</p></li>
<li><blockquote><blockquote><blockquote><p>ell = halos[0].get_ellipsoid()</p></blockquote></blockquote></blockquote></li>
<li><p>"""</p></li>
<li><p>ep = self.get_ellipsoid_parameters()</p></li>
<li><p>ell = self.data.ds.ellipsoid(ep[0], ep[1], ep[2], ep[3],</p></li>
<li><p>ep[4], ep[5])</p></li>
<li><p>return ell</p></li></ul>
<p>–</p>
<pre>class HOPHalo(Halo):
    _name = "HOPHalo"
    pass</pre>
<p>@@ -1126,134 +1004,6 @@</p>
<pre>            f.flush()
        f.close()
</pre>
<p>-class RockstarHaloList(HaloList):</p>
<ul><li><p>_name = “Rockstar”</p></li>
<li><p>_halo_class = RockstarHalo</p></li>
<li><p># see io_internal.h in Rockstar.</p></li>
<li><p>BINARY_HEADER_SIZE=256</p></li>
<li><p>_header_dt = np.dtype([('magic', np.uint64), ('snap', np.int64),</p></li>
<li><p>('chunk', np.int64), ('scale', np.float32), ('Om', np.float32),</p></li>
<li><p>('Ol', np.float32), ('h0', np.float32),</p></li>
<li><p>('bounds', (np.float32, 6)), ('num_halos', np.int64),</p></li>
<li><p>('num_particles', np.int64), ('box_size', np.float32),</p></li>
<li><p>('particle_mass', np.float32), ('particle_type', np.int64),</p></li>
<li><p>('unused', (np.byte, BINARY_HEADER_SIZE – 4*12 – 8*6))])</p></li>
<li><p># see halo.h.</p></li>
<li><p>_halo_dt = np.dtype([('id', np.int64), ('pos', (np.float32, 6)),</p></li>
<li><p>('corevel', (np.float32, 3)), ('bulkvel', (np.float32, 3)),</p></li>
<li><p>('m', np.float32), ('r', np.float32), ('child_r', np.float32),</p></li>
<li><p>('vmax_r', np.float32),</p></li>
<li><p>('mgrav', np.float32), ('vmax', np.float32),</p></li>
<li><p>('rvmax', np.float32), ('rs', np.float32),</p></li>
<li><p>('klypin_rs', np.float32),</p></li>
<li><p>('vrms', np.float32), ('J', (np.float32, 3)),</p></li>
<li><p>('energy', np.float32), ('spin', np.float32),</p></li>
<li><p>('alt_m', (np.float32, 4)), ('Xoff', np.float32),</p></li>
<li><p>('Voff', np.float32), ('b_to_a', np.float32),</p></li>
<li><p>('c_to_a', np.float32), ('A', (np.float32, 3)),</p></li>
<li><p>('bullock_spin', np.float32), ('kin_to_pot', np.float32),</p></li>
<li><p>('num_p', np.int64),</p></li>
<li><p>('num_child_particles', np.int64), ('p_start', np.int64),</p></li>
<li><p>('desc', np.int64), ('flags', np.int64), ('n_core', np.int64),</p></li>
<li><p>('min_pos_err', np.float32), ('min_vel_err', np.float32),</p></li>
<li><p>('min_bulkvel_err', np.float32), ('padding2', np.float32),])</p></li>
<li><p># Above, padding* are due to c byte ordering which pads between</p></li>
<li><p># 4 and 8 byte values in the struct as to not overlap memory registers.</p></li>
<li><p>_tocleanup = ['padding2']</p></li></ul>
<p>–</p>
<ul><li><p>def __init__(self, ds, out_list):</p></li>
<li><p>ParallelAnalysisInterface.__init__(self)</p></li>
<li><p>mylog.info("Initializing Rockstar List")</p></li>
<li><p>self._data_source = None</p></li>
<li><p>self._groups = []</p></li>
<li><p>self._max_dens = -1</p></li>
<li><p>self.ds = ds</p></li>
<li><p>self.redshift = ds.current_redshift</p></li>
<li><p>self.out_list = out_list</p></li>
<li><p>self._data_source = ds.all_data()</p></li>
<li><p>mylog.info("Parsing Rockstar halo list")</p></li>
<li><p>self._parse_output()</p></li>
<li><p>mylog.info("Finished %s"%out_list)</p></li></ul>
<p>–</p>
<ul><li><p>def _run_finder(self):</p></li>
<li><p>pass</p></li></ul>
<p>–</p>
<ul><li><p>def __obtain_particles(self):</p></li>
<li><p>pass</p></li></ul>
<p>–</p>
<ul><li><p>def _get_dm_indices(self):</p></li>
<li><p>pass</p></li></ul>
<p>–</p>
<ul><li><p>def _get_halos_binary(self, files):</p></li>
<li><p>"""</p></li>
<li><p>Parse the binary files to get information about halos in higher</p></li>
<li><p>precision than the text file.</p></li>
<li><p>"""</p></li>
<li><p>halos = None</p></li>
<li><p>self.halo_to_fname = {}</p></li>
<li><p>self.fname_halos = {}</p></li>
<li><p>for file in files:</p></li>
<li><p>fp = open(file, ‘rb’)</p></li>
<li><p># read the header</p></li>
<li><p>header = np.fromfile(fp, dtype=self._header_dt, count=1)</p></li>
<li><p># read the halo information</p></li>
<li><p>new_halos = np.fromfile(fp, dtype=self._halo_dt,</p></li>
<li><p>count=header['num_halos'])</p></li>
<li><p># Record which binary file holds these halos.</p></li>
<li><p>for halo in new_halos['id']:</p></li>
<li><p>self.halo_to_fname[halo] = file</p></li>
<li><p># Record how many halos are stored in each binary file.</p></li>
<li><p>self.fname_halos[file] = header['num_halos']</p></li>
<li><p># Add to existing.</p></li>
<li><p>if halos is not None:</p></li>
<li><p>halos = np.concatenate((new_halos, halos))</p></li>
<li><p>else:</p></li>
<li><p>halos = new_halos.copy()</p></li>
<li><p>fp.close()</p></li>
<li><p># Sort them by mass.</p></li>
<li><p>halos.sort(order='m')</p></li>
<li><p>halos = np.flipud(halos)</p></li>
<li><p>return halos</p></li></ul>
<p>–</p>
<ul><li><p>def _parse_output(self):</p></li>
<li><p>"""</p></li>
<li><p>Read the out_*.list text file produced</p></li>
<li><p>by Rockstar into memory."""</p></li></ul>
<p>–</p>
<ul><li><p>ds = self.ds</p></li>
<li><p># In order to read the binary data, we need to figure out which</p></li>
<li><p># binary files belong to this output.</p></li>
<li><p>basedir = os.path.dirname(self.out_list)</p></li>
<li><p>s = self.out_list.split('_')[-1]</p></li>
<li><p>s = s.rstrip('.list')</p></li>
<li><p>n = int(s)</p></li>
<li><p>fglob = path.join(basedir, ‘halos_%d.*.bin’ % n)</p></li>
<li><p>files = glob.glob(fglob)</p></li>
<li><p>halos = self._get_halos_binary(files)</p></li>
<li><p>length = 1.0 / ds['Mpchcm']</p></li>
<li><p>conv = dict(pos = np.array([length, length, length,</p></li>
<li><p>1, 1, 1]), # to unitary</p></li>
<li><p>r=1.0/ds['kpchcm'], # to unitary</p></li>
<li><p>rs=1.0/ds['kpchcm'], # to unitary</p></li>
<li><p>)</p></li>
<li><p>#convert units</p></li>
<li><p>for name in self._halo_dt.names:</p></li>
<li><p>halos[name]=halos[name]*conv.get(name,1)</p></li>
<li><p># Store the halos in the halo list.</p></li>
<li><p>for i, row in enumerate(halos):</p></li>
<li><p>supp = {name:row[name] for name in self._halo_dt.names}</p></li>
<li><p># Delete the padding columns. ‘supp’ below will contain</p></li>
<li><p># repeated information, but that's OK.</p></li>
<li><p>for item in self._tocleanup: del supp[item]</p></li>
<li><p>halo = RockstarHalo(self, i, size=row['num_p'],</p></li>
<li><p>CoM=row['pos'][0:3], group_total_mass=row['m'],</p></li>
<li><p>max_radius=row['r'], bulk_vel=row['bulkvel'],</p></li>
<li><p>rms_vel=row['vrms'], supp=supp)</p></li>
<li><p>self._groups.append(halo)</p></li></ul>
<p>–</p>
<ul><li><p>def write_particle_list(self):</p></li>
<li><p>pass</p></li></ul>
<p>–</p>
<pre>class HOPHaloList(HaloList):
    """
    Run hop on *data_source* with a given density *threshold*.  If</pre>
<p>@@ -1961,22 +1711,3 @@</p>
<pre>        TextHaloList.__init__(self, ds, filename, columns, comment)

LoadTextHalos = LoadTextHaloes</pre>
<p>– -class LoadRockstarHalos(GenericHaloFinder, RockstarHaloList):</p>
<ul><li><p>r"""Load Rockstar halos off disk from Rockstar-output format.</p></li></ul>
<p>–</p>
<ul><li><p>Parameters</p></li>
<li><p>----------</p></li>
<li><p>fname : String</p></li>
<li><p>The name of the Rockstar file to read in. Default =</p></li>
<li><p>"rockstar_halos/out_0.list'.</p></li></ul>
<p>–</p>
<ul><li><p>Examples</p></li>
<li><p>--------</p></li>
<li><blockquote><blockquote><blockquote><p>ds = load("data0005")</p></blockquote></blockquote></blockquote></li>
<li><blockquote><blockquote><blockquote><p>halos = LoadRockstarHalos(ds, “other_name.out”)</p></blockquote></blockquote></blockquote></li>
<li><p>"""</p></li>
<li><p>def __init__(self, ds, filename = None):</p></li>
<li><p>if filename is None:</p></li>
<li><p>filename = ‘rockstar_halos/out_0.list’</p></li>
<li><p>RockstarHaloList.__init__(self, ds, filename)</p></li></ul>
<p>diff -r d5af145f1ac7993c2f94c2a4cc0d75824d019f98 -r c7470f10bdc0a7851036a0baa30d88f1d65e4c9c yt/analysis_modules/halo_finding/rockstar/rockstar.py --- a/yt/analysis_modules/halo_finding/rockstar/rockstar.py +++ b/yt/analysis_modules/halo_finding/rockstar/rockstar.py @@ -21,8 +21,6 @@</p>
<pre>    is_root, mylog
from yt.utilities.parallel_tools.parallel_analysis_interface import \
    ParallelAnalysisInterface, ProcessorPool</pre>
<p>-from yt.analysis_modules.halo_finding.halo_objects import \</p>
<ul><li><p>RockstarHaloList</p></li></ul>
<pre>from yt.utilities.exceptions import YTRockstarMultiMassNotSupported

from . import rockstar_interface</pre>
<p>@@ -366,10 +364,3 @@</p>
<pre>self.runner.run(self.handler, self.workgroup)
         self.comm.barrier()
         self.pool.free_all()</pre>
<p>–</p>
<ul><li><p>def halo_list(self,file_name='out_0.list'):</p></li>
<li><p>"""</p></li>
<li><p>Reads in the out_0.list file and generates RockstarHaloList</p></li>
<li><p>and RockstarHalo objects.</p></li>
<li><p>"""</p></li>
<li><p>return RockstarHaloList(self.ts[0], self.outbase+'/%s'%file_name)</p></li></ul>
<p>Repository URL: <a href="https://bitbucket.org/yt_analysis/yt/">https://bitbucket.org/yt_analysis/yt/</a></p>
<p>—</p>
<p>This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email.</p>

<img src="http://link.bitbucket.org/wf/open?upn=ll4ctv0L-2ByeRZFC1LslHcg6aJmnQ70VruLbmeLQr27B-2F4h4BZ4wJe3nuM1-2BQQpKA2iQlU9dgtJNSnR5iewIFLkzMBUwqzkRnSEi8hoKy8WOeskNDj8NnIjIDoaoK1xjKXUH04WO5B7Ys0dI4zvFHez-2BCzYAsw8599aKq7fx4-2Fj7MhqgtLA8sIqXvpYswv4da7myHrvXbgDR1KV9F3lii4EnEfp-2FydXi05V-2FbL8z0Yg4-3D" alt="" width="1" height="1" border="0" style="height:1px !important;width:1px !important;border-width:0 !important;margin-top:0 !important;margin-bottom:0 !important;margin-right:0 !important;margin-left:0 !important;padding-top:0 !important;padding-bottom:0 !important;padding-right:0 !important;padding-left:0 !important;"/>
</body></html>