def determine_if_sne_are_discovered(log, limitingMags, ripeDayList,
    cadenceDictionary, observedFrameLightCurveInfo, extraSurveyConstraints,
    plot=True):
    """
    *Generate a list of dictionaries which describe if and when a SN is discovered in each and any filter.*

    **Key Arguments:**
        - ``log`` -- logger
        - ``limitingMags`` -- the limiting magnitudes of the survey
        - ``ripeDayList`` -- a list of dictionaries describing the time relative to peak that the SN reaches the limiting mag of the survey
        - ``cadenceDictionary``  -- a dictionary of { band : observedDayList }
        - ``observedFrameLightCurveInfo`` -- the observed franme lightcurve info (dictionary)
        - ``extraConstraints`` -- some extra constraints
        - ``plot`` -- generate plots?

    **Return:**
        - ``discoveredList`` -- a list of dictionaries which describe if and when a SN is discovered in each and any filter.
    """
    import numpy as np
    filters = ['g', 'r', 'i', 'z']
    models = ['he80', 'he100', 'he130']
    lunarMonth = 29.3
    surveyYear = 12.0 * lunarMonth
    surveyDiscoveryDayList = []
    lightCurveDiscoveryDayList = []
    snCampaignLengthList = []
    log.info('ripeDayList %s' % (len(ripeDayList),))
    for item in range(len(ripeDayList)):
        lightCurveEndDay = observedFrameLightCurveInfo[item][
            'endOfLightcurveDay']
        visibleDay = np.random.rand() * surveyYear
        surveyDiscoveryDayDict = {}
        lightCurveDiscoverDayDict = {}
        snCampaignLengthDict = {}
        if not ripeDayList[item]['any']:
            surveyDiscoveryDayDict['any'] = False
            lightCurveDiscoverDayDict['any'] = False
            snCampaignLengthDict['any'] = False
            for ffilter in filters:
                lightCurveDiscoverDayDict[ffilter] = False
                surveyDiscoveryDayDict[ffilter] = False
                snCampaignLengthDict[ffilter] = False
            lightCurveDiscoveryDayList.append(lightCurveDiscoverDayDict)
            surveyDiscoveryDayList.append(surveyDiscoveryDayDict)
            snCampaignLengthList.append(snCampaignLengthDict)
        else:
            for ffilter in filters:
                if not ripeDayList[item][ffilter]:
                    surveyDiscoveryDayDict[ffilter] = False
                    lightCurveDiscoverDayDict[ffilter] = False
                    snCampaignLengthDict[ffilter] = False
                else:
                    if visibleDay > max(cadenceDictionary[ffilter]):
                        waitingTime = surveyYear + min(cadenceDictionary[
                            ffilter]) - visibleDay
                        surveyDiscoveryDayDict[ffilter] = min(cadenceDictionary
                            [ffilter])
                        cdIndex = 0
                    else:
                        cdIndex = -1
                        for day in cadenceDictionary[ffilter]:
                            cdIndex += 1
                            if day > visibleDay:
                                waitingTime = day - visibleDay
                                surveyDiscoveryDayDict[ffilter] = day
                                break
                    lightCurveDiscoverDayDict[ffilter] = ripeDayList[item][
                        ffilter] + waitingTime
                    if observedFrameLightCurveInfo[item]['lightCurves'][ffilter
                        ](lightCurveDiscoverDayDict[ffilter]) > limitingMags[
                        ffilter]:
                        lightCurveDiscoverDayDict[ffilter] = False
                        surveyDiscoveryDayDict[ffilter] = False
                        snCampaignLengthDict[ffilter] = False
                    else:
                        snCampaignLengthDict[ffilter] = 0
                        lcDay = lightCurveDiscoverDayDict[ffilter]
                        cdIndex += 1
                        while 1 > 0:
                            if cdIndex >= len(cadenceDictionary[ffilter]):
                                log.info(
                                    'item: %s. NEXT YEAR: cdIndex %s, len(cadenceDictionary[ffilter]) %s'
                                     % (item, cdIndex, len(
                                    cadenceDictionary[ffilter])))
                                nextLcDay = lcDay + surveyYear + min(
                                    cadenceDictionary[ffilter]) - max(
                                    cadenceDictionary[ffilter])
                                cdIndex = 1
                            else:
                                log.info(
                                    'item: %s. SAME YEAR: cdIndex %s, len(cadenceDictionary[ffilter]) %s'
                                     % (item, cdIndex, len(
                                    cadenceDictionary[ffilter])))
                                nextLcDay = lcDay + cadenceDictionary[ffilter][
                                    cdIndex] - cadenceDictionary[ffilter][
                                    cdIndex - 1]
                                cdIndex += 1
                            if observedFrameLightCurveInfo[item]['lightCurves'
                                ][ffilter](nextLcDay) < limitingMags[ffilter
                                ] and lightCurveEndDay > nextLcDay:
                                snCampaignLengthDict[ffilter
                                    ] += nextLcDay - lcDay
                                log.info('campaign length %s, filter %s' %
                                    (snCampaignLengthDict[ffilter], ffilter))
                                lcDay = nextLcDay
                            else:
                                break
            surveyDiscoveryDayDict['any'] = False
            lightCurveDiscoverDayDict['any'] = False
            snCampaignLengthDict['max'] = 0
            for ffilter in filters:
                if surveyDiscoveryDayDict[ffilter]:
                    surveyDiscoveryDayDict['any'] = True
                    lightCurveDiscoverDayDict['any'] = True
                if snCampaignLengthDict[ffilter] > snCampaignLengthDict['max']:
                    snCampaignLengthDict['max'] = snCampaignLengthDict[ffilter]
            lightCurveDiscoveryDayList.append(lightCurveDiscoverDayDict)
            surveyDiscoveryDayList.append(surveyDiscoveryDayDict)
            snCampaignLengthList.append(snCampaignLengthDict)
    return (lightCurveDiscoveryDayList, surveyDiscoveryDayList,
        snCampaignLengthList)
