Is there a way to connect star particles (in snapshot files) with the subhalo/halo they belong to? Something like an index or similar. I search for it but I didn't find anything.
Thank you very much.
In general, particles don't "know" who their parent subhalos or halos are. This is just to avoid storing more numbers. However, this can be reconstructed in reverse, since every subhalo or halo knows who its member particles are. My function for this (subhalos) looks something like this:
def inverseMapPartIndicesToSubhaloIDs(sP, indsType, ptName, debug=False, flagFuzz=True,
""" For a particle type ptName and snapshot indices for that type indsType, compute the
subhalo ID to which each particle index belongs.
If flagFuzz is True (default), particles in FoF fuzz are marked as outside any subhalo,
otherwise they are attributed to the closest (prior) subhalo.
gcLenType = SubhaloLenType[:,sP.ptNum(ptName)]
gcOffsetsType = SnapOffsetsSubhalo[:,sP.ptNum(ptName)][:-1]
# val gives the indices of gcOffsetsType such that, if each indsType was inserted
# into gcOffsetsType just -before- its index, the order of gcOffsetsType is unchanged
# note 1: (gcOffsetsType-1) so that the case of the particle index equaling the
# subhalo offset (i.e. first particle) works correctly
# note 2: np.ss()-1 to shift to the previous subhalo, since we want to know the
# subhalo offset index -after- which the particle should be inserted
val = np.searchsorted( gcOffsetsType - 1, indsType ) - 1
val = val.astype('int32')
# search and flag all matches where the indices exceed the length of the
# subhalo they have been assigned to, e.g. either in fof fuzz, in subhalos with
# no particles of this type, or not in any subhalo at the end of the file
gcOffsetsMax = gcOffsetsType + gcLenType - 1
ww = np.where( indsType > gcOffsetsMax[val] )
val[ww] = -1
# for all inds we identified in subhalos, verify parents directly
for i in range(len(indsType)):
if val[i] < 0:
assert indsType[i] >= gcOffsetsType[val[i]]
assert indsType[i] < gcOffsetsType[val[i]]+gcLenType[val[i]]
assert gcLenType[val[i]] != 0
Thank you, very useful. Obviously, I need the "Groupcat" files relative to the chosen snapshot, right?
Yes that's right
ok, thanks! A couple of last trivial questions, I miss the meaning of "sP" , "ptName" and "SnapOffsetsSubhalo".
The first two, sP and ptName, look like some class object or class method (I say that becaus of this: sP.ptName(ptName)). I think ptName could be, e.g. for star particles, ptName = il.snapshot.partTypeNum('stars'), but what about sP, what should I pratically give in input in place of sP (maybe the specific snapshot I'm working at, e.g. 99 for z=0, or the index of a particle in that specific snapshot or whatever)?
And also, what is SnapOffsetsSubhalo?
thank you very much again.
snapOffsetsSubhalo are the offsets into the snapshot, by subhalo, per type. (Subhalo/SnapByType in that documentation).
sP.ptNum(ptName) is just 4 for stars.