Functionality to define qualifiers to time series, next to locationIds and parameterIds


Function:

Qualifiers to parameters

Where to Use?

Time series

Why to Use?

To reduce the number of parameters

Description:

Gives a qualifier to a parameter, like "minimum" of "observed"

Available since:

DelftFEWS200803

Contents

Overview

To be able to give additional information to a parameter without creating lots of extra parameters, we introduced the feature of qualifiers. Qualifiers are used to define a unique time series, next to the locationId and parameterId. Examples are series where you want to derive the daily minimum, maximum and mean values of an observed series of water levels. The original series is a regular series with parameterId "H" and no qualifier, where the other series have  the same parameterId "H", but qualifiers like "min", "mean" and "max".

Configuration

Qualifier definition

Qualifiers are defined in the regionConfigFiles directory. When available on the file system, the name of the XML file is for example:

Qualifiers 1.00 default.xml

 An example looks like:

<?xml version="1.0" encoding="UTF-8"?>
<qualifiers xmlns="http://www.wldelft.nl/fews"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.wldelft.nl/fews https://fewsdocs.deltares.nl/schemas/version1.0/qualifiers.xsd">
	<qualifier id="min" name="min">
		<description>minimum</description>
	</qualifier>
	<qualifier id="max" name="max">
		<description>maximum</description>
	</qualifier>
	<qualifier id="dag" name="dag">
		<shortName>dag</shortName>
		<group>tijdstap</group>
	</qualifier>
	<qualifier id="maand" name="maand">
		<shortName>maand</shortName>
		<group>tijdstap</group>
	</qualifier>
	<qualifier id="jaar" name="jaar">
		<shortName>jaar</shortName>
		<group>tijdstap</group>
	</qualifier>
</qualifiers>
Qualifier group

A qualifierGroup is a set qualifiers from which only 1 can be assigned to a time series at a time.
Qualifiers not belonging to a group can be combined multiple times but qualifiers within a group cannot.

Qualifiers groups also determine which time series can be combined in the Time Series Dialog. Time series with different qualifiers belonging to the same group can be summed and replaced with a time series without those qualifiers but with all other identical charateristics.

Csv

Qualifiers can also be defined by referring to a csv file in the configuration. For that the <file> and <id> are required. By using %% can be referred to the content of columns in the csv file. So the next example below the columns "qualifierId" and "qualifierName" determine the id and name of all qualifiers present in the csv file. The columns can be used multiple times also in combination with other text as is done for the definition of the attribute "ExternalQualifierId" which will start with "LNG_KLAS_" for all qualifiers followed by the content in the "qualifierId" column. 

<?xml version="1.0" encoding="UTF-8"?>
<qualifiers xmlns="http://www.wldelft.nl/fews"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.wldelft.nl/fews https://fewsdocs.deltares.nl/schemas/version1.0/qualifiers.xsd">
	<csvFile>
		<file>vissen_lengteklasse.csv</file>
		<id>%qualifierId%</id>
		<name>%qualifierName%</name>
		<group>Vissen lengteklasse</group>
		<attribute id="ExternalQualifierId">
			<text>LNG_KLAS_%qualifierId%</text>
		</attribute>
	</csvFile>
</qualifiers>

Csv file "vissen_lengteklasse.csv" (located in MaplayerFiles config directory):

qualifierId;qualifierName
VL-0;klasse 0
VL-1;klasse 1
VL-2;klasse 2
VL-3;klasse 3
VL-4;klasse 4
VLSK-1;klasse 1 (SK)
VLSK-2;klasse 2 (SK)
VLSK-3;klasse 3 (SK)
VLSK-4;klasse 4 (SK)
VLSK-5;klasse 5 (SK)

Time Series

The most useful way is first to read all locations from the DBF into one locationSet, where all attributes are assigned.
See for example:

    <timeSeriesSet>
      <moduleInstanceId>ImportCAW</moduleInstanceId>
      <valueType>scalar</valueType>
      <parameterId>H.meting</parameterId>
      <qualifierId>min</qualifierId>
      <locationSetId>Boezem_Poldergemaal_H.meting</locationSetId>
      <timeSeriesType>external historical</timeSeriesType>
      <timeStep unit="nonequidistant"/>
      <relativeViewPeriod unit="day" start="-6000" end="0"/>
      <readWriteMode>editing visible to all future task runs</readWriteMode>
      <synchLevel>5</synchLevel>
    </timeSeriesSet>

Qualifier Panel (since 2014.02)

The qualifier panel can be explicitly turned on or of in the Explorer.xml by the element <qualifierListSize> within <panelSizes> element. It is turned off when specifying 0 and turned on with a value above 0.

	<panelSizes>
		<loggingPanelSize>0</loggingPanelSize>
		<listsPanelSize>20</listsPanelSize>
		<filterListSize>20</filterListSize>
		<locationListSize>45</locationListSize>
		<parameterListSize>25</parameterListSize>
		<qualifierListSize>0</qualifierListSize>
		<forecastListSize>0</forecastListSize>
	</panelSizes>

When <qualifierListSize> is not present the qualfier panel will be visible within FEWS when there are filters based on constraints that contain qualifiers configured such as in the example Filters.xml below.

<?xml version="1.0" encoding="UTF-8"?>
<filters version="1.1" xmlns="http://www.wldelft.nl/fews" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.wldelft.nl/fews https://fewsdocs.deltares.nl/schemas/version1.0/filters.xsd">
	<defaultFilterId>River</defaultFilterId>
	<!--Observed data Filters-->
	<filter id="River">
		<mapExtentId>River</mapExtentId>
		<child foreignKey="Rain_Gauges"/>
		<child foreignKey="Qualifiers"/>
	</filter>
	<filter id="Rain_Gauges" name="Rain Gauges">
		<timeSeriesSet>
			<moduleInstanceId>NWP_Grid_To_SubCatchments</moduleInstanceId>
			<valueType>scalar</valueType>
			<parameterId>P.nwp.fcst</parameterId>
			<qualifierId>ACCESS_R</qualifierId>
			<locationSetId>Gauges_P.obs.All</locationSetId>
			<timeSeriesType>external forecasting</timeSeriesType>
			<timeStep unit="hour"/>
			<readWriteMode>read complete forecast</readWriteMode>
		</timeSeriesSet>
		<timeSeriesSet>
			<moduleInstanceId>NWP_Grid_To_SubCatchments</moduleInstanceId>
			<valueType>scalar</valueType>
			<parameterId>P.nwp.fcst</parameterId>
			<qualifierId>ACCESS_A</qualifierId>
			<locationSetId>Gauges_P.obs.All</locationSetId>
			<timeSeriesType>external forecasting</timeSeriesType>
			<timeStep unit="hour"/>
			<readWriteMode>read complete forecast</readWriteMode>
		</timeSeriesSet>
	</filter>
	<filter id="Qualifiers" name="Qualifiers">
		<relativeViewPeriod start="-100000" end="0" unit="day"/>
		<qualifierConstraints>
			<idStartsWith prefix="ACCESS_"/>
		</qualifierConstraints>
	</filter>
</filters>

From build 55796 the qualifier panel also works for filters based on a combination of timeSeriesSets and qualifierConstraints like specified below:

<?xml version="1.0" encoding="UTF-8"?>
<filters version="1.1" xmlns="http://www.wldelft.nl/fews" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.wldelft.nl/fews https://fewsdocs.deltares.nl/schemas/version1.0/filters.xsd">
	<timeSeriesSets id="timeSeriesSetsX">
		<timeSeriesSet>
			<moduleInstanceId>Process</moduleInstanceId>
			<valueType>scalar</valueType>
			<parameterId>P.norm</parameterId>
			<qualifierId>qualifierX</qualifierId>
			<locationId>NROER09</locationId>
			<timeSeriesType>external historical</timeSeriesType>
			<timeStep unit="day"/>
			<readWriteMode>read only</readWriteMode>
			<synchLevel>1</synchLevel>
		</timeSeriesSet>
		<timeSeriesSet>
			<moduleInstanceId>Process</moduleInstanceId>
			<valueType>scalar</valueType>
			<parameterId>P.norm</parameterId>
			<qualifierId>qualifierY</qualifierId>
			<locationId>NROER09</locationId>
			<timeSeriesType>external historical</timeSeriesType>
			<timeStep unit="day"/>
			<readWriteMode>read only</readWriteMode>
			<synchLevel>1</synchLevel>
		</timeSeriesSet>
	</timeSeriesSets>
	<filter id="Filter_For_Qualifier_Panel" name="Filter for qualifier panel">
		<timeSeriesSetsId>timeSeriesSetsX</timeSeriesSetsId>
		<qualifierConstraints>
			<idStartsWith prefix=""/>
		</qualifierConstraints>
	</filter>
</filters>


By selecting filter "Rain_Gauges" from example above the qualifiers panel will be visible because there are filters based on qualifier constraints defined, but it is empty because the selected filter is not based on qualifier constraints:

By selecting filter "Qualifiers" the qualifier panel will be filled with the qualifiers matching the constraint (they must also be avilable within the data viewer selection and within the data present at system time)

The title of the qualifier panel can be configured in Explorer.xml by <qualifierPanelHeader> (from 2015.02):

	<panelHeaderLabels>
		<filterPanelHeader>Filters</filterPanelHeader>
		<locationPanelHeader>Locations</locationPanelHeader>
		<parameterPanelHeader>Parameters</parameterPanelHeader>
		<qualifierPanelHeader>Qualifiers</qualifierPanelHeader>
		<forecastPanelHeader>Open Forecasts</forecastPanelHeader>
	</panelHeaderLabels>

Qualifier Tree

A qualifier tree can also be configured in Qualifiers.xml by defining a qualifierRootNode that contains other qualifier nodes that in their turn can be nested.

For qualifier nodes constraints can be defined to make a selection of which qualifiers it should contain. Qualifiers can match multiple sets of contraints which makes it possible for qualifiers to appear under multiple different nodes at the same time.

For example

	<qualifierRootNode id="Hydrobiologie">
		<qualifierNode id="Taxa">
				...
			<qualifierNode id="Alle taxa">
				<constraints>
					<attributeExists id="Qualifier_TAXA"/>
				</constraints>
			</qualifierNode>
				...
			<qualifierNode id="Macrofyten">
				<qualifierNode id="ALGAE">
					<constraints>
						<attributeTextEquals id="Type" equals="MACFT"/>
						<attributeTextEquals id="Groep" equals="ALGAE"/>
					</constraints>
				</qualifierNode>
				<qualifierNode id="ANGIO">
					<constraints>
						<attributeTextEquals id="Type" equals="MACFT"/>
						<attributeTextEquals id="Groep" equals="ANGIO"/>
					</constraints>
				</qualifierNode>
				<qualifierNode id="SPORO">
					<constraints>
						<attributeTextEquals id="Type" equals="MACFT"/>
						<attributeTextEquals id="Groep" equals="SPORO"/>
					</constraints>
				</qualifierNode>
			</qualifierNode>
				...
	</qualifierRootNode>

Qualifier nodes for which there is no data will not be shown so in a FEWS system with only data for time series with qualifiers that have a "Groep" attribute of "ANGIO", "Type" attribute of "MACFT" and a "Qualifier_TAXA" attribute present the tree configured above would look like:

Qualifier nodes that contain only 1 qualifier for which there is data will also not be shown since it is not distinguishable. 

	<qualifierRootNode id="Hydrobiologie">
				...
		<qualifierNode id="Analyse code">
				...
			<qualifierId>MEA</qualifierId>
			<qualifierId>PTB</qualifierId>
			<qualifierId>SRA</qualifierId>
				...
		</qualifierNode>
		<qualifierNode id="Compartiment">
			<qualifierId>OR</qualifierId>
			<qualifierId>OW</qualifierId>
			<qualifierId>VE</qualifierId>
		</qualifierNode>
				...
	</qualifierRootNode>

For instance the qualifier nodes "Analyse code" and "Compartiment" from the configuration above will not be shown in the tree because all data just has "PTB" and "OW" (shown as "Opp. Water") as qualifiers:


Change qualifier labels

When using the (right click) context menu in the qualifier tree it is possible to change the labels of the qualifiers by making a selection of the attributes.

A label picker window will pop up where all attributes of the qualifiers can be selected. Multiple can be selected in any order, if a qualifier does not have that attribute defined it is skipped, when multiple a chosen all beyond the first will be surrounded by brackets. The qualifiers will be order alphabetically on their complete label.

After picking new labels the qualifier tree has to be rebuild and it will reopen the tree at the last part of the tree that was clicked.

Selections

Before the label all qualifiers have a checkbox which indicates whether they should be taken into account for time series selection. In the next example for each selected qualifier one time series is found so they wil appear in the time series display.

Selecting multiple qualifiers within a groups results in selecting more time series:

But selecting qualifiers over different groups results in selecting less time series:

Qualifier summation

The icon of a qualifier node indicates what kind of time series selection should be made. The folder icon as shown in the picture above means show all time series separate.

The icon can be clicked to change to a summation icon which will result in a summation of all time series that only differ on a qualifier within that group. Those time series will be replaced by 1 time series which contains the total value of the summation. A total will appear as 1 time series in the Time Series Dialog:

Qualifier Aggregation

Within a time series set qualifierAggregation can be specified, this combines all time series that have the (in the same time series set) specified qualifiers together to one time series. Aggregation can be done by sum, mean, min or max.