#----------------------------------------------------------------------------
#  Python class for a seismic trace
#
import numpy as np

class SeismicTrace(object):
    """
    Class defining a seismic trace by station name, network name, component,
    number of samples, sampling interval and start time
    """

    def __init__(self, staname, comp, dt, tanf, vals):
        """
        Initialize seismic trace object from data:
        :param staname: station name
        :param comp: component
        :param dt: sampling interval
        :param tanf: start time
        :param vals: values of trace (1D numpy array)
        """
        self.staname = staname
        self.comp = comp
        self.dt = dt
        self.tanf = tanf
        self.vals = vals
        self.nsamp = vals.size
        self.tlen = self.dt*self.nsamp


    @classmethod
    def readFromAscii(cls, fid, comp='None'):
        """
        Class method as second constructor to initialize trace from an Ascii file
        :param fid: file descriptor of already open Ascii file
        :param comp: optional component selection
        :return: an instance of the class
        """
        staname = fid.readline().strip()
        if not staname:
            print("No station name found. Is file really an Ascii gather file")
            return None
        compf = fid.readline().strip()
        if comp != 'None' and comp != compf:
            print("Requested component %s not found.", comp)
            return None
        h = fid.readline().strip().split()
        vals = np.array([float(v) for v in fid.readline().strip().split()])
        dt = float(h[1]); tanf = float(h[2])
        return cls(staname, compf, dt, tanf, vals)


    def absoluteMaximum(self):
        """
        return absolute maximum of trace
        """
        return abs(max(self.vals))


    def writeToOpenAsciiFile(self, fid):
        """
        write a seismic trace to an open Ascii file
        """
        fid.write(self.staname + '\n')
        fid.write(self.comp + '\n')
        fid.write("{:12d} {:15.9f} {:20.9f}\n".format(self.nsamp, self.dt, self.tanf))
        for n in range(self.nsamp):
            fid.write("{:17.8e}".format(self.vals[n]))
        fid.write("\n")


    def printInfo(self):
        """
        Print out some information about the trace
        """
        print("Identification: ", self.staname, self.comp)
        print("Sampling interval: ", self.dt)
        print("Number of samples: ", self.nsamp)
        print("Start time after midnight: ", self.tanf)
        print("Length of trace: (N*DT) ", self.tlen)