RINEX File Header/Data Editing¶
RINEX file header editing can be invoked by providing a configuration file for the header manipulations to be done. It has to be specified via the -crux command line parameter providing the configuration file name.
There are two modes available: * Header editing as part of other operations on the input RINEX file. * Header editing only. Only the header input, editing and check are performed, but the data part is simply copied as it is.
In the following examples, the configuration file header_crux.txt is used.
Header Editing (Standard)¶
Header Editing (Only)¶
For the editing only mode one has to use the -hded
option in addition.
An additional epoch and station identifier have to be given if no standard RINEX file names are used. If no additional information provided, the MARKER NAME and the first data epoch is used if it exists. This information is needed to extract the right header editing information from the overall configuration information.
gfzrnx -finp file.rnx -fout file.rnx_hded -crux header_crux.txt -hded -epo_beg 2015234_000000 \
-site POTS
gfzrnx -finp file.rnx -fout file.rnx_hded -crux header_crux.txt -hded -epo_beg 2015234_000000 \
-site POTS00DEU
Editing Operations¶
The following operations are supported: * Update single elements of an existing header line (label) * Insert single elements of a non-existing header line (label) * Update (insert) a complete header line or multiple header lines per label * Common string replacement in a string- or regular expression mode * Renaming of PRN in the header and data part * Renaming of OBS types in the header par * Station-, data type- and epoch interval-dependent settings in a single configuration file are possible
Show Config. File Interpretation ( -show_crux
)¶
Due to the variety of input options, one can check how the configuration is interpreted in the program. It can be used as a kind of check via the -show_crux option before the real use.
The default header edit settings are shown via:
Configuration file¶
Formally there are 3 major modes: update_insert, replace or rename delimited by colon.
In case of rename a type (prn|obs) has to be given additionally. The mode definition line has to be followed by an optional data type identifier string (OMN Obs., Met., Nav.) delimited with a hyphen, an optional epoch interval delimited by a hyphen, and a valid station identifier (4- or 9-char.) or dot-separated list of station identifiers delimited by a colon. Now the editing definitions can follow.
Update_insert :
#--------------
[OMN-][YYYYMMDD:HHMMSS YYYYMMDD:HHMMSS-] ALL:
...
[OMN-][YYYYDDD:SSSSS YYYYDDD:SSSSS-] STA1[.STA2[.STA3...] :
[OMN-][YYYYDDD:SSSSS YYYYDDD:SSSSS-] STA1MRCCC[.STA2MRCCC[.STA3MRCCC...] :
...
Replace :
#--------
[OMN-][YYYYMMDD:HHMMSS YYYYMMDD:HHMMSS-] ALL:
...
[OMN-][YYYYDDD:SSSSS YYYYDDD:SSSSS-] STA1[.STA2[.STA3...]:
...
Every rename setting has to be done completely on a single line using the following syntax:
Rename : prn
#--------
[ON-][YYYYMMDD:HHMMSS YYYYMMDD:HHMMSS-] - <prn-from> - <prn-to> : ALL
[ON-][YYYYDDD:SSSSS YYYYDDD:SSSSS-] - <prn-from> - <prn-to> : STA1[.STA2[.STA3...]
[ON-][YYYYDDD:SSSSS YYYYDDD:SSSSS-] - <prn-from> - <prn-to> : STA1MRCCC[.STA2MRCCC[.STA3MRCCC...]
Rename : obs
#--------
[OM][YYYYMMDD:HHMMSS YYYYMMDD:HHMMSS-] <obs-from> - <obs-to> - <sat.sys> : ALL
[OM][YYYYDDD:SSSSS YYYYDDD:SSSSS-] <obs-from> - <obs-to> - <sat.sys> : STA1[.STA2[.STA3...]
[OM][YYYYDDD:SSSSS YYYYDDD:SSSSS-] <obs-from> - <obs-to> - <sat.sys> : STA1MRCCC[.STA2MRCCC[.STA3MRCCC...]
The following rules have to be taken into account:
- Comment lines have to begin with #
- The file name station identifier has to be used for the station name. Currently, only the 4 characters station identifier is supported (RINEX-2 file naming)
- For non-specific station definitions, the ALL station identifier can be used
- Omitting the data types identifier extends the validity to all supported data types (OMN)
- Omitting the epoch interval leads to an overall validity
- Station-dependent settings overwrite non-specific ALL settings
- Overlapping epoch intervals for the same header label and station lead to an error
- The date of the epoch interval can be given either as YYYYDDD (year, day of year) or YYYYMMDD (year, month, day of month)
- The time of the epoch interval can be given as SSSSS (second of day 0-86399) or HHMMSS ( hour, minute, second )
- Unlimited begin or end of an epoch interval can be given using zeros in the date and time values (e.g. 0000000:000000)
See also the examples below.
Update - Single Header Element¶
Single header element update/insert can be done by providing the label in double quotes, "+" an optional time interval, ":" and the list of index-value pairs enclosed in curly brackets. Every definition should cover only one line!
"<label>" [+ YYYYMMDD:HHMMSS YYYYMMDD:HHMMSS ] : { k: "<value>", [ [ l: "<value>" ], ... ] }
"<label>" [+ YYYYDDD:HHMMSS YYYYDDDD:HHMMSS ] : { k: "<value>", [ [ l: "<value>" ], ... ] }
"<label>" [+ YYYYDDD:SSSSS YYYYDDDD:SSSSS ] : { k: "<value>", [ [ l: "<value>" ], ... ] }
...
indexes k,l,... = 0,1,...
See some examples below:
update_insert :
#--------------
O - POTS.OUST.WINT:
"REC # / TYPE / VERS" : { 1 : "TRIMBLE NETR9" }
O - 2015209:00000 0000000:00000 - MIZT00JPN:
"APPROX POSITION XYZ" : { 0: "-3857167.6484", 1: "3108694.9138", 2: "4004041.6876" }
"ANTENNA: DELTA H/E/N" : { 0: "0.1209", 1: "0.0008", 2: "0.0007" }
O - POTS00DEU:
"OBSERVER / AGENCY" + 0000000:00000 2013126:86399 : { 0:"automatic", 1:"GFZ" }
"OBSERVER / AGENCY" + 2013127:00000 0000000:00000 : { 0:"gfz", 1:"GFZ/IHL" }
-
Multi-string elements in the index-value pairs have to be enclosed with double quotes. Please make sure that the given values don't exceed the element's format length!
-
The first header element is at index 0
-
The site name used to search for site-dependent settings in the loaded crux information is extracted from the standard RINEX-2 or 3 input file name. In case of wrong or non-standard input file names or in pipe environments, the site name has to be provided via the
-site
command line parameter. The-site
parameter overwrites any otherwise derived site name in general.
Supported String Substitutes¶
The following variable string substitutes are supported to be used via crux single header elements updates and added COMMENT lines. To be more independent of OS-derived values, the following environment variables are used with a higher preference if existing.
Substitute String | Substitute/Example | Description | Environment variables |
---|---|---|---|
uSeR | nisn | user name provided by os | USERNAME, USER |
pRoGrAm | gfzrnx-1.08-8003 | gfzrnx-version-revision | |
hOsTnAmE | serv01 | simple hostname provided by os | HOSTNAME |
hOsTdOmAiNnAmE | serv01.gfz-potsdam.de | fully qualified hostname provided by os | HOSTFQDN |
dOmAiNnAmE | gfz-potsdam.de | domain name provided by os | USERDOMAIN |
tImEsTaMp | 20170712 113126 UTC | time stamp of current time |
Warning
Please check in advance if you get the expected results for your operating system!
update_insert :
#---
MNO - ALL:
"COMMENT" : "PG tImEsTaMp pRoGrAm uSeR@dOmAiNnAmE"
"PGM / RUN BY / DATE" : { 0: "pRoGrAm" , 1: "uSeR@dOmAiNnAmE", 2: "tImEsTaMp" }
For the upper configuration, the "PGM / RUN BY / DATE" record will be updated and the "COMMENT" record below will be added:
PG 20170712 120203 UTC gfzrnx-1.08-7179 nisn@gfz-potsdam.de COMMENT
gfzrnx-1.08-7179 nisn@gfz-potsdam.de 20170713 065255 UTC PGM / RUN BY / DATE
If the "COMMENT" string gets longer than 60 characters, it will be cut to 60!
Update - Multi Header¶
Multiple header elements like the "SENSOR MOD/TYPE/ACC" or "SENSOR POS XYZ/H" for meteo data need an additional condition (here the sensor identifiers TD, PR, HR,...). An additional "+ column_number:value" pair has to be added to the label and optional epoch interval information. The column counter starts with 0. Here is a crux example block.
"<label>" [+ YYYYMMDD:HHMMSS YYYYMMDD:HHMMSS ] i:"CC" : { k:"<value>", [ [ l:"<value> ],..] }
"<label>" [+ YYYYDDD:HHMMSS YYYYDDDD:HHMMSS ] i:"CC" : { k:"<value>", [ [ l:"<value> ],..] }
"<label>" [+ YYYYDDD:SSSSS YYYYDDDD:SSSSS ] i:"CC" : { k:"<value>", [ [ l:"<value> ],..] }
indexes i,k,l,... = 0,1,...
CC = condition string
Here is a crux example block.
update_insert :
#-----
M - 2015209:00000 0000000:00000 - ALL :
"SENSOR MOD/TYPE/ACC" + 3:"TD" : { 0:"Vaisala", 1:"PTU 303/5.14", 2:"0.10" }
"SENSOR MOD/TYPE/ACC" + 3:"PR" : { 0:"Vaisala", 1:"PTU 303/5.14", 2:"0.05" }
"SENSOR MOD/TYPE/ACC" + 3:"HR" : { 0:"Vaisala", 1:"PTU 303/5.14", 2:"1.7" }
"SENSOR MOD/TYPE/ACC" + 3:"XX" : { 0:"XXXXXXX", 1:"XXX 125", 2:"1.0" }
M - POTS00DEU :
"SENSOR POS XYZ/H" + 4:"TD" : { 0:"3275753.9120", 1:"321110.8651", 2:"5445041.8829", 3:"5" }
"SENSOR POS XYZ/H" + 4:"PR" : { 0:"3275753.9120", 1:"321110.8651", 2:"5445041.8829", 3:"5" }
"SENSOR POS XYZ/H" + 4:"HR" : { 0:"3275753.9120", 1:"321110.8651", 2:"5445041.8829", 3:"5" }
"SENSOR POS XYZ/H" + 4:"XX" : { 0:"3275753.9120", 1:"321110.8651", 2:"5445041.8829", 3:"5" }
If an element is not found, it will be added (see the "XX" sensor).
See below a small example of a header manipulation with the initial header and the manipulation result.
pots3410.15m
2.11 METEOROLOGICAL DATA RINEX VERSION / TYPE
TPP 3.1 2015-12-07 00:01:03 PGM / RUN BY / DATE
pots MARKER NAME
3 TD HR PR # / TYPES OF OBSERV
Paroscientific Model 760 0.1 TD SENSOR MOD/TYPE/ACC
Paroscientific Model 760 2.0 HR SENSOR MOD/TYPE/ACC
Paroscientific Model 760 0.1 PR SENSOR MOD/TYPE/ACC
3275756.3423 321111.4422 5445046.8829 0.0000 TD SENSOR POS XYZ/H
3275756.3423 321111.4422 5445046.8829 0.0000 HR SENSOR POS XYZ/H
3275756.3423 321111.4422 5445046.8829 0.0000 PR SENSOR POS XYZ/H
END OF HEADER
pots3410.15m_new
3.03 METEOROLOGICAL DATA RINEX VERSION / TYPE
TPP 3.1 2015-12-07 00:01:03 COMMENT
RINEX_DB.pm GFZ FILE CONVERSION 20150807 14:32:19UTCPGM / RUN BY / DATE
pots MARKER NAME
Vaisala PTU 303/5.14 0.1 TD SENSOR MOD/TYPE/ACC
Vaisala PTU 303/5.14 1.7 HR SENSOR MOD/TYPE/ACC
Vaisala PTU 303/5.14 0.1 PR SENSOR MOD/TYPE/ACC
3275753.9120 321110.8651 5445041.8829 5.0000 TD SENSOR POS XYZ/H
3275753.9120 321110.8651 5445041.8829 5.0000 HR SENSOR POS XYZ/H
3275753.9120 321110.8651 5445041.8829 5.0000 PR SENSOR POS XYZ/H
XXXXXXX XXX 125 1.0 XX SENSOR MOD/TYPE/ACC
3275753.9120 321110.8651 5445041.8829 5.0000 XX SENSOR POS XYZ/H
3 HR PR TD # / TYPES OF OBSERV
END OF HEADER
Proposed Use¶
There are several possibilities to organize the header editing configuration file. The clearest form would be to organize it per station. Below you can find a configuration example for the single station POTS covering the whole station history information for Observation and Meteo file header entries.
update_insert:
OM - POTS:
"APPROX POSITION XYZ" : { 0:"3800689.6341", 1:"882077.3857", 2:"5028791.3179" }
"MARKER NAME" : { 0:"POTS" }
"MARKER NUMBER" : { 0:"14106M003" }
"OBSERVER / AGENCY" : { 0:"GFZ", 1:"GFZ" }
"REC # / TYPE / VERS" + 1994274:00000 1996015:86340 : { 0:"289", 1:"ROGUE SNR-8000", ...}
"REC # / TYPE / VERS" + 1996016:49680 1996151:28380 : { 0:"279", 1:"ROGUE SNR-8000", ...}
"REC # / TYPE / VERS" + 1996151:28860 1999231:00000 : { 0:"289", 1:"ROGUE SNR-8000", ...}
"REC # / TYPE / VERS" + 1999232:00000 2000232:00000 : { 0:"281", 1:"AOA SNR-8000 ACT", ...}
"REC # / TYPE / VERS" + 2000233:00000 2009089:00000 : { 0:"281-U",1:"AOA SNR-8000 ACT", ...}
"REC # / TYPE / VERS" + 2009089:00000 2011046:61200 : { 0:"1358", 1:"SEPT POLARX2", ...}
"REC # / TYPE / VERS" + 2011046:61200 2011307:52200 : { 0:"205", 1:"JAVAD TRE_G3TH DELTA",...}
"REC # / TYPE / VERS" + 2011307:52200 2011354:38280 : { 0:"205", 1:"JAVAD TRE_G3TH DELTA",...}
"REC # / TYPE / VERS" + 2011354:38280 2012164:32400 : { 0:"205", 1:"JAVAD TRE_G3TH DELTA",...}
"REC # / TYPE / VERS" + 2012164:32400 2013009:36720 : { 0:"205", 1:"JAVAD TRE_G3TH DELTA",...}
"REC # / TYPE / VERS" + 2013009:36780 2015258:50280 : { 0:"205", 1:"JAVAD TRE_G3TH DELTA",...}
"REC # / TYPE / VERS" + 2015258:50280 0000000:00000 : { 0:"205", 1:"JAVAD TRE_G3TH DELTA",...}
"ANT # / TYPE" + 1994301:00000 1995276:28800 : { 0:"261", 1:"AOAD/M_T", 2:"NONE" }
"ANT # / TYPE" + 1995276:28800 2009105:47700 : { 0:"235", 1:"AOAD/M_T", 2:"NONE" }
"ANT # / TYPE" + 2009105:47700 2011046:61200 : { 0:"354-U",1:"AOAD/M_T", 2:"NONE" }
"ANT # / TYPE" + 2011046:61200 0000000:00000 : { 0:"316", 1:"JAV_RINGANT_G3T",2:"NONE" }
"ANTENNA: DELTA H/E/N"+ 1994301:00000 1995276:28800 : { 0:"0.046", 1:"0", 2:"0" }
"ANTENNA: DELTA H/E/N"+ 1995276:28800 2009105:47700 : { 0:"0.046", 1:"0", 2:"0" }
"ANTENNA: DELTA H/E/N"+ 2009105:47700 2011046:61200 : { 0:"0.046", 1:"0", 2:"0" }
"ANTENNA: DELTA H/E/N"+ 2011046:61200 0000000:00000 : { 0:"0.121", 1:"0", 2:"0" }
"SENSOR MOD/TYPE/ACC" + 1996254:00000 2006011:00000 + 3:"PR" : { 0:"Vaisala", 1:"PTB100B",... }
"SENSOR MOD/TYPE/ACC" + 2006011:00000 0000000:00000 + 3:"PR" : { 0:"Vaisala", 1:"PTU200", ... }
"SENSOR MOD/TYPE/ACC" + 1996254:00000 2006011:00000 + 3:"HR" : { 0:"Timetech",1:"HC 500", ... }
"SENSOR MOD/TYPE/ACC" + 2006011:00000 0000000:00000 + 3:"HR" : { 0:"Vaisala", 1:"HMP45A-P",.. }
"SENSOR MOD/TYPE/ACC" + 1996254:00000 2006011:00000 + 3:"TD" : { 0:"Timetech",1:"PT100", ... }
"SENSOR MOD/TYPE/ACC" + 2006011:00000 0000000:00000 + 3:"TD" : { 0:"Vaisala", 1:"HMP45A-P",.. }
Depending on the first data epoch the appropriate header entry is updated.
Remark
There is one exception concerning the RINEX header fields manipulation. According to IGS antenna definition (number, antenna + radome) the "ANT # / TYPE" record consists of 3 columns, which is a deviation from the RINEX standard.
This means the standard (A20,A20) RINEX definition is in gfzrnx handled as (A20,A16,A4). A correction record should be of the following form:
Complete Header Line(s) Update¶
For a single line definition, one has to give the label name in double quotes followed by an "+" optional epoch interval string followed by a colon and the 60 char. string to be updated or inserted. The multi-line definition has to be enclosed in square brackets as a comma-separated list of 60 char. strings with one string per line. The square brackets have to be given on the first ([) and last (]) 60 char. string definition line.
"<label>" [+ YYYYMMDD:HHMMSS YYYYMMDD:HHMMSS ] : [ "<60-char. string>",
"<60-char. string>",
...
"<60-char. string>" ]
update_insert :
#--------------
O - 2015010:00000 0000000:00000 - POTS00DEU:
"OBSERVER / AGENCY" : "Automatic Deutsches GeoForschungsZentrum (GFZ) "
"SYS / PHASE SHIFT" : [ "G L1C 0.00000 ",
"J L1C 0.00000 ",
"J L1X 0.25000 ",
"E L1X 0.00000 ",
"C L7I 0.00000 ",
"R L1P 0.25000 ",
"R L2C 0.00000 ",
"R L2P 0.25000 ",
"G L2X -0.25000 ",
"G L5X 0.00000 " ]
Please keep in mind that an already existing header label content is completely removed. Only COMMENT header lines are appended.
Remark
COMMENT lines are inserted only
Header Label Independent String Replacement¶
For the string replacement, the major mode replace has to be used. One has to define the station identifier as before. Afterward, you can define from/to pairs of type regexp or string. The regular expression syntax follows Perl syntax. Each pair element (from/to) should be given on a separate line. The example below shows how to correct an erroneous label name.
replace :
#--------
ALL:
regexp_from : "^(.{60})PGM\s*/\s*RUN\s*BY\s*/\s*DATE\s*$"
regexp_to : "$1PGM / RUN BY / DATE"
ALL:
string_from : "PGM/RUN BY/DATE"
string_to : "PGM / RUN BY / DATE"
To remove single header label lines on input use an empty regexp_to (""). To remove all COMMENT lines use:
To remove lines containing the string "ABC DEF" use:
Rename - PRNs¶
If raw data conversion programs don't assign the right PRN, this can be changed via the "rename: PRN" mode. Here is the crux configuration syntax:
Here are some examples:
rename: prn
#----------
ON - 20140105:000000 20150101:000000 - E51 - E01: ALL
ON - 20140105:000000 00000000:000000 - E52 - E02 : ABC1.ABC2.ABC3
E51 - E01 : ALL
E52 - E02 : ALL
Rename - OBS types¶
rename: obs
#----------
20140105:000000 20150101:000000 - L2X - L2L - G : ABCD
20140105:000000 20150101:000000 - L2L - L2X - G : ABCD
20140105:000000 20150101:000000 - *2* - *1* - C : ALL
20140105:000000 20150101:000000 - *2 - *1 - C : ALL
20140105:000000 20150101:000000 - **X - **L - C : ALL
20140105:000000 20150101:000000 - *2 - *1 - C : ALL
20140105:000000 20150101:000000 - **X - **L - G04.G08 : ALL
20140105:000000 20150101:000000 - *2 - *1 - G04.G08 : ALL
*2* - *1* - C : ALL
*2 - *1 - C : ALL
Remark
You can use 9-char. station names in crux-config-file for the handling of 4-char. station names too! The replace mode is done directly on input, the update_insert and rename modes are done after the whole header has been read.
Header edit via command line ( -cx_updins
)¶
Single update_insert header edit options can also be provided via command line using the -cx_updins
command line parameter, providing a list of edit options. The site definition has to be given before the header label change option.
See an example below Unix:
gfzrnx -finp /data1/VALD00CAN_R_20181001200_01H_30S_MO.rnx \
-fout /data1/VALD00CAN_R_20181001200_01H_30S_MO.rnx.hded -hded -cx_updins \
'O - VALD: "APPROX POSITION XYZ" : { 0:"3800689.6341", 1:"882077.3857", 2:"5028791.3179" }' \
'O - VALD: "REC # / TYPE / VERS" : { 0 : "", 1 : "JAVAD TRE_G3TH DELTA", 2 : "3.6.3 Jul,01,2017" }'
See an example below Windows (swapped single and double quotes):
gfzrnx -finp /data1/VALD00CAN_R_20181001200_01H_30S_MO.rnx \
-fout /data1/VALD00CAN_R_20181001200_01H_30S_MO.rnx.hded -hded -cx_updins \
"O - VALD: "APPROX POSITION XYZ" : { 0:'3800689.6341', 1:'882077.3857', 2:'5028791.3179' }" \
"O - VALD: "REC # / TYPE / VERS" : { 0 : '', 1 : 'JAVAD TRE_G3TH DELTA', 2 : '3.6.3 Jul,01,2017' }"
Remark
Please pay attention to the different single/double quote usage on Windows- and Unix-based operating systems.
Please check in advance with -show_crux
the acceptance of your header edit options due to the mixture of different quotation marks after -cx_updins
.
gfzrnx -show_crux -cx_updins \
'O - VALD: "APPROX POSITION XYZ" : { 0:"3800689.6341", 1:"882077.3857", 2:"5028791.3179" }' \
'O - VALD: "REC # / TYPE / VERS" : { 0 : "", 1 : "JAVAD TRE_G3TH DELTA", 2 : "3.6.3 Jul,01,2017" }'
Remark
COMMENT lines are inserted only
Internal/Data Headers via crux-file ( -cx_addinthd
)¶
Metadata changes following e.g. hardware changes can be introduced at the event epochs into the data part of a RINEX file if information is found in the crux-file. This mechanism can be activated additionally to the normal header edit operations via the -cx_addinthd
command line parameter for update_insert crux-settings.
Here is an example:
The following crux-configuration
update_insert:
O - 20141105:071700 20180417:060500 - OBWT:
"REC # / TYPE / VERS" : { 0: "4831K57521", 1: "TRIMBLE NETR5", 2: "Nav 4.87 / Boot 4.18"}
"ANT # / TYPE" : { 0: "30767802", 1: "TRM55971.00", 2: "TZGD"}
O - 20180417:061500 00000000:000000 - OBWT:
"REC # / TYPE / VERS" : { 0: "1705310", 1: "LEICA GR30", 2: "4.20.232"}
"ANT # / TYPE" : { 0: "09440002", 1: "LEIAR25.R3", 2: "LEIT" }
will lead to file header records of e.g.:
4831K57521 TRIMBLE NETR5 Nav 4.87 / Boot 4.18REC # / TYPE / VERS
30767802 TRM55971.00 TZGD ANT # / TYPE
and a header block in the data part of a RINEX-2 file of:
23913577.070 127921488.413 6 99494529.138 8 23913582.523 42.100
33.300
23773818.648 127129528.196 4 38.700
18 04 17 06 15 00.0000000 4 2
1705310 LEICA GR30 4.20.232 REC # / TYPE / VERS
09440002 LEIAR25.R3 LEIT ANT # / TYPE
18 04 17 06 15 00.0000000 0 16G02G05G07G09G13G27G28G30R06R07R08R09
R10R16R23R24
24247477.484 127421298.588 6 99289349.307 6 24247479.359 42.200
25.500
21028794.141 110507030.196 7 86109402.765 9 21028797.266 49.300
Remark
Windows users should swap single and double quotes using -cx_addinthd
similar to -cx_updins
command line options.
Manipulate Header Version Number ( -vnum
)¶
By default, the latest supported version number is used for the "RINEX VERSION / TYPE" header element, and there are made manipulations to fit this version. If a special version number is needed (for whatever reason) one can use the -vnum
command line parameter to manipulate the version number to a certain value.
This will change the default output header value e.g. 3.04 to the wished value of 3.03.
Remark
The -vnum
version number change is only a formal exchange of the version number to meet any conditions of external software. The file content will be still conform to the highest supported version number!