|
|
from schainpy.model.data.jrodata import *
|
|
|
from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation
|
|
|
from schainpy.model.io.jroIO_base import *
|
|
|
|
|
|
import scipy.io as sio
|
|
|
import pprint
|
|
|
import numpy as np
|
|
|
from os import listdir
|
|
|
from os.path import isfile, join
|
|
|
import datetime
|
|
|
import cmath
|
|
|
|
|
|
class matoffReader(ProcessingUnit):
|
|
|
|
|
|
index = None
|
|
|
list = None
|
|
|
firsttime = True
|
|
|
utccounter = None
|
|
|
utcfiletime = None
|
|
|
utcmatcounter = 0
|
|
|
utcfirst = None
|
|
|
utclist = None
|
|
|
|
|
|
def __init__(self):
|
|
|
self.dataOut = Spectra()
|
|
|
self.online = False
|
|
|
return
|
|
|
|
|
|
def __setHeader(self, datastuff):
|
|
|
|
|
|
self.dataOut.pairsList = [(0, 1)]
|
|
|
self.dataOut.channelList = list(range(np.array(datastuff.get('power')).shape[1]))
|
|
|
self.dataOut.nProfiles = len(np.array(datastuff.get('vel')).flatten()) # this!
|
|
|
self.dataOut.nIncohInt = 20
|
|
|
self.dataOut.nCohInt = 1 # this!
|
|
|
self.dataOut.ippSeconds = 0.004 # this!
|
|
|
self.dataOut.nFFTPoints = len(np.array(datastuff.get('vel')).flatten())
|
|
|
self.dataOut.timeZone = 0
|
|
|
self.dataOut.heightList = np.array(datastuff.get('hts')).flatten()
|
|
|
|
|
|
def __readFile(self, currentfile):
|
|
|
print("Reading from this file:" + currentfile)
|
|
|
|
|
|
# filesplit=currentfile.split("\\")
|
|
|
filesplit = currentfile.split("/")
|
|
|
newsplit = filesplit[-2]
|
|
|
newnewsplit = newsplit.split(".")
|
|
|
newnewsplit = [int(i) for i in newnewsplit]
|
|
|
gooblist = datetime.datetime(newnewsplit[0], newnewsplit[1], newnewsplit[2], newnewsplit[3], newnewsplit[4], newnewsplit[5])
|
|
|
self.utcfirst = (gooblist - datetime.datetime(1970, 1, 1)).total_seconds()
|
|
|
|
|
|
|
|
|
newsplit = filesplit[-1]
|
|
|
newnewsplit = newsplit.split(".")
|
|
|
goobnum = newnewsplit[0]
|
|
|
goobnum = int(goobnum)
|
|
|
|
|
|
self.utcfirst = self.utcfirst + goobnum * 2
|
|
|
# if (currentfile[43:]=='0.mat'):
|
|
|
# self.utcmatcounter=0
|
|
|
# self.utcfirst=self.utclist[self.index]
|
|
|
|
|
|
# if (self.utcmatcounter>60):
|
|
|
# self.utcmatcounter=0
|
|
|
|
|
|
# print self.utcmatcounter
|
|
|
print(self.utcfirst)
|
|
|
try:
|
|
|
datastuff = sio.loadmat(currentfile)
|
|
|
except:
|
|
|
return None, None
|
|
|
|
|
|
dataphase = datastuff.get('phase')
|
|
|
data3 = datastuff.get('doppler0')
|
|
|
data4 = datastuff.get('doppler1')
|
|
|
data3 = np.array(data3)
|
|
|
data4 = np.array(data4)
|
|
|
datacoh = datastuff.get('coherence2')
|
|
|
|
|
|
datacohphase = datacoh * np.exp(-dataphase * 1j)
|
|
|
# data31 = np.fliplr(data3)
|
|
|
# data41 = np.fliplr(data4)
|
|
|
|
|
|
data31 = data3.reshape((1, data3.shape[0], data3.shape[1]))
|
|
|
data41 = data4.reshape((1, data4.shape[0], data4.shape[1]))
|
|
|
datacohphase1 = datacohphase.reshape((1, datacoh.shape[0], datacoh.shape[1]))
|
|
|
|
|
|
datastack = np.vstack((data31, data41))
|
|
|
|
|
|
self.__setHeader(datastuff)
|
|
|
|
|
|
spc = datastack
|
|
|
cspc = datacohphase1
|
|
|
|
|
|
return spc, cspc
|
|
|
|
|
|
def __findFiles(self, path, startDate=None, endDate=None, startTime=datetime.time(0, 0, 0), endTime=datetime.time(23, 59, 59)):
|
|
|
|
|
|
if startDate == None:
|
|
|
startDate = datetime.date(1970, 1, 1)
|
|
|
|
|
|
if endDate == None:
|
|
|
endDate = datetime.date(2050, 1, 1)
|
|
|
|
|
|
startsearch1 = datetime.datetime.combine(startDate, startTime)
|
|
|
startsearch2 = (startsearch1 - datetime.datetime(1970, 1, 1)).total_seconds()
|
|
|
endsearch1 = datetime.datetime.combine(endDate, endTime)
|
|
|
endsearch2 = (endsearch1 - datetime.datetime(1970, 1, 1)).total_seconds()
|
|
|
|
|
|
dirList = listdir(path)
|
|
|
dirList = sorted(dirList)
|
|
|
|
|
|
dirListFiltered = []
|
|
|
fileListFiltered = []
|
|
|
utclist = []
|
|
|
|
|
|
if not dirList:
|
|
|
print("No directories found")
|
|
|
return []
|
|
|
|
|
|
# if self.online:
|
|
|
# dirList= [dirList[-1]]
|
|
|
|
|
|
if self.online:
|
|
|
currentdate = datetime.datetime.now()
|
|
|
strsplit1 = currentdate.strftime('%Y.%m.%d')
|
|
|
dirList = fnmatch.filter(dirList, strsplit1 + '*')
|
|
|
|
|
|
for thisDir in dirList:
|
|
|
if not os.path.isdir(os.path.join(path, thisDir)):
|
|
|
continue
|
|
|
|
|
|
strsplit = thisDir.split('.')
|
|
|
timeints = [int(i) for i in strsplit]
|
|
|
timelist = datetime.datetime(timeints[0], timeints[1], timeints[2], timeints[3], timeints[4], timeints[5])
|
|
|
utctime = (timelist - datetime.datetime(1970, 1, 1)).total_seconds()
|
|
|
|
|
|
if not self.online:
|
|
|
if (utctime > endsearch2):
|
|
|
continue
|
|
|
|
|
|
if (utctime < startsearch2):
|
|
|
continue
|
|
|
|
|
|
dirListFiltered.append(thisDir)
|
|
|
utclist.append(utctime)
|
|
|
|
|
|
if not dirListFiltered:
|
|
|
print("filtro")
|
|
|
return []
|
|
|
|
|
|
for thisDir in dirListFiltered:
|
|
|
|
|
|
pathFile = os.path.join(self.path, thisDir)
|
|
|
|
|
|
fileList = os.listdir(pathFile)
|
|
|
|
|
|
if not fileList:
|
|
|
continue
|
|
|
|
|
|
for k in range(len(fileList)):
|
|
|
thisFile = str(k) + '.mat'
|
|
|
|
|
|
if not os.path.isfile(os.path.join(pathFile, thisFile)):
|
|
|
continue
|
|
|
|
|
|
fileListFiltered.append(os.path.join(pathFile, thisFile))
|
|
|
|
|
|
return fileListFiltered
|
|
|
|
|
|
def __getNextOnlineFile(self, seconds=40):
|
|
|
|
|
|
filename = self.__getNextOfflineFile()
|
|
|
|
|
|
if filename:
|
|
|
return filename
|
|
|
|
|
|
ncurrentfiles = len(self.fileList)
|
|
|
|
|
|
nTries = 0
|
|
|
while (True):
|
|
|
filelist = self.__findFiles(self.path)
|
|
|
if len(filelist) > ncurrentfiles:
|
|
|
break
|
|
|
|
|
|
nTries += 1
|
|
|
|
|
|
if nTries > 3:
|
|
|
break
|
|
|
|
|
|
print("Waiting %d seconds ..." % seconds)
|
|
|
time.sleep(40)
|
|
|
|
|
|
if not (len(filelist) > ncurrentfiles):
|
|
|
return None
|
|
|
|
|
|
self.fileList = filelist
|
|
|
filename = self.__getNextOfflineFile()
|
|
|
|
|
|
return filename
|
|
|
|
|
|
def __getNextOfflineFile(self):
|
|
|
|
|
|
if self.index >= len(self.fileList):
|
|
|
return None
|
|
|
|
|
|
filename = self.fileList[self.index]
|
|
|
self.index += 1
|
|
|
return filename
|
|
|
|
|
|
def __getNextFile(self):
|
|
|
|
|
|
if self.online:
|
|
|
filename = self.__getNextOnlineFile()
|
|
|
else:
|
|
|
filename = self.__getNextOfflineFile()
|
|
|
return filename
|
|
|
|
|
|
def setup(self, path, startDate=None, endDate=None, startTime=datetime.time(0, 0, 0), endTime=datetime.time(23, 59, 59)):
|
|
|
|
|
|
fileList = self.__findFiles(path, startDate, endDate, startTime, endTime)
|
|
|
|
|
|
if self.online:
|
|
|
self.index = len(fileList) - 1
|
|
|
else:
|
|
|
self.index = 0
|
|
|
|
|
|
self.fileList = fileList
|
|
|
|
|
|
print("fin setup")
|
|
|
|
|
|
def run(self, path=None, startDate=None, endDate=None,
|
|
|
startTime=datetime.time(0, 0, 0),
|
|
|
endTime=datetime.time(23, 59, 59),
|
|
|
walk=True, timezone='ut',
|
|
|
all=0, online=False, ext=None, **kwargs):
|
|
|
|
|
|
self.path = path
|
|
|
self.ext = ext
|
|
|
self.startDate = startDate
|
|
|
self.endDate = endDate
|
|
|
self.startTime = startTime
|
|
|
self.endTime = endTime
|
|
|
self.online = online
|
|
|
self.dataOut.flagNoData = True
|
|
|
|
|
|
if (self.firsttime == True):
|
|
|
self.setup(path, startDate, endDate, startTime, endTime)
|
|
|
self.firsttime = False
|
|
|
|
|
|
|
|
|
if not self.fileList:
|
|
|
self.dataOut.flagNoData = True
|
|
|
print("lista vacia")
|
|
|
return
|
|
|
|
|
|
currentfile = self.__getNextFile()
|
|
|
|
|
|
if not currentfile:
|
|
|
"no file"
|
|
|
return
|
|
|
|
|
|
spc, cspc = self.__readFile(currentfile)
|
|
|
|
|
|
if spc != None:
|
|
|
|
|
|
self.dataOut.data_spc = spc
|
|
|
self.dataOut.data_cspc = cspc
|
|
|
self.dataOut.utctime = self.utcfirst
|
|
|
self.dataOut.flagNoData = False
|
|
|
|
|
|
return 1
|
|
|
|
|
|
|