diff --git a/doc/RTD/source/VELOCIraptorInterface/output.rst b/doc/RTD/source/VELOCIraptorInterface/output.rst index b903a650125ca11c9323a61d418072fd89d953b1..cf0e386d4a7de982dcca5a2ddc5ebd642c46ec34 100644 --- a/doc/RTD/source/VELOCIraptorInterface/output.rst +++ b/doc/RTD/source/VELOCIraptorInterface/output.rst @@ -58,6 +58,64 @@ Besides the ``.catalog_particles`` file, there is also a but only for the unbound particles, a particle can only be present in one of these two lists. +Extracting the particles in a given halo +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``.catalog_particles`` file returns particle IDs that need to be matched +with those in your snapshot to find the particles in the file that you +wish to extract. The python snippet below should give you an idea of how to +go about doing this for the bound particles. + +First, we need to extract the offset from the ``.catalog_group`` file, and +work out how many _bound_ partices are in our halo. We can do this by +looking at the next offset. Then, we can ID match those with the snapshot +file, and get the mask for the _positions_ in the file that correspond +to our bound particles. (Note this requires ``numpy > 1.15.0``). + +.. code-block:: python + :linenos: + + import numpy as np + import h5py + + snapshot_file = h5py.File("swift_snapshot.hdf5", "r") + group_file = h5py.File("velociraptor_output.catalog_group", "r") + particles_file = h5py.File("velociraptor_output.catalog_particles", "r") + + halo = 100 + # Grab the start position in the particles file to read from + halo_start_position = group_file["Offset"][halo] + halo_end_position = group_file["Offset"][halo + 1] + # We're done with that file now, best to close earlier rather than later + group_file.close() + + # Get the relevant particle IDs for that halo; this includes particles + # of _all_ types. + particle_ids_in_halo = particles_file["Particle_IDs"][ + halo_start_position:halo_end_position + ] + # Again, we're done with that file. + particles_file.close() + + # Now, the tricky bit. We need to create the correspondance between the + # positions in the snapshot file, and the ids. + + # Let's look for the dark matter particles in that halo. + particle_ids_from_snapshot = snapshot_file["PartType1/ParticleIDs"][...] + + _, indices_v, indices_p = np.intersect1d( + particle_ids_in_halo, + particle_ids_from_snapshot, + assume_unique=True, + return_indices=True, + ) + + # indices_p gives the positions in the particle file where we will find + # the co-ordinates that we're looking for! To get the positions of all of + # those particles, + particle_positions_in_halo = snapshot_file["PartType1/Coordinates"][indices_p] + + Catalog_parttypes file ----------------------