class_docstr: An OptsSpec is a string specification that describes an
  OptionTree. It is a list of tree path specifications (using dotted
  syntax) separated by keyword lists for any of the style, plotting
  or normalization options. These keyword lists are denoted
  'plot(..)', 'style(...)' and 'norm(...)'  respectively.  These
  three groups may be specified even more concisely using keyword
  lists delimited by square brackets, parentheses and braces
  respectively.  All these sets are optional and may be supplied in
  any order.
  
  For instance, the following string:
  
  Image (interpolation=None) plot(show_title=False) Curve style(color='r')
  
  Would specify an OptionTree where Image has "interpolation=None"
  for style and 'show_title=False' for plot options. The Curve has a
  style set such that color='r'.
  
  The parser is fairly forgiving; commas between keywords are
  optional and additional spaces are often allowed. The only
  restriction is that keywords *must* be immediately followed by the
  '=' sign (no space).
docstr: Given a normalization parse group (i.e. the contents of the
  braces), validate the option list and compute the appropriate
  integer value for the normalization plotting option.
docstr_tok: ["Given","a","normalization","parse","group","(","i.e",".","the","contents","of","the","braces",")",",","validate","the","option","list","and","compute","the","appropriate","integer","value","for","the","normalization","plotting","option","."]
code: def process_normalization(cls, parse_group):
      """
      Given a normalization parse group (i.e. the contents of the
      braces), validate the option list and compute the appropriate
      integer value for the normalization plotting option.
      """
      if "norm_options" not in parse_group:
          return None
      opts = parse_group["norm_options"][0].asList()
      if opts == []:
          return None
  
      options = ["+framewise", "-framewise", "+axiswise", "-axiswise"]
  
      for normopt in options:
          if opts.count(normopt) > 1:
              raise SyntaxError(
                  "Normalization specification must not"
                  " contain repeated %r" % normopt
              )
  
      if not all(opt in options for opt in opts):
          raise SyntaxError(
              f"Normalization option not one of {', '.join(options)}"
          )
      excluded = [
          ("+framewise", "-framewise"),
          ("+axiswise", "-axiswise"),
      ]
      for pair in excluded:
          if all(exclude in opts for exclude in pair):
              raise SyntaxError(
                  "Normalization specification cannot"
                  f" contain both {pair[0]} and {pair[1]}"
              )
  
      # If unspecified, default is -axiswise and -framewise
      if len(opts) == 1 and opts[0].endswith("framewise"):
          axiswise = False
          framewise = True if "+framewise" in opts else False
      elif len(opts) == 1 and opts[0].endswith("axiswise"):
          framewise = False
          axiswise = True if "+axiswise" in opts else False
      else:
          axiswise = True if "+axiswise" in opts else False
          framewise = True if "+framewise" in opts else False
  
      return dict(axiswise=axiswise, framewise=framewise)
  
imports: from itertools import groupby
  import numpy
  import param
  import pyparsing
  from ..core.options import Cycle, Options, Palette
  from ..core.util import merge_option_dicts
  from ..operation import Compositor
  from .transform import dim
label_desc: Use image node_id 1 for calling the OptsSpec obj's underlying member method code with example usage: obj.process_normalization(cls, parse_group) and returns: dict, None, None