jroIO_matlab.py
272 lines
| 8.2 KiB
| text/x-python
|
PythonLexer
|
r591 | 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 | |||
|
r593 | class matoffReader(ProcessingUnit): | |
|
r591 | ||
index=None | |||
list=None | |||
firsttime=True | |||
utccounter=None | |||
utcfiletime=None | |||
utcmatcounter=0 | |||
utcfirst=None | |||
utclist=None | |||
def __init__(self): | |||
self.dataOut = Spectra() | |||
|
r593 | self.online = False | |
|
r591 | return | |
|
r593 | def __setHeader(self, datastuff): | |
self.dataOut.pairsList=[(0,1)] | |||
|
r598 | self.dataOut.channelList = range(np.array(datastuff.get('power')).shape[1]) | |
self.dataOut.nProfiles = len(np.array(datastuff.get('vel')).flatten()) #this! | |||
self.dataOut.nIncohInt = 20 | |||
|
r593 | self.dataOut.nCohInt = 1 #this! | |
self.dataOut.ippSeconds = 0.004 #this! | |||
|
r598 | self.dataOut.nFFTPoints = len(np.array(datastuff.get('vel')).flatten()) | |
|
r593 | self.dataOut.timeZone = 0 | |
self.dataOut.heightList = np.array(datastuff.get('hts')).flatten() | |||
|
r591 | ||
|
r593 | def __readFile(self, currentfile): | |
print "Reading from this file:" + currentfile | |||
|
r591 | ||
|
r593 | #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)): | |||
|
r591 | ||
|
r593 | 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=[] | |||
|
r591 | utclist=[] | |
|
r593 | if not dirList: | |
print "No directories found" | |||
return [] | |||
|
r598 | #if self.online: | |
# dirList= [dirList[-1]] | |||
if self.online: | |||
|
r602 | currentdate = datetime.datetime.now() | |
|
r598 | strsplit1=currentdate.strftime('%Y.%m.%d') | |
dirList = fnmatch.filter(dirList,strsplit1+'*') | |||
|
r593 | 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() | |||
|
r591 | ||
|
r593 | if not self.online: | |
if (utctime > endsearch2): | |||
continue | |||
if (utctime < startsearch2): | |||
continue | |||
|
r591 | ||
|
r593 | 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 | |||
|
r591 | ||
|
r593 | 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 | |||
|
r598 | def __getNextOnlineFile(self, seconds = 40): | |
|
r593 | ||
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 | |||
|
r591 | ||
|
r593 | nTries += 1 | |
|
r591 | ||
|
r593 | if nTries > 3: | |
break | |||
|
r591 | ||
|
r593 | print "Waiting %d seconds ..." %seconds | |
|
r598 | time.sleep(40) | |
|
r593 | ||
if not (len(filelist) > ncurrentfiles): | |||
return None | |||
|
r591 | ||
|
r593 | self.fileList = filelist | |
filename = self.__getNextOfflineFile() | |||
|
r591 | ||
|
r593 | 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): | |||
|
r591 | ||
|
r593 | if self.online: | |
filename = self.__getNextOnlineFile() | |||
else: | |||
filename = self.__getNextOfflineFile() | |||
return filename | |||
|
r591 | ||
|
r593 | 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 | |||
|
r591 | ||
|
r593 | 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 | |||
|
r591 | ||
|
r593 | ||
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: | |||
|
r591 | ||
|
r593 | self.dataOut.data_spc = spc | |
self.dataOut.data_cspc = cspc | |||
|
r591 | self.dataOut.utctime = self.utcfirst | |
self.dataOut.flagNoData = False | |||
|
r593 | ||
return 1 | |||