Dusk and dawn bitmap

Generates a boolean ping with every sample value assigned to True when the ping time occurs between dusk or dawn (±1hr); all other pings have samples assigned to False.

List of operands

Operand 1 - Any acoustic variable

Code

"""
Echoview Code Operator source file
========================================================================

Created by Echoview(R) 10.0.218 on Monday, 29 April 2019

See the Echoview help file for Code operator documentation and
examples.

NumPy User Guide: https://docs.scipy.org/doc/numpy/user/
NumPy Reference: https://docs.scipy.org/doc/numpy/Reference/
SciPy Reference Guide: https://docs.scipy.org/doc/scipy/Reference/

Echoview(R) is a registered trademark of Echoview Software Pty Ltd.
"""

# Authorship information
__author__ = "Echoview Software Pty Ltd. 2019."
__disclaimer__ = (
    "This example code is provided AS IS, without warranty of any "
    "kind, express or implied, including but not limited to the "
    "warranties of merchantability, fitness for a particular purpose "
    "and noninfringement. In no event shall Echoview Software Pty Ltd "
    "be liable for any claim, damages or other liability, arising "
    "from, out of or in connection with the use of this example code."
)
__version__ = "1.0"

# System Imports
from typing import List

# Libraries
from echoview import OperatorBase, MeasurementType, OperandInput, Error
from datetime import datetime, date, time, timedelta
import numpy as np


class Operator(OperatorBase):
    """
    Dusk and Dawn bitmap generator
    ==========================================================
    Generates a bitmap where all samples in pings from Operand 1 around
    dawn and dusk (+-1 hour) are True.

    Operands
    ---------------------

    * Operand 1 - Any acoustic variable
    """

    def result_type(self, input_types: List[MeasurementType]):
        """
        Instructs Echoview to create a single beam or multi-beam
        boolean variable based on the input type.
        """

        if(input_types and input_types[0].is_acoustic):
            if input_types[0].is_single_beam:
                return MeasurementType.SINGLE_BEAM_BOOLEAN
            elif input_types[0].is_multibeam:
                return MeasurementType.MULTIBEAM_BOOLEAN

        # If no input type or input isn't a single beam or multi-beam
        # acoustic variable
        return MeasurementType.UNDEFINED

    def eval(self, inputs: List[OperandInput]):
        """
        Generates a boolean ping with every sample true that falls
        between dusk or dawn (+- 1hr); all other pings will have false
        samples
        """

        ping = inputs[0].measurement
        ping_date = ping.datetime.date()

        # Calculate the dusk and dawn times,these are currently hard
        # coded to 7 and 19 hours respectively.
        # Note: These must be adapted depending on your data's lat/longs
        # and time of year
        dawn = datetime.combine(ping_date, time(7, 0, 0))
        dusk = datetime.combine(ping_date, time(19, 0, 0))
        threshold = timedelta(hours=1)

        if (((ping.datetime >= (dawn - threshold)) and (ping.datetime <= (dawn + threshold))) or
            ((ping.datetime >= (dusk - threshold)) and (ping.datetime <= (dusk + threshold)))):
            return np.full(ping.data.shape, True)
        else:
            return np.full(ping.data.shape, False)
 

See also

Code operator
About the Code operator
Using the Code operator