Examples: Filtering

Example 1: Extract theta (STASH code 4) and pressure fields (STASH code 407) into a separate fieldsfile

import mule

ff = mule.FieldsFile.from_file("InputFile")

ff_out = ff.copy()

for field in ff.fields:
    if field.lbrel in (2,3) and field.lbuser4 in (4,407):
        ff_out.fields.append(field)

ff_out.to_file("OutputFile")

Note

  • Notice the check on lbrel - only fields with a valid release number will correctly support all named attributes, so this check must come before the check on lbuser4 to avoid errors.

  • In this case you could have instead used the hasattr function to look for the presence of lbuser4 directly, as an alternative.

Example 2: Remove all fields valid at 12Z

import mule

ff = mule.FieldsFile.from_file("InputFile")

for field in list(ff.fields):
    if field.lbrel in (2,3) and field.lbhrd == 12:
        ff.fields.remove(field)

ff.to_file("OutputFile")

Note

  • Notice the check on lbrel - only fields with a valid release number will correctly support all named attributes, so this check must come before the check on lbhrd to avoid errors.

  • In this case you could have instead used the hasattr function to look for the presence of lbhrd directly, as an alternative.

Example 3: Extract field numbers 3, 5 and 8

import mule

ff = mule.FieldsFile.from_file("InputFile")

ff_out = ff.copy()

# Remember Python uses 0-based indices for lists
ff_out.fields = [ff.fields[i-1] for i in [3,5,8]]

ff_out.to_file("OutputFile")

Example 4: Extract all 32 bit packed fields (LBPACK = 2) which have been unprocessed (LBPROC = 0)

import mule

ff = mule.FieldsFile.from_file("InputFile")

ff_out = ff.copy()

for field in ff.fields:
    if field.lbrel in (2,3) and field.lbpack == 2 and field.lbproc == 0:
        ff_out.fields.append(field)

ff_out.to_file("OutputFile")

Note

  • Notice the check on lbrel - only fields with a valid release number will correctly support all named attributes, so this check must come before the checks on lbpack and lbproc to avoid errors.

Example 5: Extract 38-level fields with STASH code 2, 3 and 4. The fields have to be 32 bit packed (LBPACK = 2) and unprocessed (LBPROC = 0) for STASH code 2 and 4

import mule

ff = mule.FieldsFile.from_file("InputFile")

ff_out = ff.copy()

for field in ff.fields:
    if field.lbrel in (2,3) and field.lblev == 38:
        if field.lbuser4 in (2,4) and field.lbpack == 2 and field.lbproc == 0:
            ff_out.fields.append(field)
        elif field.lbuser4 == 3:
            ff_out.fields.append(field)

ff_out.to_file("OutputFile")

Note

  • Notice the check on lbrel - only fields with a valid release number will correctly support all named attributes, so this check must come before the checks on lblev, lbuser4, etc. to avoid errors.