code: def __gen_struct_anno_files(self, top_level_layer):
          
          paula_id = '{0}.{1}.{2}_{3}_struct'.format(top_level_layer,
                                                 self.corpus_name, self.name,
                                                 top_level_layer)
          E, tree = gen_paula_etree(paula_id)
  
          base_paula_id = self.paulamap['hierarchy'][top_level_layer]
          mflist = E('multiFeatList',
                     {XMLBASE: base_paula_id+'.xml'})
  
          for node_id in select_nodes_by_layer(self.dg, top_level_layer):
              if not istoken(self.dg, node_id):
                  mfeat = E('multiFeat',
                            {XLINKHREF: '#{0}'.format(node_id)})
                  node_dict = self.dg.node[node_id]
                  for attr in node_dict:
                      if attr not in IGNORED_NODE_ATTRIBS:
                          mfeat.append(
                              E('feat',
                                {'name': attr, 'value': node_dict[attr]}))
                  if self.human_readable:  # adds node label as a <!--comment-->
                      mfeat.append(Comment(node_dict.get('label')))
                  mflist.append(mfeat)
          tree.append(mflist)
          self.files[paula_id] = tree
          self.file2dtd[paula_id] = PaulaDTDs.multifeat
          return paula_id
docs: A struct annotation file contains node (struct) attributes (of
          non-token nodes). It is e.g. used to annotate the type of a syntactic
          category (NP, VP etc.).
  
          See also: __gen_hierarchy_file()