848def filterRefCat(refCat, refFluxField, maxRefObjects=None, minRefMag=None, log=None):
849 """Sub-select a number of reference objects starting from the brightest
850 and maxing out at the number specified by maxRefObjects.
851
852 No further trimming is done if len(refCat) > maxRefObjects after trimming
853 to minRefMag.
854
855 Parameters
856 ----------
857 refCat : `lsst.afw.table.SimpleCatalog`
858 Catalog of reference objects to trim.
859 refFluxField : `str`
860 Field of refCat to use for flux.
861 maxRefObjects : `int` or `None`, optional
862 Maximum number of reference objects (i.e. trim refCat down to
863 this number of objects).
864 minRefMag : `int` or `None`, optional
865 Minimum (i.e. brightest) magnitude to include in the reference
866 catalog.
867 log : `lsst.log.Log` or `logging.Logger` or `None`, optional
868 Logger object used to write out messages. If `None`, no messages
869 will be logged.
870
871 Returns
872 -------
873 filteredCat : `lsst.afw.table.SimpleCatalog`
874 Catalog trimmed to the maximum brightness and/or maximum number set
875 in the task config from the brightest flux down.
876 """
877 if maxRefObjects is None and minRefMag is None:
878 if log is not None:
879 log.debug("No filtering of the reference catalog has been actually requested "
880 "(i.e maxRefObjects and minRefMag are both `None`) Returning "
881 "original catalog.")
882 return refCat
883
884 filteredCat = refCat.copy(deep=True)
885
886 if minRefMag is not None:
887 refFlux = filteredCat.get(refFluxField)
888 refMag = (refFlux*astropy.units.nJy).to_value(astropy.units.ABmag)
889 if numpy.nanmin(refMag) <= minRefMag:
890 filteredCat = filteredCat[(refMag > minRefMag)].copy(deep=True)
891 if log is not None:
892 log.info("Trimming the loaded reference catalog to %s > %.2f", refFluxField, minRefMag)
893
894 if maxRefObjects is not None:
895 if len(filteredCat) <= maxRefObjects:
896 if log is not None:
897 log.debug("Number of reference objects in reference catalog = %d (max is %d). "
898 "Returning catalog without further filtering.",
899 len(filteredCat), maxRefObjects)
900 return filteredCat
901 if log is not None:
902 log.info("Trimming number of reference objects in refCat from %d down to %d. ",
903 len(refCat), maxRefObjects)
904 if not filteredCat.isContiguous():
905 filteredCat = filteredCat.copy(deep=True)
906
907 refFlux = filteredCat.get(refFluxField)
908 sortedRefFlux = refFlux[refFlux.argsort()]
909 minRefFlux = sortedRefFlux[-(maxRefObjects + 1)]
910
911 selected = (filteredCat.get(refFluxField) > minRefFlux)
912 filteredCat = filteredCat[selected]
913
914 if not filteredCat.isContiguous():
915 filteredCat = filteredCat.copy(deep=True)
916
917 if log is not None:
918 if len(filteredCat) > 0:
919 refFlux = filteredCat[refFluxField]
920 refMag = (refFlux*astropy.units.nJy).to_value(astropy.units.ABmag)
921 log.info("Reference catalog magnitude range for filter %s after trimming: refMagMin = %.2f; "
922 "refMagMax = %.2f", refFluxField, numpy.nanmin(refMag), numpy.nanmax(refMag))
923 else:
924 log.warning("Length of reference catalog after filtering is 0.")
925 return filteredCat
926
927