Transcript Document

Extending WDSS-II
C++
Valliappa Lakshmanan
National Severe Storms Laboratory &
University of Oklahoma
[email protected]
7/21/2015
http://www.wdssii.org/
1
Meant to be extended

WDSS-II is meant to be extended
Few things are set in stone
 We use factories every where
 You can introduce your implementation
objects into those factories
 Plug in your own writers, readers, builders,
data formats, etc.
 Existing algorithms will transparently pick up
your changes.

7/21/2015
http://www.wdssii.org/
2
New algorithm

Adding a new algorithm or tool







Is the most common extension
Write a new executable that links to the WDSS-II libraries
Will automatically be pluggable into a WDSS-II deployment
system
Can ingest data from an existing system
Can provide products instead of products already being used.
Use w2algcreator – don’t need to be a C++ expert to do this
You need to know C++ very well in order to extend the
WDSS-II framework in any other way
7/21/2015
http://www.wdssii.org/
3
Adding functionality to WDSS-II

Use the factories to extend WDSS-II
Make sure that your introduceSelf() function
is called by Baseline::initialize()
 For example, this is how gzip files are read
 Factory<Reader>::introduce(“gz”, new
GzipReader() );
 GzipReader implements the Reader
interface

7/21/2015
http://www.wdssii.org/
4
Available factories

These are some of the available factories in the infrastructure

Reader


Writer


To write formats other than netcdf,xml,awipsnc
Builder/Formatter


To notify to something other than LB (such as SQL data base or CORBA)
DataEncoder


To write to something other than file, gz, bz2
IndexRecordNotifier


To read from something other than file, gz, bz2
To read formats other than netcdf, xml, level-III
Factories at the algorithm level

FilterFactory (w2imgproc)


VolumeCreatorFactory (w2merger)

7/21/2015
New Kernel filters for smoothing, etc.
New strategies for blending
http://www.wdssii.org/
5
Adding to factory

Write a class that implements the appropriate
interface (Reader,Writer, etc)
 Create a static introduceSelf() method that
adds itself the factory with a name
 Call this from a static initialize() method
common to the shared library


Directly call this initialize() method from
Baseline::initialize() to add directly to WDSS-II
Use a static initializer if not every body needs it or if
you don’t have access to the code of
Baseline::initialize()

7/21/2015
More on this later
http://www.wdssii.org/
6
Writing ingest programs

To read a new data format, write an ingest
program

Use DataDirectoryManager


Create a DataHandler




7/21/2015
Implement processData
Data will be handed to you in chunks
Use BOIStream if your data are binary


http://cimms.ou.edu/~lakshman/WDSSII/software/doc/w2dox/html/classcode_1_1D
ataDirectoryManager.html
Does byteswapping
Use AsciiLineReader if your data are textual
Look at example ingest programs in w2algs/ftptonc
and w2algs/ldm2netcdf
http://www.wdssii.org/
7
Writing native readers

You can make algorithms read your new
data format natively
Ingest programs take the input data and
convert it into netcdf/XML
 The Level-III format is read in this manner
 Use w2ext/w2nexrad as an example
 Some what more complex; choose whether
you really want to do this.

7/21/2015
http://www.wdssii.org/
8
ExtensionLoader

Use a static intializer if you can not
modify Baseline::initialize()
Look at documentation of ExtensionLoader
 Look at w2ext/w2nexrad for examples
 Populate WDSS-II factories in this initializer

Package up all your classes into a
shared library
 Add library to environment variable
W2_EXTENSION_LIBS at run-time

7/21/2015
http://www.wdssii.org/
9
Using the documentation

When writing new algorithms

Consider if the functionality already exists



Start with the data type documentation



7/21/2015
Can you link together existing tools to get your
functionality?
Experiment, then use those algorithm classes to form your
new algorithm (see the algorithm documentation)
LatLonGrid, etc.
Process your data
Use DataEncoder::writeData to write all your
intermediate outputs
http://www.wdssii.org/
10