Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
W
WindEnergyToolbox
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
wtlib
WindEnergyToolbox
Commits
f5a1c224
Commit
f5a1c224
authored
9 years ago
by
mads
Browse files
Options
Downloads
Patches
Plain Diff
added Hawc2io.py
parent
6759dc64
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
wetb/hawc2/Hawc2io.py
+233
-0
233 additions, 0 deletions
wetb/hawc2/Hawc2io.py
wetb/hawc2/__init__.py
+0
-0
0 additions, 0 deletions
wetb/hawc2/__init__.py
with
233 additions
and
0 deletions
wetb/hawc2/Hawc2io.py
0 → 100644
+
233
−
0
View file @
f5a1c224
# -*- 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
This diff is collapsed.
Click to expand it.
wetb/hawc2/__init__.py
0 → 100644
+
0
−
0
View file @
f5a1c224
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment