Skip to content
Snippets Groups Projects
Commit f5a1c224 authored by mads's avatar mads
Browse files

added Hawc2io.py

parent 6759dc64
No related branches found
No related tags found
No related merge requests found
# -*- coding: utf-8 -*-
"""
Author:
Bjarne S. Kallesoee
bska@risoe.dtu.dk
Description:
Reads all HAWC2 output data formats, HAWC2 ascii, HAWC2 binary and flex
call ex.:
# creat data file object, call without extension, but with parth
file = ReadHawc2("HAWC2ex/test")
# if called with ReadOnly = 1 as
file = ReadHawc2("HAWC2ex/test",ReadOnly=1)
# no channels a stored in memory, otherwise read channels are stored for reuse
# channels are called by a list
file([0,2,1,1]) => channels 1,3,2,2
# if empty all channels are returned
file() => all channels as 1,2,3,...
file.t => time vector
1. version: 19/4-2011
Need to be done:
* add error handling for allmost every thing
"""
import numpy as np
import os
################################################################################
################################################################################
################################################################################
## Read HAWC2 class
################################################################################
class ReadHawc2:
"""
Class title
===========
Class documentation docstring
class subtitle
--------------
and more...
"""
################################################################################
# read *.sel file
def _ReadSelFile(self):
"""
Some title
==========
Using docstrings formatted according to the reStructuredText specs
can be used for automated documentation generation with for instance
Sphinx: http://sphinx.pocoo.org/.
Parameters
----------
signal : ndarray
some description
Returns
-------
output : int
describe variable
"""
# read *.sel hawc2 output file for result info
fid = open(self.FileName + '.sel', 'r')
Lines = fid.readlines()
fid.close()
# findes general result info (number of scans, number of channels,
# simulation time and file format)
temp = Lines[8].split()
self.NrSc = int(temp[0]); self.NrCh = int(temp[1])
self.Time = float(temp[2]); self.Freq = self.NrSc/self.Time;
self.t = np.linspace(0,self.Time,self.NrSc);
Format = temp[3]
# reads channel info (name, unit and description)
Name = []; Unit = []; Description = [];
for i in range(0,self.NrCh):
temp = str(Lines[i+12][12:43]); Name.append(temp.strip())
temp = str(Lines[i+12][12:43]); Unit.append(temp.strip())
temp = str(Lines[i+12][12:43]); Description.append(temp.strip())
self.ChInfo = [Name,Unit,Description]
# if binary file format, scaling factors are read
if Format.lower() == 'binary':
self.ScaleFactor = np.zeros(self.NrCh)
self.FileFormat = 'HAWC2_BINARY'
for i in range(0,self.NrCh):
self.ScaleFactor[i] = float(Lines[i+12+self.NrCh+2])
else:
self.FileFormat = 'HAWC2_ASCII'
################################################################################
# read sensor file for flex format
def _ReadSensorFile(self):
# read sensor file used if results are saved in flex format
DirName = os.path.dirname(self.FileName + ".int")
try:
fid = open(DirName + "\sensor ", 'r')
except IOError:
print "can't finde sensor file for flex format"
return
Lines = fid.readlines()
fid.close()
# reads channel info (name, unit and description)
self.NrCh = 0
Name = []; Unit = []; Description = [];
for i in range(2,len(Lines)):
temp = Lines[i]
if not temp.strip():
break
self.NrCh += 1
temp = str(Lines[i][38:45]); Unit.append(temp.strip())
temp = str(Lines[i][45:53]); Name.append(temp.strip())
temp = str(Lines[i][53:]); Description.append(temp.strip())
self.ChInfo = [Name,Unit,Description]
# read general info from *.int file
fid = open(self.FileName + ".int", 'rb')
fid.seek(4*19)
if not np.fromfile(fid,'int32',1) == self.NrCh:
print "number of sensors in sensor file and data file are not consisten"
fid.seek(4*(self.NrCh)+8,1)
temp = np.fromfile(fid,'f',2)
self.Freq = 1/temp[1];
self.ScaleFactor = np.fromfile(fid,'f',self.NrCh)
fid.seek(2*4*self.NrCh+48*2)
self.NrSc = len(np.fromfile(fid,'int16'))/self.NrCh
self.Time = self.NrSc*temp[1]
self.t = np.arange(0,self.Time,temp[1])
fid.close()
################################################################################
# init function, load channel and other general result file info
def __init__(self,FileName,ReadOnly=0):
self.FileName = FileName
self.ReadOnly = ReadOnly
self.Iknown = [] # to keep track of what has been read all ready
self.Data = np.zeros(0)
if os.path.isfile(FileName + ".sel"):
self._ReadSelFile()
elif os.path.isfile(self.FileName + ".int"):
self.FileFormat = 'Flex'
self._ReadSensorFile()
else:
print "unknown file"
################################################################################
# Read results in binary format
def ReadBinary(self,ChVec=[]):
if not ChVec:
ChVec = range(0,self.NrCh)
fid = open(self.FileName + '.dat', 'rb')
data = np.zeros((self.NrSc,len(ChVec))); j=0
for i in ChVec:
fid.seek(i*self.NrSc*2,0)
data[:,j] = np.fromfile(fid,'int16',self.NrSc)*self.ScaleFactor[i]
j += 1
return data
################################################################################
# Read results in ASCII format
def ReadAscii(self,ChVec=[]):
if not ChVec:
ChVec = range(0,self.NrCh)
temp = np.loadtxt(self.FileName + '.dat',usecols=ChVec)
return temp.reshape((self.NrSc,len(ChVec)))
################################################################################
# Read results in flex format
def ReadFlex(self,ChVec=[]):
if not ChVec:
ChVec = range(1,self.NrCh)
fid = open(self.FileName + ".int", 'rb')
fid.seek(2*4*self.NrCh+48*2)
temp = np.fromfile(fid,'int16')
temp = temp.reshape(self.NrSc,self.NrCh)
fid.close()
return np.dot(temp[:,ChVec],np.diag(self.ScaleFactor[ChVec]))
################################################################################
# One stop call for reading all data formats
def ReadAll(self,ChVec=[]):
if not ChVec:
ChVec = range(0,self.NrCh)
if self.FileFormat == 'HAWC2_BINARY':
return self.ReadBinary(ChVec)
elif self.FileFormat == 'HAWC2_ASCII':
return self.ReadAscii(ChVec)
else:
return self.ReadFlex(ChVec)
################################################################################
# Main read data call, read, save and sort data
def __call__(self,ChVec=[]):
if not ChVec:
ChVec = range(0,self.NrCh)
elif max(ChVec) >= self.NrCh:
print "to high channel number"
return
# if ReadOnly, read data but no storeing in memory
if self.ReadOnly:
return self.ReadAll(ChVec)
# if not ReadOnly, sort in known and new channels, read new channels
# and return all requested channels
else:
# sort into known channels and channels to be read
I1=[];I2=[] # I1=Channel mapping, I2=Channels to be read
for i in ChVec:
try:
I1.append(self.Iknown.index(i))
except:
self.Iknown.append(i)
I2.append(i)
I1.append(len(I1))
# read new channels
if I2:
temp = self.ReadAll(I2)
# add new channels to Data
if self.Data.any():
self.Data = np.append(self.Data,temp,axis=1)
# if first call, so Daata is empty
else:
self.Data = temp
return self.Data[:,tuple(I1)]
################################################################################
################################################################################
################################################################################
## write HAWC2 class, to be implemented
################################################################################
if __name__ == '__main__':
res_file = Hawc2io.ReadHawc2('structure_wind')
results = res_file.ReadAscii()
channelinfo = res_file.ChInfo
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment