Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
A
Aoflagger
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Jira
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
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
Marcel Loose
Aoflagger
Commits
d7eb34df
Commit
d7eb34df
authored
3 years ago
by
André Offringa
Browse files
Options
Downloads
Patches
Plain Diff
Write flags back to SD HDF5 data sets
parent
ee8d6105
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
imagesets/sdhdfimageset.cpp
+71
-19
71 additions, 19 deletions
imagesets/sdhdfimageset.cpp
imagesets/sdhdfimageset.h
+16
-0
16 additions, 0 deletions
imagesets/sdhdfimageset.h
with
87 additions
and
19 deletions
imagesets/sdhdfimageset.cpp
+
71
−
19
View file @
d7eb34df
...
...
@@ -86,18 +86,40 @@ std::string SdhdfImageSet::Description(const ImageSetIndex& index) const {
_beams
[
beam
].
bandParams
[
band
].
label
;
}
bool
SdhdfImageSet
::
tryOpen
(
H5
::
DataSet
&
dataSet
,
H5
::
H5File
&
file
,
const
std
::
string
&
name
)
{
#if H5_VERSION_GE(1, 10, 7)
if
(
file
.
exists
(
name
))
{
dataSet
=
file
.
openDataSet
(
name
);
return
true
;
}
else
return
false
;
#else
// file.exists(name) doesn't work in older HDF5 libs, so use trial
// and error. Unfortunately this generates output on the cmdline
// when the file does not exist, hence only use it as fall back.
try
{
dataSet
=
file
.
openDataSet
(
name
);
return
true
;
}
catch
(
H5
::
FileIException
&
)
{
// The data set did not exist (probably)
return
false
;
}
#endif
}
BaselineData
SdhdfImageSet
::
loadData
(
ProgressListener
&
progress
,
const
ImageSetIndex
&
index
)
{
size_t
beam
=
_indexTable
[
index
.
Value
()].
first
;
size_t
band
=
_indexTable
[
index
.
Value
()].
second
;
const
size_t
beam
=
_indexTable
[
index
.
Value
()].
first
;
const
size_t
band
=
_indexTable
[
index
.
Value
()].
second
;
const
BandParams
&
bandParams
=
_beams
[
beam
].
bandParams
[
band
];
const
std
::
string
label
=
bandParams
.
label
;
Logger
::
Info
<<
"Reading beam "
<<
beam
<<
", "
<<
label
<<
"...
\n
"
;
H5
::
H5File
file
(
_path
,
H5F_ACC_RDONLY
,
H5P_DEFAULT
);
const
std
::
string
p
refix
=
"beam_"
+
std
::
to_
string
(
beam
)
+
"/"
+
label
+
"/astronomy_data/"
;
H5
::
DataSet
dataSet
=
file
.
openDataSet
(
p
refix
+
"data"
);
const
std
::
string
beamP
refix
=
"beam_"
+
std
::
to_string
(
beam
)
+
"/"
+
label
;
const
std
::
string
dataPrefix
=
beamPrefix
+
"/astronomy_data/"
;
H5
::
DataSet
dataSet
=
file
.
openDataSet
(
dataP
refix
+
"data"
);
H5
::
DataSpace
space
=
dataSet
.
getSpace
();
std
::
vector
<
hsize_t
>
ddims
(
space
.
getSimpleExtentNdims
());
space
.
getSimpleExtentDims
(
ddims
.
data
());
...
...
@@ -135,17 +157,8 @@ BaselineData SdhdfImageSet::loadData(ProgressListener& progress,
}
Mask2DPtr
mask
;
// file.exists(prefix + "flag") doesn't work in older HDF5 libs, so use trial
// and error:
H5
::
DataSet
flagsSet
;
bool
hasFlags
=
false
;
try
{
flagsSet
=
file
.
openDataSet
(
prefix
+
"flag"
);
hasFlags
=
true
;
}
catch
(
H5
::
FileIException
&
)
{
// Ignore
}
if
(
hasFlags
)
{
if
(
tryOpen
(
flagsSet
,
file
,
dataPrefix
+
"flag"
))
{
progress
.
OnProgress
(
5
,
10
);
Logger
::
Info
<<
"Reading flags...
\n
"
;
H5
::
DataSpace
space
=
flagsSet
.
getSpace
();
...
...
@@ -199,8 +212,8 @@ BaselineData SdhdfImageSet::loadData(ProgressListener& progress,
H5
::
CompType
obsParamsType
(
sizeof
(
ObsParams
));
obsParamsType
.
insertMember
(
"MJD"
,
HOFFSET
(
ObsParams
,
mjd
),
H5
::
PredType
::
NATIVE_DOUBLE
);
H5
::
DataSet
obsParamsSet
=
file
.
openDataSet
(
"beam_"
+
std
::
to_string
(
beam
)
+
"/"
+
label
+
"/metadata/obs_params"
);
H5
::
DataSet
obsParamsSet
=
file
.
openDataSet
(
beamPrefix
+
"/metadata/obs_params"
);
H5
::
DataSpace
obsParamsSpace
=
obsParamsSet
.
getSpace
();
if
(
obsParamsSpace
.
getSimpleExtentNdims
()
!=
1
)
throw
std
::
runtime_error
(
...
...
@@ -221,8 +234,7 @@ BaselineData SdhdfImageSet::loadData(ProgressListener& progress,
metaData
->
SetObservationTimes
(
std
::
move
(
times
));
H5
::
DataSet
frequencySet
=
file
.
openDataSet
(
"beam_"
+
std
::
to_string
(
beam
)
+
"/"
+
label
+
"/astronomy_data/frequency"
);
file
.
openDataSet
(
beamPrefix
+
"/astronomy_data/frequency"
);
H5
::
DataSpace
frequencySpace
=
frequencySet
.
getSpace
();
if
(
frequencySpace
.
getSimpleExtentNdims
()
!=
1
)
throw
std
::
runtime_error
(
...
...
@@ -259,4 +271,44 @@ void SdhdfImageSet::PerformReadRequests(ProgressListener& progress) {
progress
.
OnFinish
();
}
void
SdhdfImageSet
::
AddWriteFlagsTask
(
const
ImageSetIndex
&
index
,
std
::
vector
<
Mask2DCPtr
>&
flags
)
{
assert
(
!
flags
.
empty
());
const
size_t
beam
=
_indexTable
[
index
.
Value
()].
first
;
const
size_t
band
=
_indexTable
[
index
.
Value
()].
second
;
const
BandParams
&
bandParams
=
_beams
[
beam
].
bandParams
[
band
];
const
std
::
string
label
=
bandParams
.
label
;
const
size_t
nTimes
=
flags
.
front
()
->
Width
();
Logger
::
Info
<<
"Writing flags for beam "
<<
beam
<<
", "
<<
label
<<
"...
\n
"
;
H5
::
H5File
file
(
_path
,
H5F_ACC_RDWR
,
H5P_DEFAULT
);
const
std
::
string
beamPrefix
=
"beam_"
+
std
::
to_string
(
beam
)
+
'/'
+
label
+
'/'
;
const
std
::
string
dataPrefix
=
beamPrefix
+
"astronomy_data/"
;
H5
::
DataSet
flagsSet
;
if
(
!
tryOpen
(
flagsSet
,
file
,
dataPrefix
+
"flag"
))
{
// Create the data set
H5
::
DataType
dataType
(
H5
::
PredType
::
NATIVE_UINT8
);
const
hsize_t
dimsf
[
2
]{
nTimes
,
hsize_t
(
bandParams
.
nChannels
)};
H5
::
DataSpace
dataSpace
(
2
,
dimsf
);
flagsSet
=
file
.
createDataSet
(
dataPrefix
+
"flag"
,
dataType
,
dataSpace
);
}
Logger
::
Info
<<
"Writing flag data...
\n
"
;
aocommon
::
UVector
<
unsigned
char
>
flagData
(
nTimes
*
bandParams
.
nChannels
);
unsigned
char
*
valuePtr
=
flagData
.
data
();
for
(
size_t
timeIndex
=
0
;
timeIndex
!=
nTimes
;
++
timeIndex
)
{
for
(
int
channel
=
0
;
channel
!=
bandParams
.
nChannels
;
++
channel
)
{
bool
flag
=
false
;
for
(
const
Mask2DCPtr
&
mask
:
flags
)
flag
=
flag
||
mask
->
Value
(
timeIndex
,
channel
);
*
valuePtr
=
flag
?
1
:
0
;
++
valuePtr
;
}
}
flagsSet
.
write
(
flagData
.
data
(),
H5
::
PredType
::
NATIVE_UINT8
,
H5S_ALL
,
H5S_ALL
,
H5P_DEFAULT
);
}
}
// namespace imagesets
This diff is collapsed.
Click to expand it.
imagesets/sdhdfimageset.h
+
16
−
0
View file @
d7eb34df
...
...
@@ -7,6 +7,11 @@
#include
"imageset.h"
namespace
H5
{
class
DataSet
;
class
H5File
;
}
// namespace H5
namespace
imagesets
{
class
SdhdfImageSet
final
:
public
ImageSet
{
...
...
@@ -41,7 +46,18 @@ class SdhdfImageSet final : public ImageSet {
return
std
::
unique_ptr
<
BaselineData
>
(
new
BaselineData
(
baseline
));
}
void
AddWriteFlagsTask
(
const
ImageSetIndex
&
index
,
std
::
vector
<
Mask2DCPtr
>
&
flags
)
override
;
void
PerformWriteFlagsTask
()
override
{}
private
:
/**
* Open the data set @c name inside @c file, and store the result in @c
* dataSet. If the data set does not exist, @c false is returned.
*/
static
bool
tryOpen
(
H5
::
DataSet
&
dataSet
,
H5
::
H5File
&
file
,
const
std
::
string
&
name
);
struct
Header
{
int
nBeams
;
char
telescopeName
[
64
];
...
...
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