def METHOD_NAME(species_seed, n, boolean_res_mult=5):
    objs = []
    (genome, _, _), _ = random_species(season='winter')
    factory = GenericTreeFactory(species_seed, genome, realize=True,
                                child_col=None, trunk_surface=surface.NoApply, 
                                decimate_placeholder_levels=0, 
                                coarse_mesh_placeholder=True)
    trees = [factory.spawn_placeholder(i,(0,0,0),(0,0,0)) for i in range(n)]
    bark = surface.registry('bark')
    face_size = target_face_size(scatter_res_distance())
    attr_name = 'original_surface'
    for t in trees:
        butil.delete(list(t.children))
        remesh_with_attrs(t, face_size=boolean_res_mult*face_size) # lower res for efficiency
    surface.write_attribute(trees, lambda nw: 1, attr_name, data_type='FLOAT', apply=True)
    for i, tree in enumerate(trees):
        n_chops = np.random.randint(3, 6)
        cutter_size = max(tree.dimensions[:-1])
        chopped = chop_object(tree, n=n_chops, cutter_size=cutter_size)
        for j, o in enumerate(chopped):
            if (
                len(o.data.vertices) < 10 or 
                max(o.dimensions) < 0.1 or 
                max(o.dimensions) > cutter_size * 0.8
            ):
                logger.debug(f'filtering {i, j} with {len(o.data.vertices)=}, {o.dimensions=}')
                butil.delete(o)
                chopped[j] = None
                continue
            o.name = f'chopped_tree({species_seed}, {i}, {j})'
            chopped[j] = remesh_with_attrs(o, face_size=face_size)
        chopped = [o for o in chopped if o is not None]
        def selection(nw):
            orig = nw.new_node(Nodes.NamedAttribute, [attr_name], attrs=dict(data_type='FLOAT'))
            return nw.compare('GREATER_THAN', orig, 0.9999) # some interp will happen for some reason, clamp it
        bark.apply(chopped, selection=selection)
        for o in chopped:
            butil.apply_modifiers(o)
            approx_settle_transform(o)
            o.location = (0,0,0)
            o.parent = None
        objs += chopped
    return butil.group_in_collection(objs, 'assets:chopped_tree', reuse=False)