|
|
import numpy
|
|
|
import time
|
|
|
import os
|
|
|
import h5py
|
|
|
import re
|
|
|
import datetime
|
|
|
|
|
|
from schainpy.model.data.jrodata import *
|
|
|
from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation
|
|
|
# from jroIO_base import *
|
|
|
from schainpy.model.io.jroIO_base import *
|
|
|
import schainpy
|
|
|
|
|
|
|
|
|
class ParamReader(ProcessingUnit):
|
|
|
'''
|
|
|
Reads HDF5 format files
|
|
|
|
|
|
path
|
|
|
|
|
|
startDate
|
|
|
|
|
|
endDate
|
|
|
|
|
|
startTime
|
|
|
|
|
|
endTime
|
|
|
'''
|
|
|
|
|
|
ext = ".hdf5"
|
|
|
|
|
|
optchar = "D"
|
|
|
|
|
|
timezone = None
|
|
|
|
|
|
startTime = None
|
|
|
|
|
|
endTime = None
|
|
|
|
|
|
fileIndex = None
|
|
|
|
|
|
utcList = None #To select data in the utctime list
|
|
|
|
|
|
blockList = None #List to blocks to be read from the file
|
|
|
|
|
|
blocksPerFile = None #Number of blocks to be read
|
|
|
|
|
|
blockIndex = None
|
|
|
|
|
|
path = None
|
|
|
|
|
|
#List of Files
|
|
|
|
|
|
filenameList = None
|
|
|
|
|
|
datetimeList = None
|
|
|
|
|
|
#Hdf5 File
|
|
|
|
|
|
listMetaname = None
|
|
|
|
|
|
listMeta = None
|
|
|
|
|
|
listDataname = None
|
|
|
|
|
|
listData = None
|
|
|
|
|
|
listShapes = None
|
|
|
|
|
|
fp = None
|
|
|
|
|
|
#dataOut reconstruction
|
|
|
|
|
|
dataOut = None
|
|
|
|
|
|
|
|
|
def __init__(self, **kwargs):
|
|
|
ProcessingUnit.__init__(self, **kwargs)
|
|
|
self.dataOut = Parameters()
|
|
|
return
|
|
|
|
|
|
def setup(self, **kwargs):
|
|
|
|
|
|
path = kwargs['path']
|
|
|
startDate = kwargs['startDate']
|
|
|
endDate = kwargs['endDate']
|
|
|
startTime = kwargs['startTime']
|
|
|
endTime = kwargs['endTime']
|
|
|
walk = kwargs['walk']
|
|
|
if kwargs.has_key('ext'):
|
|
|
ext = kwargs['ext']
|
|
|
else:
|
|
|
ext = '.hdf5'
|
|
|
if kwargs.has_key('timezone'):
|
|
|
self.timezone = kwargs['timezone']
|
|
|
else:
|
|
|
self.timezone = 'lt'
|
|
|
|
|
|
print "[Reading] Searching files in offline mode ..."
|
|
|
pathList, filenameList = self.searchFilesOffLine(path, startDate=startDate, endDate=endDate,
|
|
|
startTime=startTime, endTime=endTime,
|
|
|
ext=ext, walk=walk)
|
|
|
|
|
|
if not(filenameList):
|
|
|
print "There is no files into the folder: %s"%(path)
|
|
|
sys.exit(-1)
|
|
|
|
|
|
self.fileIndex = -1
|
|
|
self.startTime = startTime
|
|
|
self.endTime = endTime
|
|
|
|
|
|
self.__readMetadata()
|
|
|
|
|
|
self.__setNextFileOffline()
|
|
|
|
|
|
return
|
|
|
|
|
|
def searchFilesOffLine(self,
|
|
|
path,
|
|
|
startDate=None,
|
|
|
endDate=None,
|
|
|
startTime=datetime.time(0,0,0),
|
|
|
endTime=datetime.time(23,59,59),
|
|
|
ext='.hdf5',
|
|
|
walk=True):
|
|
|
|
|
|
expLabel = ''
|
|
|
self.filenameList = []
|
|
|
self.datetimeList = []
|
|
|
|
|
|
pathList = []
|
|
|
|
|
|
JRODataObj = JRODataReader()
|
|
|
dateList, pathList = JRODataObj.findDatafiles(path, startDate, endDate, expLabel, ext, walk, include_path=True)
|
|
|
|
|
|
if dateList == []:
|
|
|
print "[Reading] No *%s files in %s from %s to %s)"%(ext, path,
|
|
|
datetime.datetime.combine(startDate,startTime).ctime(),
|
|
|
datetime.datetime.combine(endDate,endTime).ctime())
|
|
|
|
|
|
return None, None
|
|
|
|
|
|
if len(dateList) > 1:
|
|
|
print "[Reading] %d days were found in date range: %s - %s" %(len(dateList), startDate, endDate)
|
|
|
else:
|
|
|
print "[Reading] data was found for the date %s" %(dateList[0])
|
|
|
|
|
|
filenameList = []
|
|
|
datetimeList = []
|
|
|
|
|
|
#----------------------------------------------------------------------------------
|
|
|
|
|
|
for thisPath in pathList:
|
|
|
# thisPath = pathList[pathDict[file]]
|
|
|
|
|
|
fileList = glob.glob1(thisPath, "*%s" %ext)
|
|
|
fileList.sort()
|
|
|
|
|
|
for file in fileList:
|
|
|
|
|
|
filename = os.path.join(thisPath,file)
|
|
|
|
|
|
if not isFileInDateRange(filename, startDate, endDate):
|
|
|
continue
|
|
|
|
|
|
thisDatetime = self.__isFileInTimeRange(filename, startDate, endDate, startTime, endTime)
|
|
|
|
|
|
if not(thisDatetime):
|
|
|
continue
|
|
|
|
|
|
filenameList.append(filename)
|
|
|
datetimeList.append(thisDatetime)
|
|
|
|
|
|
if not(filenameList):
|
|
|
print "[Reading] Any file was found int time range %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())
|
|
|
return None, None
|
|
|
|
|
|
print "[Reading] %d file(s) was(were) found in time range: %s - %s" %(len(filenameList), startTime, endTime)
|
|
|
print
|
|
|
|
|
|
# for i in range(len(filenameList)):
|
|
|
# print "[Reading] %s -> [%s]" %(filenameList[i], datetimeList[i].ctime())
|
|
|
|
|
|
self.filenameList = filenameList
|
|
|
self.datetimeList = datetimeList
|
|
|
|
|
|
return pathList, filenameList
|
|
|
|
|
|
def __isFileInTimeRange(self,filename, startDate, endDate, startTime, endTime):
|
|
|
|
|
|
"""
|
|
|
Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
|
|
|
|
|
|
Inputs:
|
|
|
filename : nombre completo del archivo de datos en formato Jicamarca (.r)
|
|
|
|
|
|
startDate : fecha inicial del rango seleccionado en formato datetime.date
|
|
|
|
|
|
endDate : fecha final del rango seleccionado en formato datetime.date
|
|
|
|
|
|
startTime : tiempo inicial del rango seleccionado en formato datetime.time
|
|
|
|
|
|
endTime : tiempo final del rango seleccionado en formato datetime.time
|
|
|
|
|
|
Return:
|
|
|
Boolean : Retorna True si el archivo de datos contiene datos en el rango de
|
|
|
fecha especificado, de lo contrario retorna False.
|
|
|
|
|
|
Excepciones:
|
|
|
Si el archivo no existe o no puede ser abierto
|
|
|
Si la cabecera no puede ser leida.
|
|
|
|
|
|
"""
|
|
|
|
|
|
try:
|
|
|
fp = h5py.File(filename,'r')
|
|
|
grp1 = fp['Data']
|
|
|
|
|
|
except IOError:
|
|
|
traceback.print_exc()
|
|
|
raise IOError, "The file %s can't be opened" %(filename)
|
|
|
#chino rata
|
|
|
#In case has utctime attribute
|
|
|
grp2 = grp1['utctime']
|
|
|
# thisUtcTime = grp2.value[0] - 5*3600 #To convert to local time
|
|
|
thisUtcTime = grp2.value[0]
|
|
|
|
|
|
fp.close()
|
|
|
|
|
|
if self.timezone == 'lt':
|
|
|
thisUtcTime -= 5*3600
|
|
|
|
|
|
thisDatetime = datetime.datetime.fromtimestamp(thisUtcTime[0] + 5*3600)
|
|
|
# thisDatetime = datetime.datetime.fromtimestamp(thisUtcTime[0])
|
|
|
thisDate = thisDatetime.date()
|
|
|
thisTime = thisDatetime.time()
|
|
|
|
|
|
startUtcTime = (datetime.datetime.combine(thisDate,startTime)- datetime.datetime(1970, 1, 1)).total_seconds()
|
|
|
endUtcTime = (datetime.datetime.combine(thisDate,endTime)- datetime.datetime(1970, 1, 1)).total_seconds()
|
|
|
|
|
|
#General case
|
|
|
# o>>>>>>>>>>>>>><<<<<<<<<<<<<<o
|
|
|
#-----------o----------------------------o-----------
|
|
|
# startTime endTime
|
|
|
|
|
|
if endTime >= startTime:
|
|
|
thisUtcLog = numpy.logical_and(thisUtcTime > startUtcTime, thisUtcTime < endUtcTime)
|
|
|
if numpy.any(thisUtcLog): #If there is one block between the hours mentioned
|
|
|
return thisDatetime
|
|
|
return None
|
|
|
|
|
|
#If endTime < startTime then endTime belongs to the next day
|
|
|
#<<<<<<<<<<<o o>>>>>>>>>>>
|
|
|
#-----------o----------------------------o-----------
|
|
|
# endTime startTime
|
|
|
|
|
|
if (thisDate == startDate) and numpy.all(thisUtcTime < startUtcTime):
|
|
|
return None
|
|
|
|
|
|
if (thisDate == endDate) and numpy.all(thisUtcTime > endUtcTime):
|
|
|
return None
|
|
|
|
|
|
if numpy.all(thisUtcTime < startUtcTime) and numpy.all(thisUtcTime > endUtcTime):
|
|
|
return None
|
|
|
|
|
|
return thisDatetime
|
|
|
|
|
|
def __setNextFileOffline(self):
|
|
|
|
|
|
self.fileIndex += 1
|
|
|
idFile = self.fileIndex
|
|
|
|
|
|
if not(idFile < len(self.filenameList)):
|
|
|
print "No more Files"
|
|
|
return 0
|
|
|
|
|
|
filename = self.filenameList[idFile]
|
|
|
|
|
|
filePointer = h5py.File(filename,'r')
|
|
|
|
|
|
self.filename = filename
|
|
|
|
|
|
self.fp = filePointer
|
|
|
|
|
|
print "Setting the file: %s"%self.filename
|
|
|
|
|
|
# self.__readMetadata()
|
|
|
self.__setBlockList()
|
|
|
self.__readData()
|
|
|
# self.nRecords = self.fp['Data'].attrs['blocksPerFile']
|
|
|
# self.nRecords = self.fp['Data'].attrs['nRecords']
|
|
|
self.blockIndex = 0
|
|
|
return 1
|
|
|
|
|
|
def __setBlockList(self):
|
|
|
'''
|
|
|
Selects the data within the times defined
|
|
|
|
|
|
self.fp
|
|
|
self.startTime
|
|
|
self.endTime
|
|
|
|
|
|
self.blockList
|
|
|
self.blocksPerFile
|
|
|
|
|
|
'''
|
|
|
fp = self.fp
|
|
|
startTime = self.startTime
|
|
|
endTime = self.endTime
|
|
|
|
|
|
grp = fp['Data']
|
|
|
thisUtcTime = grp['utctime'].value.astype(numpy.float)[0]
|
|
|
|
|
|
#ERROOOOR
|
|
|
if self.timezone == 'lt':
|
|
|
thisUtcTime -= 5*3600
|
|
|
|
|
|
thisDatetime = datetime.datetime.fromtimestamp(thisUtcTime[0] + 5*3600)
|
|
|
|
|
|
thisDate = thisDatetime.date()
|
|
|
thisTime = thisDatetime.time()
|
|
|
|
|
|
startUtcTime = (datetime.datetime.combine(thisDate,startTime) - datetime.datetime(1970, 1, 1)).total_seconds()
|
|
|
endUtcTime = (datetime.datetime.combine(thisDate,endTime) - datetime.datetime(1970, 1, 1)).total_seconds()
|
|
|
|
|
|
ind = numpy.where(numpy.logical_and(thisUtcTime >= startUtcTime, thisUtcTime < endUtcTime))[0]
|
|
|
|
|
|
self.blockList = ind
|
|
|
self.blocksPerFile = len(ind)
|
|
|
|
|
|
return
|
|
|
|
|
|
def __readMetadata(self):
|
|
|
'''
|
|
|
Reads Metadata
|
|
|
|
|
|
self.pathMeta
|
|
|
|
|
|
self.listShapes
|
|
|
self.listMetaname
|
|
|
self.listMeta
|
|
|
|
|
|
'''
|
|
|
|
|
|
# grp = self.fp['Data']
|
|
|
# pathMeta = os.path.join(self.path, grp.attrs['metadata'])
|
|
|
#
|
|
|
# if pathMeta == self.pathMeta:
|
|
|
# return
|
|
|
# else:
|
|
|
# self.pathMeta = pathMeta
|
|
|
#
|
|
|
# filePointer = h5py.File(self.pathMeta,'r')
|
|
|
# groupPointer = filePointer['Metadata']
|
|
|
|
|
|
filename = self.filenameList[0]
|
|
|
|
|
|
fp = h5py.File(filename,'r')
|
|
|
|
|
|
gp = fp['Metadata']
|
|
|
|
|
|
listMetaname = []
|
|
|
listMetadata = []
|
|
|
for item in gp.items():
|
|
|
name = item[0]
|
|
|
|
|
|
if name=='array dimensions':
|
|
|
table = gp[name][:]
|
|
|
listShapes = {}
|
|
|
for shapes in table:
|
|
|
listShapes[shapes[0]] = numpy.array([shapes[1],shapes[2],shapes[3],shapes[4],shapes[5]])
|
|
|
else:
|
|
|
data = gp[name].value
|
|
|
listMetaname.append(name)
|
|
|
listMetadata.append(data)
|
|
|
|
|
|
# if name=='type':
|
|
|
# self.__initDataOut(data)
|
|
|
|
|
|
self.listShapes = listShapes
|
|
|
self.listMetaname = listMetaname
|
|
|
self.listMeta = listMetadata
|
|
|
|
|
|
fp.close()
|
|
|
return
|
|
|
|
|
|
def __readData(self):
|
|
|
grp = self.fp['Data']
|
|
|
listdataname = []
|
|
|
listdata = []
|
|
|
|
|
|
for item in grp.items():
|
|
|
name = item[0]
|
|
|
listdataname.append(name)
|
|
|
|
|
|
array = self.__setDataArray(grp[name],self.listShapes[name])
|
|
|
listdata.append(array)
|
|
|
|
|
|
self.listDataname = listdataname
|
|
|
self.listData = listdata
|
|
|
return
|
|
|
|
|
|
def __setDataArray(self, dataset, shapes):
|
|
|
|
|
|
nDims = shapes[0]
|
|
|
|
|
|
nDim2 = shapes[1] #Dimension 0
|
|
|
|
|
|
nDim1 = shapes[2] #Dimension 1, number of Points or Parameters
|
|
|
|
|
|
nDim0 = shapes[3] #Dimension 2, number of samples or ranges
|
|
|
|
|
|
mode = shapes[4] #Mode of storing
|
|
|
|
|
|
blockList = self.blockList
|
|
|
|
|
|
blocksPerFile = self.blocksPerFile
|
|
|
|
|
|
#Depending on what mode the data was stored
|
|
|
if mode == 0: #Divided in channels
|
|
|
arrayData = dataset.value.astype(numpy.float)[0][blockList]
|
|
|
if mode == 1: #Divided in parameter
|
|
|
strds = 'table'
|
|
|
nDatas = nDim1
|
|
|
newShapes = (blocksPerFile,nDim2,nDim0)
|
|
|
elif mode==2: #Concatenated in a table
|
|
|
strds = 'table0'
|
|
|
arrayData = dataset[strds].value
|
|
|
#Selecting part of the dataset
|
|
|
utctime = arrayData[:,0]
|
|
|
u, indices = numpy.unique(utctime, return_index=True)
|
|
|
|
|
|
if blockList.size != indices.size:
|
|
|
indMin = indices[blockList[0]]
|
|
|
if blockList[1] + 1 >= indices.size:
|
|
|
arrayData = arrayData[indMin:,:]
|
|
|
else:
|
|
|
indMax = indices[blockList[1] + 1]
|
|
|
arrayData = arrayData[indMin:indMax,:]
|
|
|
return arrayData
|
|
|
|
|
|
# One dimension
|
|
|
if nDims == 0:
|
|
|
arrayData = dataset.value.astype(numpy.float)[0][blockList]
|
|
|
|
|
|
# Two dimensions
|
|
|
elif nDims == 2:
|
|
|
arrayData = numpy.zeros((blocksPerFile,nDim1,nDim0))
|
|
|
newShapes = (blocksPerFile,nDim0)
|
|
|
nDatas = nDim1
|
|
|
|
|
|
for i in range(nDatas):
|
|
|
data = dataset[strds + str(i)].value
|
|
|
arrayData[:,i,:] = data[blockList,:]
|
|
|
|
|
|
# Three dimensions
|
|
|
else:
|
|
|
arrayData = numpy.zeros((blocksPerFile,nDim2,nDim1,nDim0))
|
|
|
for i in range(nDatas):
|
|
|
|
|
|
data = dataset[strds + str(i)].value
|
|
|
|
|
|
for b in range(blockList.size):
|
|
|
arrayData[b,:,i,:] = data[:,:,blockList[b]]
|
|
|
|
|
|
return arrayData
|
|
|
|
|
|
def __setDataOut(self):
|
|
|
listMeta = self.listMeta
|
|
|
listMetaname = self.listMetaname
|
|
|
listDataname = self.listDataname
|
|
|
listData = self.listData
|
|
|
listShapes = self.listShapes
|
|
|
|
|
|
blockIndex = self.blockIndex
|
|
|
# blockList = self.blockList
|
|
|
|
|
|
for i in range(len(listMeta)):
|
|
|
setattr(self.dataOut,listMetaname[i],listMeta[i])
|
|
|
|
|
|
for j in range(len(listData)):
|
|
|
nShapes = listShapes[listDataname[j]][0]
|
|
|
mode = listShapes[listDataname[j]][4]
|
|
|
if nShapes == 1:
|
|
|
setattr(self.dataOut,listDataname[j],listData[j][blockIndex])
|
|
|
elif nShapes > 1:
|
|
|
setattr(self.dataOut,listDataname[j],listData[j][blockIndex,:])
|
|
|
elif mode==0:
|
|
|
setattr(self.dataOut,listDataname[j],listData[j][blockIndex])
|
|
|
#Mode Meteors
|
|
|
elif mode ==2:
|
|
|
selectedData = self.__selectDataMode2(listData[j], blockIndex)
|
|
|
setattr(self.dataOut, listDataname[j], selectedData)
|
|
|
return
|
|
|
|
|
|
def __selectDataMode2(self, data, blockIndex):
|
|
|
utctime = data[:,0]
|
|
|
aux, indices = numpy.unique(utctime, return_inverse=True)
|
|
|
selInd = numpy.where(indices == blockIndex)[0]
|
|
|
selData = data[selInd,:]
|
|
|
|
|
|
return selData
|
|
|
|
|
|
def getData(self):
|
|
|
|
|
|
# if self.flagNoMoreFiles:
|
|
|
# self.dataOut.flagNoData = True
|
|
|
# print 'Process finished'
|
|
|
# return 0
|
|
|
#
|
|
|
if self.blockIndex==self.blocksPerFile:
|
|
|
if not( self.__setNextFileOffline() ):
|
|
|
self.dataOut.flagNoData = True
|
|
|
return 0
|
|
|
|
|
|
# if self.datablock == None: # setear esta condicion cuando no hayan datos por leers
|
|
|
# self.dataOut.flagNoData = True
|
|
|
# return 0
|
|
|
# self.__readData()
|
|
|
self.__setDataOut()
|
|
|
self.dataOut.flagNoData = False
|
|
|
|
|
|
self.blockIndex += 1
|
|
|
|
|
|
return
|
|
|
|
|
|
def run(self, **kwargs):
|
|
|
|
|
|
if not(self.isConfig):
|
|
|
self.setup(**kwargs)
|
|
|
# self.setObjProperties()
|
|
|
self.isConfig = True
|
|
|
|
|
|
self.getData()
|
|
|
|
|
|
return
|
|
|
|
|
|
class ParamWriter(Operation):
|
|
|
'''
|
|
|
HDF5 Writer, stores parameters data in HDF5 format files
|
|
|
|
|
|
path: path where the files will be stored
|
|
|
|
|
|
blocksPerFile: number of blocks that will be saved in per HDF5 format file
|
|
|
|
|
|
mode: selects the data stacking mode: '0' channels, '1' parameters, '3' table (for meteors)
|
|
|
|
|
|
metadataList: list of attributes that will be stored as metadata
|
|
|
|
|
|
dataList: list of attributes that will be stores as data
|
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
ext = ".hdf5"
|
|
|
|
|
|
optchar = "D"
|
|
|
|
|
|
metaoptchar = "M"
|
|
|
|
|
|
metaFile = None
|
|
|
|
|
|
filename = None
|
|
|
|
|
|
path = None
|
|
|
|
|
|
setFile = None
|
|
|
|
|
|
fp = None
|
|
|
|
|
|
grp = None
|
|
|
|
|
|
ds = None
|
|
|
|
|
|
firsttime = True
|
|
|
|
|
|
#Configurations
|
|
|
|
|
|
blocksPerFile = None
|
|
|
|
|
|
blockIndex = None
|
|
|
|
|
|
dataOut = None
|
|
|
|
|
|
#Data Arrays
|
|
|
|
|
|
dataList = None
|
|
|
|
|
|
metadataList = None
|
|
|
|
|
|
# arrayDim = None
|
|
|
|
|
|
dsList = None #List of dictionaries with dataset properties
|
|
|
|
|
|
tableDim = None
|
|
|
|
|
|
# dtype = [('arrayName', 'S20'),('nChannels', 'i'), ('nPoints', 'i'), ('nSamples', 'i'),('mode', 'b')]
|
|
|
|
|
|
dtype = [('arrayName', 'S20'),('nDimensions', 'i'), ('dim2', 'i'), ('dim1', 'i'),('dim0', 'i'),('mode', 'b')]
|
|
|
|
|
|
currentDay = None
|
|
|
|
|
|
lastTime = None
|
|
|
|
|
|
def __init__(self, **kwargs):
|
|
|
Operation.__init__(self, **kwargs)
|
|
|
self.isConfig = False
|
|
|
return
|
|
|
|
|
|
def setup(self, dataOut, path=None, blocksPerFile=10, metadataList=None, dataList=None, mode=None, **kwargs):
|
|
|
self.path = path
|
|
|
self.blocksPerFile = blocksPerFile
|
|
|
self.metadataList = metadataList
|
|
|
self.dataList = dataList
|
|
|
self.dataOut = dataOut
|
|
|
self.mode = mode
|
|
|
|
|
|
if self.mode is not None:
|
|
|
self.mode = numpy.zeros(len(self.dataList)) + mode
|
|
|
else:
|
|
|
self.mode = numpy.ones(len(self.dataList))
|
|
|
|
|
|
arrayDim = numpy.zeros((len(self.dataList),5))
|
|
|
|
|
|
#Table dimensions
|
|
|
dtype0 = self.dtype
|
|
|
tableList = []
|
|
|
|
|
|
#Dictionary and list of tables
|
|
|
dsList = []
|
|
|
|
|
|
for i in range(len(self.dataList)):
|
|
|
dsDict = {}
|
|
|
dataAux = getattr(self.dataOut, self.dataList[i])
|
|
|
dsDict['variable'] = self.dataList[i]
|
|
|
#--------------------- Conditionals ------------------------
|
|
|
#There is no data
|
|
|
if dataAux is None:
|
|
|
return 0
|
|
|
|
|
|
#Not array, just a number
|
|
|
#Mode 0
|
|
|
if type(dataAux)==float or type(dataAux)==int:
|
|
|
dsDict['mode'] = 0
|
|
|
dsDict['nDim'] = 0
|
|
|
arrayDim[i,0] = 0
|
|
|
dsList.append(dsDict)
|
|
|
|
|
|
#Mode 2: meteors
|
|
|
elif mode[i] == 2:
|
|
|
# dsDict['nDim'] = 0
|
|
|
dsDict['dsName'] = 'table0'
|
|
|
dsDict['mode'] = 2 # Mode meteors
|
|
|
dsDict['shape'] = dataAux.shape[-1]
|
|
|
dsDict['nDim'] = 0
|
|
|
dsDict['dsNumber'] = 1
|
|
|
|
|
|
arrayDim[i,3] = dataAux.shape[-1]
|
|
|
arrayDim[i,4] = mode[i] #Mode the data was stored
|
|
|
|
|
|
dsList.append(dsDict)
|
|
|
|
|
|
#Mode 1
|
|
|
else:
|
|
|
arrayDim0 = dataAux.shape #Data dimensions
|
|
|
arrayDim[i,0] = len(arrayDim0) #Number of array dimensions
|
|
|
arrayDim[i,4] = mode[i] #Mode the data was stored
|
|
|
|
|
|
strtable = 'table'
|
|
|
dsDict['mode'] = 1 # Mode parameters
|
|
|
|
|
|
# Three-dimension arrays
|
|
|
if len(arrayDim0) == 3:
|
|
|
arrayDim[i,1:-1] = numpy.array(arrayDim0)
|
|
|
nTables = int(arrayDim[i,2])
|
|
|
dsDict['dsNumber'] = nTables
|
|
|
dsDict['shape'] = arrayDim[i,2:4]
|
|
|
dsDict['nDim'] = 3
|
|
|
|
|
|
for j in range(nTables):
|
|
|
dsDict = dsDict.copy()
|
|
|
dsDict['dsName'] = strtable + str(j)
|
|
|
dsList.append(dsDict)
|
|
|
|
|
|
# Two-dimension arrays
|
|
|
elif len(arrayDim0) == 2:
|
|
|
arrayDim[i,2:-1] = numpy.array(arrayDim0)
|
|
|
nTables = int(arrayDim[i,2])
|
|
|
dsDict['dsNumber'] = nTables
|
|
|
dsDict['shape'] = arrayDim[i,3]
|
|
|
dsDict['nDim'] = 2
|
|
|
|
|
|
for j in range(nTables):
|
|
|
dsDict = dsDict.copy()
|
|
|
dsDict['dsName'] = strtable + str(j)
|
|
|
dsList.append(dsDict)
|
|
|
|
|
|
# One-dimension arrays
|
|
|
elif len(arrayDim0) == 1:
|
|
|
arrayDim[i,3] = arrayDim0[0]
|
|
|
dsDict['shape'] = arrayDim0[0]
|
|
|
dsDict['dsNumber'] = 1
|
|
|
dsDict['dsName'] = strtable + str(0)
|
|
|
dsDict['nDim'] = 1
|
|
|
dsList.append(dsDict)
|
|
|
|
|
|
table = numpy.array((self.dataList[i],) + tuple(arrayDim[i,:]),dtype = dtype0)
|
|
|
tableList.append(table)
|
|
|
|
|
|
# self.arrayDim = arrayDim
|
|
|
self.dsList = dsList
|
|
|
self.tableDim = numpy.array(tableList, dtype = dtype0)
|
|
|
self.blockIndex = 0
|
|
|
|
|
|
timeTuple = time.localtime(dataOut.utctime)
|
|
|
self.currentDay = timeTuple.tm_yday
|
|
|
return 1
|
|
|
|
|
|
def putMetadata(self):
|
|
|
|
|
|
fp = self.createMetadataFile()
|
|
|
self.writeMetadata(fp)
|
|
|
fp.close()
|
|
|
return
|
|
|
|
|
|
def createMetadataFile(self):
|
|
|
ext = self.ext
|
|
|
path = self.path
|
|
|
setFile = self.setFile
|
|
|
|
|
|
timeTuple = time.localtime(self.dataOut.utctime)
|
|
|
|
|
|
subfolder = ''
|
|
|
fullpath = os.path.join( path, subfolder )
|
|
|
|
|
|
if not( os.path.exists(fullpath) ):
|
|
|
os.mkdir(fullpath)
|
|
|
setFile = -1 #inicializo mi contador de seteo
|
|
|
|
|
|
subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
|
|
|
fullpath = os.path.join( path, subfolder )
|
|
|
|
|
|
if not( os.path.exists(fullpath) ):
|
|
|
os.mkdir(fullpath)
|
|
|
setFile = -1 #inicializo mi contador de seteo
|
|
|
|
|
|
else:
|
|
|
filesList = os.listdir( fullpath )
|
|
|
filesList = sorted( filesList, key=str.lower )
|
|
|
if len( filesList ) > 0:
|
|
|
filesList = [k for k in filesList if 'M' in k]
|
|
|
filen = filesList[-1]
|
|
|
# el filename debera tener el siguiente formato
|
|
|
# 0 1234 567 89A BCDE (hex)
|
|
|
# x YYYY DDD SSS .ext
|
|
|
if isNumber( filen[8:11] ):
|
|
|
setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
|
|
|
else:
|
|
|
setFile = -1
|
|
|
else:
|
|
|
setFile = -1 #inicializo mi contador de seteo
|
|
|
|
|
|
if self.setType is None:
|
|
|
setFile += 1
|
|
|
file = '%s%4.4d%3.3d%03d%s' % (self.metaoptchar,
|
|
|
timeTuple.tm_year,
|
|
|
timeTuple.tm_yday,
|
|
|
setFile,
|
|
|
ext )
|
|
|
else:
|
|
|
setFile = timeTuple.tm_hour*60+timeTuple.tm_min
|
|
|
file = '%s%4.4d%3.3d%04d%s' % (self.metaoptchar,
|
|
|
timeTuple.tm_year,
|
|
|
timeTuple.tm_yday,
|
|
|
setFile,
|
|
|
ext )
|
|
|
|
|
|
filename = os.path.join( path, subfolder, file )
|
|
|
self.metaFile = file
|
|
|
#Setting HDF5 File
|
|
|
fp = h5py.File(filename,'w')
|
|
|
|
|
|
return fp
|
|
|
|
|
|
def writeMetadata(self, fp):
|
|
|
|
|
|
grp = fp.create_group("Metadata")
|
|
|
grp.create_dataset('array dimensions', data = self.tableDim, dtype = self.dtype)
|
|
|
|
|
|
for i in range(len(self.metadataList)):
|
|
|
grp.create_dataset(self.metadataList[i], data=getattr(self.dataOut, self.metadataList[i]))
|
|
|
return
|
|
|
|
|
|
def timeFlag(self):
|
|
|
currentTime = self.dataOut.utctime
|
|
|
|
|
|
if self.lastTime is None:
|
|
|
self.lastTime = currentTime
|
|
|
|
|
|
#Day
|
|
|
timeTuple = time.localtime(currentTime)
|
|
|
dataDay = timeTuple.tm_yday
|
|
|
|
|
|
#Time
|
|
|
timeDiff = currentTime - self.lastTime
|
|
|
|
|
|
#Si el dia es diferente o si la diferencia entre un dato y otro supera la hora
|
|
|
if dataDay != self.currentDay:
|
|
|
self.currentDay = dataDay
|
|
|
return True
|
|
|
elif timeDiff > 3*60*60:
|
|
|
self.lastTime = currentTime
|
|
|
return True
|
|
|
else:
|
|
|
self.lastTime = currentTime
|
|
|
return False
|
|
|
|
|
|
def setNextFile(self):
|
|
|
|
|
|
ext = self.ext
|
|
|
path = self.path
|
|
|
setFile = self.setFile
|
|
|
mode = self.mode
|
|
|
|
|
|
timeTuple = time.localtime(self.dataOut.utctime)
|
|
|
subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
|
|
|
|
|
|
fullpath = os.path.join( path, subfolder )
|
|
|
|
|
|
if os.path.exists(fullpath):
|
|
|
filesList = os.listdir( fullpath )
|
|
|
filesList = [k for k in filesList if 'M' in k]
|
|
|
if len( filesList ) > 0:
|
|
|
filesList = sorted( filesList, key=str.lower )
|
|
|
filen = filesList[-1]
|
|
|
# el filename debera tener el siguiente formato
|
|
|
# 0 1234 567 89A BCDE (hex)
|
|
|
# x YYYY DDD SSS .ext
|
|
|
if isNumber( filen[8:11] ):
|
|
|
setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file
|
|
|
else:
|
|
|
setFile = -1
|
|
|
else:
|
|
|
setFile = -1 #inicializo mi contador de seteo
|
|
|
else:
|
|
|
os.makedirs(fullpath)
|
|
|
setFile = -1 #inicializo mi contador de seteo
|
|
|
|
|
|
if self.setType is None:
|
|
|
setFile += 1
|
|
|
file = '%s%4.4d%3.3d%03d%s' % (self.metaoptchar,
|
|
|
timeTuple.tm_year,
|
|
|
timeTuple.tm_yday,
|
|
|
setFile,
|
|
|
ext )
|
|
|
else:
|
|
|
setFile = timeTuple.tm_hour*60+timeTuple.tm_min
|
|
|
file = '%s%4.4d%3.3d%04d%s' % (self.metaoptchar,
|
|
|
timeTuple.tm_year,
|
|
|
timeTuple.tm_yday,
|
|
|
setFile,
|
|
|
ext )
|
|
|
|
|
|
filename = os.path.join( path, subfolder, file )
|
|
|
|
|
|
#Setting HDF5 File
|
|
|
fp = h5py.File(filename,'w')
|
|
|
#write metadata
|
|
|
self.writeMetadata(fp)
|
|
|
#Write data
|
|
|
grp = fp.create_group("Data")
|
|
|
# grp.attrs['metadata'] = self.metaFile
|
|
|
|
|
|
# grp.attrs['blocksPerFile'] = 0
|
|
|
ds = []
|
|
|
data = []
|
|
|
dsList = self.dsList
|
|
|
i = 0
|
|
|
while i < len(dsList):
|
|
|
dsInfo = dsList[i]
|
|
|
#One-dimension data
|
|
|
if dsInfo['mode'] == 0:
|
|
|
# ds0 = grp.create_dataset(self.dataList[i], (1,1), maxshape=(1,self.blocksPerFile) , chunks = True, dtype='S20')
|
|
|
ds0 = grp.create_dataset(dsInfo['variable'], (1,1), maxshape=(1,self.blocksPerFile) , chunks = True, dtype=numpy.float64)
|
|
|
ds.append(ds0)
|
|
|
data.append([])
|
|
|
i += 1
|
|
|
continue
|
|
|
# nDimsForDs.append(nDims[i])
|
|
|
|
|
|
elif dsInfo['mode'] == 2:
|
|
|
grp0 = grp.create_group(dsInfo['variable'])
|
|
|
ds0 = grp0.create_dataset(dsInfo['dsName'], (1,dsInfo['shape']), data = numpy.zeros((1,dsInfo['shape'])) , maxshape=(None,dsInfo['shape']), chunks=True)
|
|
|
ds.append(ds0)
|
|
|
data.append([])
|
|
|
i += 1
|
|
|
continue
|
|
|
|
|
|
elif dsInfo['mode'] == 1:
|
|
|
grp0 = grp.create_group(dsInfo['variable'])
|
|
|
|
|
|
for j in range(dsInfo['dsNumber']):
|
|
|
dsInfo = dsList[i]
|
|
|
tableName = dsInfo['dsName']
|
|
|
shape = int(dsInfo['shape'])
|
|
|
|
|
|
if dsInfo['nDim'] == 3:
|
|
|
ds0 = grp0.create_dataset(tableName, (shape[0],shape[1],1) , data = numpy.zeros((shape[0],shape[1],1)), maxshape = (None,shape[1],None), chunks=True)
|
|
|
else:
|
|
|
ds0 = grp0.create_dataset(tableName, (1,shape), data = numpy.zeros((1,shape)) , maxshape=(None,shape), chunks=True)
|
|
|
|
|
|
ds.append(ds0)
|
|
|
data.append([])
|
|
|
i += 1
|
|
|
# nDimsForDs.append(nDims[i])
|
|
|
|
|
|
fp.flush()
|
|
|
fp.close()
|
|
|
|
|
|
# self.nDatas = nDatas
|
|
|
# self.nDims = nDims
|
|
|
# self.nDimsForDs = nDimsForDs
|
|
|
#Saving variables
|
|
|
print 'Writing the file: %s'%filename
|
|
|
self.filename = filename
|
|
|
# self.fp = fp
|
|
|
# self.grp = grp
|
|
|
# self.grp.attrs.modify('nRecords', 1)
|
|
|
self.ds = ds
|
|
|
self.data = data
|
|
|
# self.setFile = setFile
|
|
|
self.firsttime = True
|
|
|
self.blockIndex = 0
|
|
|
return
|
|
|
|
|
|
def putData(self):
|
|
|
|
|
|
if self.blockIndex == self.blocksPerFile or self.timeFlag():
|
|
|
self.setNextFile()
|
|
|
|
|
|
# if not self.firsttime:
|
|
|
self.readBlock()
|
|
|
self.setBlock() #Prepare data to be written
|
|
|
self.writeBlock() #Write data
|
|
|
|
|
|
return
|
|
|
|
|
|
def readBlock(self):
|
|
|
|
|
|
'''
|
|
|
data Array configured
|
|
|
|
|
|
|
|
|
self.data
|
|
|
'''
|
|
|
dsList = self.dsList
|
|
|
ds = self.ds
|
|
|
#Setting HDF5 File
|
|
|
fp = h5py.File(self.filename,'r+')
|
|
|
grp = fp["Data"]
|
|
|
ind = 0
|
|
|
|
|
|
# grp.attrs['blocksPerFile'] = 0
|
|
|
while ind < len(dsList):
|
|
|
dsInfo = dsList[ind]
|
|
|
|
|
|
if dsInfo['mode'] == 0:
|
|
|
ds0 = grp[dsInfo['variable']]
|
|
|
ds[ind] = ds0
|
|
|
ind += 1
|
|
|
else:
|
|
|
|
|
|
grp0 = grp[dsInfo['variable']]
|
|
|
|
|
|
for j in range(dsInfo['dsNumber']):
|
|
|
dsInfo = dsList[ind]
|
|
|
ds0 = grp0[dsInfo['dsName']]
|
|
|
ds[ind] = ds0
|
|
|
ind += 1
|
|
|
|
|
|
self.fp = fp
|
|
|
self.grp = grp
|
|
|
self.ds = ds
|
|
|
|
|
|
return
|
|
|
|
|
|
def setBlock(self):
|
|
|
'''
|
|
|
data Array configured
|
|
|
|
|
|
|
|
|
self.data
|
|
|
'''
|
|
|
#Creating Arrays
|
|
|
dsList = self.dsList
|
|
|
data = self.data
|
|
|
ind = 0
|
|
|
|
|
|
while ind < len(dsList):
|
|
|
dsInfo = dsList[ind]
|
|
|
dataAux = getattr(self.dataOut, dsInfo['variable'])
|
|
|
|
|
|
mode = dsInfo['mode']
|
|
|
nDim = dsInfo['nDim']
|
|
|
|
|
|
if mode == 0 or mode == 2 or nDim == 1:
|
|
|
data[ind] = dataAux
|
|
|
ind += 1
|
|
|
# elif nDim == 1:
|
|
|
# data[ind] = numpy.reshape(dataAux,(numpy.size(dataAux),1))
|
|
|
# ind += 1
|
|
|
elif nDim == 2:
|
|
|
for j in range(dsInfo['dsNumber']):
|
|
|
data[ind] = dataAux[j,:]
|
|
|
ind += 1
|
|
|
elif nDim == 3:
|
|
|
for j in range(dsInfo['dsNumber']):
|
|
|
data[ind] = dataAux[:,j,:]
|
|
|
ind += 1
|
|
|
|
|
|
self.data = data
|
|
|
return
|
|
|
|
|
|
def writeBlock(self):
|
|
|
'''
|
|
|
Saves the block in the HDF5 file
|
|
|
'''
|
|
|
dsList = self.dsList
|
|
|
|
|
|
for i in range(len(self.ds)):
|
|
|
dsInfo = dsList[i]
|
|
|
nDim = dsInfo['nDim']
|
|
|
mode = dsInfo['mode']
|
|
|
|
|
|
# First time
|
|
|
if self.firsttime:
|
|
|
# self.ds[i].resize(self.data[i].shape)
|
|
|
# self.ds[i][self.blockIndex,:] = self.data[i]
|
|
|
if type(self.data[i]) == numpy.ndarray:
|
|
|
|
|
|
if nDim == 3:
|
|
|
self.data[i] = self.data[i].reshape((self.data[i].shape[0],self.data[i].shape[1],1))
|
|
|
self.ds[i].resize(self.data[i].shape)
|
|
|
if mode == 2:
|
|
|
self.ds[i].resize(self.data[i].shape)
|
|
|
self.ds[i][:] = self.data[i]
|
|
|
else:
|
|
|
|
|
|
# From second time
|
|
|
# Meteors!
|
|
|
if mode == 2:
|
|
|
dataShape = self.data[i].shape
|
|
|
dsShape = self.ds[i].shape
|
|
|
self.ds[i].resize((self.ds[i].shape[0] + dataShape[0],self.ds[i].shape[1]))
|
|
|
self.ds[i][dsShape[0]:,:] = self.data[i]
|
|
|
# No dimension
|
|
|
elif mode == 0:
|
|
|
self.ds[i].resize((self.ds[i].shape[0], self.ds[i].shape[1] + 1))
|
|
|
self.ds[i][0,-1] = self.data[i]
|
|
|
# One dimension
|
|
|
elif nDim == 1:
|
|
|
self.ds[i].resize((self.ds[i].shape[0] + 1, self.ds[i].shape[1]))
|
|
|
self.ds[i][-1,:] = self.data[i]
|
|
|
# Two dimension
|
|
|
elif nDim == 2:
|
|
|
self.ds[i].resize((self.ds[i].shape[0] + 1,self.ds[i].shape[1]))
|
|
|
self.ds[i][self.blockIndex,:] = self.data[i]
|
|
|
# Three dimensions
|
|
|
elif nDim == 3:
|
|
|
self.ds[i].resize((self.ds[i].shape[0],self.ds[i].shape[1],self.ds[i].shape[2]+1))
|
|
|
self.ds[i][:,:,-1] = self.data[i]
|
|
|
|
|
|
self.firsttime = False
|
|
|
self.blockIndex += 1
|
|
|
|
|
|
#Close to save changes
|
|
|
self.fp.flush()
|
|
|
self.fp.close()
|
|
|
return
|
|
|
|
|
|
def run(self, dataOut, path=None, blocksPerFile=10, metadataList=None, dataList=None, mode=None, **kwargs):
|
|
|
|
|
|
if not(self.isConfig):
|
|
|
flagdata = self.setup(dataOut, path=path, blocksPerFile=blocksPerFile,
|
|
|
metadataList=metadataList, dataList=dataList, mode=mode, **kwargs)
|
|
|
|
|
|
if not(flagdata):
|
|
|
return
|
|
|
|
|
|
self.isConfig = True
|
|
|
# self.putMetadata()
|
|
|
self.setNextFile()
|
|
|
|
|
|
self.putData()
|
|
|
return
|
|
|
|