import numpy
import flib
import scopelog

class VPhi(object):
    def __init__(self, t, phi, v, info=None):
        self.t = t
        self.phi = phi
        self.v = v
        self.info = info

    @staticmethod
    def loadbinary(filename):
        version, header, data = flib.loadbinary(filename, full=True)
        info = scopelog.getinfo(filename)
        phi = data['channel0']
        v = data['channel1']
        t = numpy.arange(len(v)) / info.smplrate
        return VPhi(t, phi, v, info)
    
    @staticmethod
    def loadascii(filename):
        t, phi, v = flib.loadascii(filename, usecols=(0,1,2), unpack=True)
        return VPhi(t, phi, v, scopelog.getinfo(filename))

    def histogram(self, nbins=100):
        phi_bins = numpy.linspace(min(self.phi), max(self.phi), nbins+1)
        phi_bins[-1] += 0.1 # this ensures the point with the maximum 'phi' will be included in the last bin.
        phi = numpy.NaN * numpy.zeros(nbins)
        vmin = numpy.NaN * numpy.zeros(nbins)
        vmax = numpy.NaN * numpy.zeros(nbins)
        
        mask = numpy.zeros(nbins, dtype=bool)
        
        for i in range(nbins):
            ii = (self.phi >= phi_bins[i]) & (self.phi < phi_bins[i+1])
            if any(ii):
                phi[i] = numpy.mean(self.phi[ii])
                vmin[i] = numpy.min(self.v[ii])
                vmax[i] = numpy.max(self.v[ii])
                mask[i] = True
        
        return phi[mask], vmin[mask], vmax[mask]
