nodes: 0, module; 1, function_definition; 2, function_name:dimensions_from_subgroups; 3, parameters; 4, block; 5, identifier:s; 6, expression_statement; 7, expression_statement; 8, return_statement; 9, comment:"""
      Given a sorted list of subgroups, return a string appropriate to provide as
      a composite track's `dimensions` arg.
  
      Parameters
      ----------
      s : list of SubGroup objects (or anything with a `name` attribute)
      """; 10, assignment; 11, call; 12, identifier:letters; 13, string; 14, attribute; 15, argument_list; 16, string_content:XYABCDEFGHIJKLMNOPQRSTUVWZ; 17, string; 18, identifier:join; 19, list_comprehension; 20, string_content:; 21, call; 22, for_in_clause; 23, attribute; 24, argument_list; 25, pattern_list; 26, call; 27, string; 28, identifier:format; 29, identifier:dim; 30, attribute; 31, identifier:dim; 32, identifier:sg; 33, identifier:zip; 34, argument_list; 35, string_content:dim{0}={1}; 36, identifier:sg; 37, identifier:name; 38, identifier:letters; 39, identifier:s
code: def dimensions_from_subgroups(s):
      """
      Given a sorted list of subgroups, return a string appropriate to provide as
      a composite track's `dimensions` arg.
  
      Parameters
      ----------
      s : list of SubGroup objects (or anything with a `name` attribute)
      """
      letters = 'XYABCDEFGHIJKLMNOPQRSTUVWZ'
      return ' '.join(['dim{0}={1}'.format(dim, sg.name) for dim, sg in zip(letters, s)])