Project the input histogram to the particle level axis.

    Args:
        hist: Histogram to check for outliers.
        outliers_removal_axis: Axis along which outliers removal will be performed. Usually
            the particle level aixs.
    Returns:
        The histogram to check for outliers.

def _project_to_part_level(hist: Hist, outliers_removal_axis: OutliersRemovalAxis) -> Hist:
    """ Project the input histogram to the particle level axis.

    Args:
        hist: Histogram to check for outliers.
        outliers_removal_axis: Axis along which outliers removal will be performed. Usually
            the particle level aixs.
    Returns:
        The histogram to check for outliers.
    """
    # Setup the projector
    import ROOT
    if isinstance(hist, (ROOT.TH2, ROOT.TH3)):
        projection_information: Dict[str, Any] = {}
        output_object = _OutputObject(None)
        projector = projectors.HistProjector(
            observable_to_project_from = hist,
            output_observable = output_object,
            output_attribute_name = "output",
            projection_name_format = "outliers_removal_hist",
            projection_information = projection_information,
        )
        # No additional_axis_cuts or projection_dependent_cut_axes
        # Projection axis
        projector.projection_axes.append(
            projectors.HistAxisRange(
                axis_type = outliers_removal_axis,
                axis_range_name = "outliers_removal_axis",
                min_val = projectors.HistAxisRange.apply_func_to_find_bin(None, 1),
                max_val = projectors.HistAxisRange.apply_func_to_find_bin(ROOT.TAxis.GetNbins),
            )
        )

        # Perform the actual projection and return the output.
        projector.project()
        return output_object.output

    # If we already have a 1D hist, just return that existing hist.
    return hist