예제 #1
0
def load(h):

    h.add(_.Section_length('section4Length', 3))
    h.add(_.Unsigned('reserved1', 1))
    h.add(_.Codeflag('missingDataFlag', 1, "grib1/1.table"))
    h.add(_.Unsigned('numberOfBytesPerInteger', 1))
    h.add(_.Unsigned('reserved', 2))
    h.add(_.Unsigned('numberOfCharacters', 3))
    h.alias('numberOfChars', 'numberOfCharacters')
    h.add(_.Unsigned('numberOfFloats', 3))
    h.add(_.Unsigned('numberOfIntegers', 3))
    h.alias('numberOfInts', 'numberOfIntegers')
    h.add(_.Unsigned('numberOfLogicals', 3))
    h.add(_.Unsigned('numberOfReservedBytes', 3))
    h.add(_.Unsigned('reserved', 4))
    h.add(_.Unsigned('reserved', 4))
    h.add(_.Unsigned('reserved', 1))
    h.add(_.Ibmfloat('floatValues', 4, _.Get('numberOfFloats')))
    h.alias('floatVal', 'floatValues')

    if h.get_l('numberOfIntegers'):
        h.add(_.Signed('integerValues', 4, _.Get('numberOfIntegers')))

    if h.get_l('numberOfCharacters'):
        h.add(_.StringUnsigned('charValues', 1, _.Get('numberOfCharacters')))

    h.add(_.Section_padding('padding'))
예제 #2
0
def load(h):

    h.add(_.Label('CPTEC local definition'))
    h.add(
        _.Codetable('localDefinitionNumber', 1,
                    "grib1/localDefinitionNumber.7.table"))
    _.Template('grib1/local.7.[localDefinitionNumber:l].def').load(h)
    h.add(_.Section_padding('local_padding'))
예제 #3
0
def load(h):

    h.add(_.Position('offsetSection3'))
    h.add(_.Section_length('section3Length', 3))
    h.add(_.Section_pointer('section3Pointer', _.Get('offsetSection3'), _.Get('section3Length'), 3))
    h.add(_.Unsigned('numberOfUnusedBitsAtEndOfSection3', 1))
    h.alias('unusedBitsInBitmap', 'numberOfUnusedBitsAtEndOfSection3')
    h.add(_.Unsigned('tableReference', 2))
    h.add(_.Position('offsetBeforeBitmap'))
    h.add(_.G1bitmap('bitmap', _.Get('tableReference'), _.Get('missingValue'), _.Get('offsetSection3'), _.Get('section3Length'), _.Get('numberOfUnusedBitsAtEndOfSection3')))
    h.alias('geography.bitmap', 'bitmap')
    h.add(_.Position('offsetAfterBitmap'))
    h.add(_.Padtoeven('padding_sec3_1', _.Get('offsetSection3'), _.Get('section3Length')))
    h.add(_.Section_padding('section3Padding'))
    h.add(_.Md5('md5Section3', _.Get('offsetSection3'), _.Get('section3Length')))
예제 #4
0
def load(h):

    h.add(_.Position('offsetSection2'))
    h.add(_.Section_length('section2Length', 4))
    h.add(
        _.Section_pointer('section2Pointer', _.Get('offsetSection2'),
                          _.Get('section2Length'), 2))
    h.add(_.Unsigned('numberOfSection', 1))
    h.alias('tiggeSuiteID', 'zero')
    h.add(_.Transient('addEmptySection2', 0))

    if (h.get_l('addEmptySection2') == 0):

        if ((h.get_l('grib2LocalSectionPresent') == 1)
                or ((h.get_l('section2Length') > 5) or h._new())):
            h.alias('section2Used', 'one')

            if ((h.get_l('productionStatusOfProcessedData') == 4)
                    or (h.get_l('productionStatusOfProcessedData') == 5)):
                h.add(
                    _.Codetable('tiggeLocalVersion', 2,
                                "grib2/tiggeLocalVersion.table"))
                _.Template('grib2/local.tigge.[tiggeLocalVersion:l].def').load(
                    h)

            if ((h.get_l('productionStatusOfProcessedData') == 10)
                    or (h.get_l('productionStatusOfProcessedData') == 11)):
                h.add(
                    _.Codetable('crraLocalVersion', 2,
                                "grib2/crraLocalVersion.table"))
                _.Template('grib2/local.crra.[crraLocalVersion:l].def').load(h)

            h.add(
                _.Codetable(
                    'grib2LocalSectionNumber', 2,
                    "grib2/grib2LocalSectionNumber.[centreForLocal:l].table"))

            if (h.get_l('grib2LocalSectionNumber') != 0):
                _.Template('grib2/local.[centreForLocal:l].def', True).load(h)
            else:
                h.add(_.Constant('deleteLocalDefinition', 1))

            h.add(_.Position('offsetAfterCentreLocalSection'))

    h.add(_.Section_padding('section2Padding'))
예제 #5
0
def load(h):

    h.add(_.Constant('gridDescriptionSectionPresent', 1))
    h.add(_.Position('offsetSection3'))
    h.add(_.Section_length('section3Length', 4))
    h.add(
        _.Section_pointer('section3Pointer', _.Get('offsetSection3'),
                          _.Get('section3Length'), 3))
    h.add(_.Unsigned('numberOfSection', 1))
    h.add(
        _.Codetable('sourceOfGridDefinition', 1, "3.0.table",
                    _.Get('masterDir'), _.Get('localDir')))
    h.add(_.Unsigned('numberOfDataPoints', 4))
    h.alias('numberOfPoints', 'numberOfDataPoints')
    h.add(_.Unsigned('numberOfOctectsForNumberOfPoints', 1))
    h.add(
        _.Codetable('interpretationOfNumberOfPoints', 1, "3.11.table",
                    _.Get('masterDir'), _.Get('localDir')))

    if (h.get_l('numberOfOctectsForNumberOfPoints') == 0):
        h.add(_.Transient('PLPresent', 0))
    else:
        h.add(_.Transient('PLPresent', 1))

    h.add(
        _.Codetable('gridDefinitionTemplateNumber', 2, "3.1.table",
                    _.Get('masterDir'), _.Get('localDir')))
    h.add(
        _.Codetable_title('gridDefinitionDescription',
                          _.Get('gridDefinitionTemplateNumber')))
    h.alias('isRotatedGrid', 'zero')
    _.Template('grib2/template.3.[gridDefinitionTemplateNumber:l].def').load(h)

    if h.get_l('PLPresent'):

        if (h.get_l('numberOfOctectsForNumberOfPoints') == 1):
            h.add(_.Unsigned('pl', 1, _.Get('Nj')))

        if (h.get_l('numberOfOctectsForNumberOfPoints') == 2):
            h.add(_.Unsigned('pl', 2, _.Get('Nj')))

        if (h.get_l('numberOfOctectsForNumberOfPoints') == 3):
            h.add(_.Unsigned('pl', 3, _.Get('Nj')))

        h.alias('geography.pl', 'pl')

    pass  # when block
    h.add(_.Section_padding('section3Padding'))

    def gridType_inline_concept(h):
        def wrapped(h):

            gridDefinitionTemplateNumber = h.get_l(
                'gridDefinitionTemplateNumber')
            PLPresent = h.get_l('PLPresent')

            if gridDefinitionTemplateNumber == 0 and PLPresent == 0:
                return 'regular_ll'

            if gridDefinitionTemplateNumber == 0 and PLPresent == 1:
                return 'reduced_ll'

            if gridDefinitionTemplateNumber == 1 and PLPresent == 0:
                return 'rotated_ll'

            if gridDefinitionTemplateNumber == 2 and PLPresent == 0:
                return 'stretched_ll'

            if gridDefinitionTemplateNumber == 3 and PLPresent == 0:
                return 'stretched_rotated_ll'

            if gridDefinitionTemplateNumber == 10 and PLPresent == 0:
                return 'mercator'

            if gridDefinitionTemplateNumber == 12 and PLPresent == 0:
                return 'transverse_mercator'

            if gridDefinitionTemplateNumber == 20 and PLPresent == 0:
                return 'polar_stereographic'

            if gridDefinitionTemplateNumber == 30 and PLPresent == 0:
                return 'lambert'

            if gridDefinitionTemplateNumber == 31 and PLPresent == 0:
                return 'albers'

            if gridDefinitionTemplateNumber == 40 and PLPresent == 0:
                return 'regular_gg'

            numberOfOctectsForNumberOfPoints = h.get_l(
                'numberOfOctectsForNumberOfPoints')
            iDirectionIncrementGiven = h.get_l('iDirectionIncrementGiven')
            numberOfPointsAlongAParallel = h.get_l(
                'numberOfPointsAlongAParallel')

            if gridDefinitionTemplateNumber == 40 and PLPresent == 1 and numberOfOctectsForNumberOfPoints == 2 and iDirectionIncrementGiven == 0 and numberOfPointsAlongAParallel == h._missing(
            ):
                return 'reduced_gg'

            if gridDefinitionTemplateNumber == 41 and PLPresent == 0:
                return 'rotated_gg'

            if gridDefinitionTemplateNumber == 41 and PLPresent == 1 and numberOfOctectsForNumberOfPoints == 2 and iDirectionIncrementGiven == 0 and numberOfPointsAlongAParallel == h._missing(
            ):
                return 'reduced_rotated_gg'

            if gridDefinitionTemplateNumber == 42 and PLPresent == 0:
                return 'stretched_gg'

            if gridDefinitionTemplateNumber == 42 and PLPresent == 1 and numberOfOctectsForNumberOfPoints == 2 and iDirectionIncrementGiven == 0 and numberOfPointsAlongAParallel == h._missing(
            ):
                return 'reduced_stretched_gg'

            if gridDefinitionTemplateNumber == 43 and PLPresent == 0:
                return 'stretched_rotated_gg'

            if gridDefinitionTemplateNumber == 43 and PLPresent == 1 and numberOfOctectsForNumberOfPoints == 2 and iDirectionIncrementGiven == 0 and numberOfPointsAlongAParallel == h._missing(
            ):
                return 'reduced_stretched_rotated_gg'

            if gridDefinitionTemplateNumber == 41 and PLPresent == 0:
                return 'regular_rotated_gg'

            if gridDefinitionTemplateNumber == 42 and PLPresent == 0:
                return 'regular_stretched_gg'

            if gridDefinitionTemplateNumber == 43 and PLPresent == 0:
                return 'regular_stretched_rotated_gg'

            if gridDefinitionTemplateNumber == 50 and PLPresent == 0:
                return 'sh'

            if gridDefinitionTemplateNumber == 51 and PLPresent == 0:
                return 'rotated_sh'

            if gridDefinitionTemplateNumber == 52 and PLPresent == 0:
                return 'stretched_sh'

            if gridDefinitionTemplateNumber == 53 and PLPresent == 0:
                return 'stretched_rotated_sh'

            if gridDefinitionTemplateNumber == 90 and PLPresent == 0:
                return 'space_view'

            if gridDefinitionTemplateNumber == 100 and PLPresent == 0:
                return 'triangular_grid'

            if gridDefinitionTemplateNumber == 101 and PLPresent == 0:
                return 'unstructured_grid'

            if gridDefinitionTemplateNumber == 110 and PLPresent == 0:
                return 'equatorial_azimuthal_equidistant'

            if gridDefinitionTemplateNumber == 120 and PLPresent == 0:
                return 'azimuth_range'

            if gridDefinitionTemplateNumber == 130 and PLPresent == 0:
                return 'irregular_latlon'

            if gridDefinitionTemplateNumber == 140 and PLPresent == 0:
                return 'lambert_azimuthal_equal_area'

            if gridDefinitionTemplateNumber == 1000 and PLPresent == 0:
                return 'cross_section'

            if gridDefinitionTemplateNumber == 1100 and PLPresent == 0:
                return 'Hovmoller'

            if gridDefinitionTemplateNumber == 1200 and PLPresent == 0:
                return 'time_section'

            if gridDefinitionTemplateNumber == 33 and PLPresent == 0:
                return 'lambert_lam'

            if gridDefinitionTemplateNumber == 13 and PLPresent == 0:
                return 'mercator_lam'

            if gridDefinitionTemplateNumber == 23 and PLPresent == 0:
                return 'polar_stereographic_lam'

            if gridDefinitionTemplateNumber == 63 and PLPresent == 0:
                return 'lambert_bf'

            if gridDefinitionTemplateNumber == 61 and PLPresent == 0:
                return 'mercator_bf'

            if gridDefinitionTemplateNumber == 62 and PLPresent == 0:
                return 'polar_stereographic_bf'

            if PLPresent == 0:
                return 'unknown'

            if PLPresent == 1:
                return 'unknown_PLPresent'

        return wrapped

    h.add(_.Concept('gridType', None, concepts=gridType_inline_concept(h)))

    h.alias('ls.gridType', 'gridType')
    h.alias('geography.gridType', 'gridType')
    h.alias('typeOfGrid', 'gridType')
    h.add(
        _.Md5('md5Section3', _.Get('offsetSection3'), _.Get('section3Length')))
    h.alias('md5GridSection', 'md5Section3')
예제 #6
0
def load(h):

    h.add(_.Section_length('section1Length', 3))
    h.add(_.Unsigned('gribTablesVersionNo', 1))
    h.add(_.StringCodetable('centre', 1, "common/c-1.table"))
    h.alias('ls.centre', 'centre')
    h.alias('identificationOfOriginatingGeneratingCentre', 'centre')
    h.add(_.Unsigned('generatingProcessIdentifier', 1))
    h.add(_.Unsigned('gridDefinition', 1))
    h.add(_.Codeflag('flag', 1, "grib1/1.table"))
    h.add(
        _.Codetable('indicatorOfParameter', 1,
                    "grib1/2.[centre:l].[gribTablesVersionNo:l].table"))
    h.add(_.Codetable('indicatorOfTypeOfLevel', 1, "grib1/3.table"))
    h.add(_.Codetable('heightPressureEtcOfLevels', 2, "grib1/3.table"))
    h.alias('ls.levelType', 'indicatorOfTypeOfLevel')
    h.add(_.Unsigned('yearOfCentury', 1))
    h.add(_.Unsigned('month', 1))
    h.add(_.Unsigned('day', 1))
    h.add(_.Unsigned('hour', 1))
    h.add(_.Unsigned('minute', 1))
    h.add(_.Transient('second', 0))
    h.add(
        _.Budgdate('dataDate', _.Get('yearOfCentury'), _.Get('month'),
                   _.Get('day')))
    h.alias('ls.date', 'dataDate')
    h.add(_.Time('dataTime', _.Get('hour'), _.Get('minute'), _.Get('second')))
    h.alias('ls.time', 'dataTime')
    h.add(
        _.Julian_day('julianDay', _.Get('dataDate'), _.Get('hour'),
                     _.Get('minute'), _.Get('second')))
    h.add(_.Codetable('indicatorOfUnitOfTimeRange', 1, "grib1/4.table"))
    h.add(_.Unsigned('periodOfTime', 1))
    h.alias('P1', 'periodOfTime')
    h.add(_.Unsigned('periodOfTimeIntervals', 1))
    h.alias('P2', 'periodOfTimeIntervals')
    h.add(_.Codetable('timeRangeIndicator', 1, "grib1/5.table"))
    h.add(_.TransientCodetable('stepUnits', 1, "grib2/tables/1/4.4.table"))

    def stepType_inline_concept(h):
        def wrapped(h):

            timeRangeIndicator = h.get_l('timeRangeIndicator')

            if timeRangeIndicator == 1:
                return 'instant'

            if timeRangeIndicator == 10:
                return 'instant'

            if timeRangeIndicator == 0:
                return 'instant'

            if timeRangeIndicator == 3:
                return 'avg'

            if timeRangeIndicator == 4:
                return 'accum'

            if timeRangeIndicator == 2:
                return 'max'

            if timeRangeIndicator == 2:
                return 'min'

            if timeRangeIndicator == 5:
                return 'diff'

            if timeRangeIndicator == 2:
                return 'rms'

            if timeRangeIndicator == 2:
                return 'sd'

            if timeRangeIndicator == 2:
                return 'cov'

            if timeRangeIndicator == 2:
                return 'ratio'

        return wrapped

    h.add(_.Concept('stepType', None, concepts=stepType_inline_concept(h)))

    h.add(
        _.G1step_range('stepRange', _.Get('P1'), _.Get('P2'),
                       _.Get('timeRangeIndicator'),
                       _.Get('indicatorOfUnitOfTimeRange'), _.Get('stepUnits'),
                       _.Get('stepType')))
    h.alias('ls.stepRange', 'stepRange')
    h.add(_.Long_vector('startStep', _.Get('stepRange'), 0))
    h.add(_.Long_vector('endStep', _.Get('stepRange'), 1))
    h.add(
        _.G1step_range('stepRangeInHours', _.Get('P1'), _.Get('P2'),
                       _.Get('timeRangeIndicator'),
                       _.Get('indicatorOfUnitOfTimeRange'), _.Get('one'),
                       _.Get('stepType')))
    h.add(_.Long_vector('startStepInHours', _.Get('stepRangeInHours'), 0))
    h.add(_.Long_vector('endStepInHours', _.Get('stepRangeInHours'), 1))
    h.add(_.Constant('paramId', 0))
    h.alias('parameter', 'paramId')
    h.alias('ls.parameter', 'parameter')
    h.add(_.Section_padding('section1Padding'))
예제 #7
0
def load(h):

    h.add(_.Section_length('section4Length', 3))
    h.add(_.Unsigned('reserved1', 1))

    if (h.get_l('reserved1') == 0):
        h.add(_.Codeflag('missingDataFlag', 1, "grib1/1.table"))
        h.add(_.Unsigned('numberOfBytesPerInteger', 1))
        h.add(_.Unsigned('reserved', 2))
        h.add(_.Unsigned('numberOfChars', 3))
        h.add(_.Unsigned('numberOfFloats', 3))
        h.add(_.Unsigned('numberOfIntegers', 3))
        h.alias('numberOfInts', 'numberOfIntegers')
        h.add(_.Unsigned('numberOfLogicals', 3))
        h.add(_.Unsigned('numberOfReservedBytes', 3))
        h.add(_.Unsigned('reserved', 4))
        h.add(_.Unsigned('reserved', 4))
        h.add(_.Unsigned('reserved', 1))
        h.add(_.Ibmfloat('floatValues', 4, _.Get('numberOfFloats')))
        h.alias('floatVal', 'floatValues')

        if (h.get_l('numberOfBytesPerInteger') == 1):
            h.add(_.Signed('integerValues', 1, _.Get('numberOfIntegers')))

        if (h.get_l('numberOfBytesPerInteger') == 2):
            h.add(_.Signed('integerValues', 2, _.Get('numberOfIntegers')))

        if (h.get_l('numberOfBytesPerInteger') == 3):
            h.add(_.Signed('integerValues', 3, _.Get('numberOfIntegers')))

        if (h.get_l('numberOfBytesPerInteger') == 4):
            h.add(_.Signed('integerValues', 4, _.Get('numberOfIntegers')))

        if (h.get_l('numberOfChars') >= 12):
            h.add(_.Ascii('marsClass', 2))
            h.add(_.Ascii('dummy1', 2))
            h.add(_.Ascii('marsType', 2))
            h.add(_.Ascii('dummy2', 2))
            h.add(_.Ascii('experimentVersionNumber', 4))
            h.alias('expver', 'experimentVersionNumber')
            h.alias('marsExpver', 'experimentVersionNumber')
            h.add(
                _.Constant('numberOfRemaininChars',
                           (_.Get('numberOfChars') - 12)))

            with h.list('charValues'):
                for i in range(0, h.get_l('numberOfRemaininChars')):
                    h.add(_.Ascii('char', 1))
            h.add(_.Constant('zero', 0))

            def isEps_inline_concept(h):
                def wrapped(h):

                    marsType = h.get_s('marsType')

                    if marsType == "pf":
                        return 1

                return wrapped

            h.add(_.Concept('isEps', 'zero', concepts=isEps_inline_concept(h)))

            def isSens_inline_concept(h):
                def wrapped(h):

                    marsType = h.get_s('marsType')

                    if marsType == "sf":
                        return 1

                return wrapped

            h.add(
                _.Concept('isSens', 'zero', concepts=isSens_inline_concept(h)))

            h.add(_.Constant('oper', "oper"))

            def marsStream_inline_concept(h):
                def wrapped(h):

                    marsType = h.get_s('marsType')

                    if marsType == "pf":
                        return 'enfo'

                    if marsType == "cf":
                        return 'enfo'

                    if marsType == "sf":
                        return 'sens'

                return wrapped

            h.add(
                _.Concept('marsStream',
                          'oper',
                          concepts=marsStream_inline_concept(h)))

            if h.get_l('isEps'):
                h.add(_.Constant('perturbationNumber', 0))
                h.alias('mars.number', 'perturbationNumber')

            if h.get_l('isSens'):
                h.add(_.Constant('iterationNumber', 0))
                h.add(_.Constant('diagnosticNumber', 0))
                h.alias('mars.iteration', 'iterationNumber')
                h.alias('mars.diagnostic', 'diagnosticNumber')

            h.alias('mars.stream', 'marsStream')
            h.alias('mars.class', 'marsClass')
            h.alias('mars.type', 'marsType')
            h.alias('mars.expver', 'marsExpver')
        else:

            with h.list('charValues'):
                for i in range(0, h.get_l('numberOfChars')):
                    h.add(_.Ascii('char', 1))

    else:
        h.add(_.Section_padding('padding'))
예제 #8
0
def load(h):

    h.add(_.Constant('ECMWF', 98))
    h.add(_.Constant('ECMWF_s', "ecmf"))
    h.add(_.Constant('WMO', 0))
    h.add(_.Constant('conceptsMasterDir', "grib1"))
    h.add(_.Constant('conceptsLocalDirECMF', "grib1/localConcepts/ecmf"))
    h.add(_.Constant('conceptsLocalDirAll', "grib1/localConcepts/[centre:s]"))
    h.add(_.Constant('tablesMasterDir', "grib1"))
    h.add(_.Constant('tablesLocalDir', "grib1/local/[centre:s]"))
    h.add(_.Transient('productionStatusOfProcessedData', 0))
    h.add(_.Position('offsetSection1'))
    h.add(_.Section_length('section1Length', 3))
    h.add(_.Section_pointer('section1Pointer', _.Get('offsetSection1'), _.Get('section1Length'), 1))
    h.add(_.Constant('wrongPadding', 0))
    h.add(_.Unsigned('table2Version', 1))
    h.alias('gribTablesVersionNo', 'table2Version')
    h.add(_.StringCodetable('centre', 1, "common/c-1.table"))
    h.alias('identificationOfOriginatingGeneratingCentre', 'centre')
    h.add(_.Codetable_title('centreDescription', _.Get('centre')))
    h.alias('parameter.centre', 'centre')
    h.alias('originatingCentre', 'centre')
    h.alias('ls.centre', 'centre')
    h.add(_.Unsigned('generatingProcessIdentifier', 1))
    h.alias('generatingProcessIdentificationNumber', 'generatingProcessIdentifier')
    h.alias('process', 'generatingProcessIdentifier')
    h.add(_.Unsigned('gridDefinition', 1))
    h.add(_.Codeflag('section1Flags', 1, "grib1/1.table"))
    h.alias('centreForTable2', 'centre')
    h.add(_.Codetable('indicatorOfParameter', 1, "grib1/2.[centreForTable2:l].[table2Version:l].table"))
    h.add(_.Codetable_title('parameterName', _.Get('indicatorOfParameter')))
    h.add(_.Codetable_units('parameterUnits', _.Get('indicatorOfParameter')))
    h.add(_.StringCodetable('indicatorOfTypeOfLevel', 1, "3.table", _.Get('tablesLocalDir'), _.Get('tablesMasterDir')))
    h.alias('levelType', 'indicatorOfTypeOfLevel')
    h.add(_.Transient('pressureUnits', "hPa"))
    h.add(_.Concept('typeOfLevelECMF', 'unknown', 'typeOfLevel.def', 'conceptsMasterDir', 'conceptsLocalDirECMF', True))
    h.add(_.Concept('typeOfLevel', 'typeOfLevelECMF', 'typeOfLevel.def', 'conceptsMasterDir', 'conceptsLocalDirAll', True))
    h.alias('vertical.typeOfLevel', 'typeOfLevel')
    pass  # when block
    h.alias('ls.typeOfLevel', 'typeOfLevel')

    if ((((((((((((h.get_l('indicatorOfTypeOfLevel') == 101) or (h.get_l('indicatorOfTypeOfLevel') == 104)) or (h.get_l('indicatorOfTypeOfLevel') == 106)) or (h.get_l('indicatorOfTypeOfLevel') == 108)) or (h.get_l('indicatorOfTypeOfLevel') == 110)) or (h.get_l('indicatorOfTypeOfLevel') == 112)) or (h.get_l('indicatorOfTypeOfLevel') == 114)) or (h.get_l('indicatorOfTypeOfLevel') == 116)) or (h.get_l('indicatorOfTypeOfLevel') == 120)) or (h.get_l('indicatorOfTypeOfLevel') == 121)) or (h.get_l('indicatorOfTypeOfLevel') == 128)) or (h.get_l('indicatorOfTypeOfLevel') == 141)):
        h.add(_.Unsigned('topLevel', 1))
        h.add(_.Unsigned('bottomLevel', 1))
        h.add(_.Sprintf('levels', "%d-%d", _.Get('topLevel'), _.Get('bottomLevel')))
        h.alias('ls.levels', 'levels')
        h.alias('vertical.level', 'topLevel')
        h.alias('vertical.topLevel', 'topLevel')
        h.alias('vertical.bottomLevel', 'bottomLevel')
    else:
        h.add(_.Unsigned('level', 2))

        if (h.get_l('indicatorOfTypeOfLevel') == 210):
            h.add(_.Scale('marsLevel', _.Get('level'), _.Get('oneConstant'), _.Get('hundred')))
            h.alias('mars.levelist', 'marsLevel')

        h.alias('vertical.level', 'level')
        h.alias('vertical.topLevel', 'level')
        h.alias('vertical.bottomLevel', 'level')
        h.alias('ls.level', 'level')
        h.alias('lev', 'level')

    if (((((h.get_l('indicatorOfTypeOfLevel') == 109) or (h.get_l('indicatorOfTypeOfLevel') == 100)) or (h.get_l('indicatorOfTypeOfLevel') == 110)) or (h.get_l('indicatorOfTypeOfLevel') == 113)) or (h.get_l('indicatorOfTypeOfLevel') == 117)):
        h.alias('mars.levelist', 'level')

    h.add(_.Unsigned('yearOfCentury', 1))
    h.add(_.Unsigned('month', 1))
    h.add(_.Unsigned('day', 1))
    h.add(_.Unsigned('hour', 1))
    h.add(_.Unsigned('minute', 1))
    h.add(_.Transient('second', 0))
    h.add(_.Codetable('unitOfTimeRange', 1, "grib1/4.table"))
    h.alias('unitOfTime', 'unitOfTimeRange')
    h.alias('indicatorOfUnitOfTimeRange', 'unitOfTimeRange')
    h.add(_.Unsigned('P1', 1))
    h.add(_.Unsigned('P2', 1))
    h.add(_.Codetable('timeRangeIndicator', 1, "5.table", _.Get('tablesLocalDir'), _.Get('tablesMasterDir')))
    h.add(_.Unsigned('numberIncludedInAverage', 2))
    h.add(_.Bits('mybits', _.Get('numberIncludedInAverage'), 0, 12))
    h.add(_.Unsigned('numberMissingFromAveragesOrAccumulations', 1))
    h.add(_.Unsigned('centuryOfReferenceTimeOfData', 1))
    h.add(_.Codetable('subCentre', 1, "grib1/0.[centre].table"))

    if (h.get_l('table2Version') >= 128):

        if ((h.get_l('centre') != 98) and (h.get_l('subCentre') == 98)):
            h.alias('centreForTable2', 'subCentre')
        else:
            h.alias('centreForTable2', 'centre')

    else:
        h.alias('centreForTable2', 'WMO')

    h.add(_.Concept('paramIdECMF', 'defaultParameter', 'paramId.def', 'conceptsMasterDir', 'conceptsLocalDirECMF', False))
    h.add(_.Concept('paramId', 'paramIdECMF', 'paramId.def', 'conceptsMasterDir', 'conceptsLocalDirAll', False))
    h.add(_.Concept('cfNameECMF', 'defaultName', 'cfName.def', 'conceptsMasterDir', 'conceptsLocalDirECMF', False))
    h.add(_.Concept('cfName', 'cfNameECMF', 'cfName.def', 'conceptsMasterDir', 'conceptsLocalDirAll', False))
    h.add(_.Concept('cfVarNameECMF', 'defaultName', 'cfVarName.def', 'conceptsMasterDir', 'conceptsLocalDirECMF', False))
    h.add(_.Concept('cfVarName', 'cfVarNameECMF', 'cfVarName.def', 'conceptsMasterDir', 'conceptsLocalDirAll', False))
    h.add(_.Concept('unitsECMF', 'defaultName', 'units.def', 'conceptsMasterDir', 'conceptsLocalDirECMF', False))
    h.add(_.Concept('units', 'unitsECMF', 'units.def', 'conceptsMasterDir', 'conceptsLocalDirAll', False))
    h.add(_.Concept('nameECMF', 'defaultName', 'name.def', 'conceptsMasterDir', 'conceptsLocalDirECMF', False))
    h.add(_.Concept('name', 'nameECMF', 'name.def', 'conceptsMasterDir', 'conceptsLocalDirAll', False))
    h.add(_.Signed('decimalScaleFactor', 2))
    h.add(_.Transient('setLocalDefinition', 0))
    h.add(_.Transient('optimizeScaleFactor', 0))
    h.add(_.G1date('dataDate', _.Get('centuryOfReferenceTimeOfData'), _.Get('yearOfCentury'), _.Get('month'), _.Get('day')))
    h.add(_.Evaluate('year', (_.Get('dataDate') / 10000)))
    h.add(_.Time('dataTime', _.Get('hour'), _.Get('minute'), _.Get('second')))
    h.add(_.Julian_day('julianDay', _.Get('dataDate'), _.Get('hour'), _.Get('minute'), _.Get('second')))
    h.add(_.TransientCodetable('stepUnits', 1, "stepUnits.table"))
    h.add(_.Concept('stepType', 'timeRangeIndicator', 'stepType.def', 'conceptsMasterDir', 'conceptsLocalDirAll', True))

    if (h.get_s('stepType') == "instant"):
        h.alias('productDefinitionTemplateNumber', 'zero')
    else:
        h.alias('productDefinitionTemplateNumber', 'eight')

    h.add(_.G1step_range('stepRange', _.Get('P1'), _.Get('P2'), _.Get('timeRangeIndicator'), _.Get('unitOfTimeRange'), _.Get('stepUnits'), _.Get('stepType')))
    h.add(_.Long_vector('startStep', _.Get('stepRange'), 0))
    h.add(_.Long_vector('endStep', _.Get('stepRange'), 1))
    h.alias('stepInHours', 'endStep')
    h.alias('ls.stepRange', 'stepRange')
    h.alias('ls.dataDate', 'dataDate')
    h.alias('mars.step', 'endStep')
    h.alias('mars.date', 'dataDate')
    h.alias('mars.levtype', 'indicatorOfTypeOfLevel')
    h.alias('mars.time', 'dataTime')
    h.add(_.Mars_param('marsParam', _.Get('paramId'), _.Get('gribTablesVersionNo'), _.Get('indicatorOfParameter')))
    h.alias('mars.param', 'marsParam')

    if ((h.get_l('centre') == 34) and (h.get_l('subCentre') == 241)):
        h.alias('mars.param', 'paramId')

        if (h.get_l('indicatorOfTypeOfLevel') == 101):
            h.add(_.Constant('sfc_levtype', "sfc"))
            h.alias('mars.levtype', 'sfc_levtype')


    h.add(_.Validity_date('validityDate', _.Get('dataDate'), _.Get('dataTime'), _.Get('step'), _.Get('stepUnits')))
    h.alias('time.validityDate', 'validityDate')
    h.add(_.Validity_time('validityTime', _.Get('dataDate'), _.Get('dataTime'), _.Get('step'), _.Get('stepUnits')))
    h.alias('time.validityTime', 'validityTime')
    h.add(_.Transient('deleteLocalDefinition', 0))

    if ((((h.get_l('section1Length') > 40) or h._new()) or (h.get_l('setLocalDefinition') > 0)) and (h.get_l('deleteLocalDefinition') == 0)):
        h.add(_.Constant('localUsePresent', 1))
        h.alias('grib2LocalSectionPresent', 'present')

        if ((h.get_l('centre') == h.get_l('ECMWF')) or ((h.get_l('centre') != h.get_l('ECMWF')) and (h.get_l('subCentre') == h.get_l('ECMWF')))):
            h.add(_.Pad('reservedNeedNotBePresent', 12))
            h.add(_.Codetable('localDefinitionNumber', 1, "grib1/localDefinitionNumber.98.table"))
            _.Template('grib1/local.98.[localDefinitionNumber:l].def', True).load(h)

            if h._changed('localDefinitionNumber'):

                if (not (h._new()) and (h.get_l('localDefinitionNumber') != 4)):
                    h.add(_.Section_padding('localExtensionPadding'))


            _.Template('mars/grib.[stream:s].[type:s].def', True).load(h)
        else:

            if (not (h._new()) or h.get_l('setLocalDefinition')):
                h.add(_.Pad('reservedNeedNotBePresent', 12))
                _.Template('grib1/local.[centre:l].def', True).load(h)
                h.add(_.Section_padding('localExtensionPadding'))

    else:
        h.add(_.Constant('localUsePresent', 0))

    h.add(_.Section_padding('section1Padding'))
    h.add(_.Concept('shortNameECMF', 'defaultShortName', 'shortName.def', 'conceptsMasterDir', 'conceptsLocalDirECMF', False))
    h.add(_.Concept('shortName', 'shortNameECMF', 'shortName.def', 'conceptsMasterDir', 'conceptsLocalDirAll', False))
    h.alias('ls.shortName', 'shortName')
    h.add(_.Ifs_param('ifsParam', _.Get('paramId'), _.Get('type')))
    h.alias('parameter.paramId', 'paramId')
    h.alias('parameter.shortName', 'shortName')
    h.alias('parameter.units', 'units')
    h.alias('parameter.name', 'name')
    h.alias('parameter', 'paramId')
    h.alias('short_name', 'shortName')
    h.alias('time.stepRange', 'stepRange')
    h.alias('time.stepUnits', 'stepUnits')
    h.alias('time.dataDate', 'dataDate')
    h.alias('time.dataTime', 'dataTime')
    h.alias('time.startStep', 'startStep')
    h.alias('time.endStep', 'endStep')
    h.alias('time.stepType', 'stepType')
    h.add(_.Concept('stepTypeForConversion', 'unknown', 'stepTypeForConversion.def', 'conceptsMasterDir', 'conceptsLocalDirAll', True))

    if (h.get_s('stepTypeForConversion') == "accum"):
        h.alias('productDefinitionTemplateNumber', 'eight')

    h.add(_.Md5('md5Section1', _.Get('offsetSection1'), _.Get('section1Length')))
    h.add(_.Md5('md5Product', _.Get('offsetSection1'), _.Get('section1Length'), _.Get('gridDefinition'), _.Get('section1Flags'), _.Get('decimalScaleFactor')))