def run_diagnostics( model, logger=None, length_unit=units.pc, mass_unit=units.MSun, time_unit=units.Myr, ): """ Run diagnostics on model """ logger = logger or logging.getLogger(__name__) stars = model.star_particles sinks = model.sink_particles gas = model.gas_particles converter = model.star_converter if not sinks.is_empty(): non_collisional_bodies = Particles() non_collisional_bodies.add_particles(stars) non_collisional_bodies.add_particles(sinks) else: non_collisional_bodies = stars groups = identify_subgroups( converter, non_collisional_bodies, peak_density_threshold=1e-16 | units.g * units.cm**-3, ) n_groups = len(groups) if hasattr(stars, 'group_id'): group_id_offset = 1 + max(stars.group_id) else: group_id_offset = 1 # a group id of 0 would mean "no group found" logger.info("Found %i groups", n_groups) for i, group in enumerate(groups): group_id = i + group_id_offset if hasattr(group, 'group_id'): group.previous_group_id = group.group_id else: group.previous_group_id = 0 group.group_id = group_id stars_in_group = len(group) if (stars_in_group > 100): mass_in_group = group.total_mass().in_(mass_unit) mass_fraction = [0.01, 0.02, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 1.0] radii, new_mass_fraction = group.LagrangianRadii( unit_converter=converter, mf=mass_fraction, cm=group.center_of_mass(), ) assert (new_mass_fraction == mass_fraction) radii = radii.value_in(length_unit) x, y, z = group.center_of_mass().value_in(length_unit) median_previous_group_id = numpy.median(group.previous_group_id) logger.info( "step %i group %i nstars %i mass %s xyz %f %f %f %s origin %i " "LR %f %f %f %f %f %f %f %f %f %s", model.step, group_id, stars_in_group, mass_in_group, x, y, z, length_unit, median_previous_group_id, radii[0], radii[1], radii[2], radii[3], radii[4], radii[5], radii[6], radii[7], radii[8], length_unit, ) groups = ParticlesSuperset(groups) group_identifiers = Particles(keys=groups.key) group_identifiers.group_id = groups.group_id group_identifiers.previous_group_id = groups.previous_group_id return group_identifiers