def METHOD_NAME(self, face_size, **params):
    outer = self.build_tree(face_size, **params)
    radius = max([np.sqrt(v.co[0] ** 2 + v.co[1] ** 2) for v in outer.data.vertices if v.co[-1] < .1])
    height = uniform(.8, 1.6)
    cutter, fn, inverse_fn, metric_fn = self.build_cutter(radius, height)
    butil.modify_mesh(outer, 'BOOLEAN', object=cutter, operation='DIFFERENCE')
    outer = separate_loose(outer)
    inner = deep_clone_obj(outer)
    remove_vertices(outer, fn)
    remove_vertices(inner, inverse_fn)
    self.trunk_surface.apply(outer)
    butil.apply_modifiers(outer)
    obj = join_objects([outer, inner])
    with butil.ViewportMode(obj, 'EDIT'):
        bpy.ops.mesh.select_all(action='SELECT')
        bpy.ops.mesh.region_to_loop()
        bpy.ops.mesh.bridge_edge_loops(number_cuts=10, interpolation='LINEAR')
    ring_material_index = list(obj.data.materials).index(obj.data.materials['shader_rings'])
    material_indices = read_material_index(obj)
    null_indices = np.array([i for i, m in enumerate(obj.data.materials) if not hasattr(m, 'name')])
    material_indices[
        np.any(material_indices[:, np.newaxis] == null_indices[np.newaxis, :], -1)] = ring_material_index
    write_material_index(obj, material_indices)
    noise_strength = cutter.scale[-1] * uniform(.5, .8)
    noise_scale = uniform(10, 15)
    surface.add_geomod(obj, self.geo_cutter, apply=True,
                       input_args=[noise_strength, noise_scale, metric_fn])
    surface.add_geomod(obj, self.geo_xyz, apply=True)
    butil.delete(cutter)
    tag_object(outer, 'rotten_tree')
    return outer