code: def _validate(self):
          
          # This could be done with a default config
  
          # Check that specific keys exist
          sections = odict([
                  ('catalog',['dirname','basename',
                              'lon_field','lat_field','objid_field',
                              'mag_1_band', 'mag_1_field', 'mag_err_1_field',
                              'mag_2_band', 'mag_2_field', 'mag_err_2_field',
                              ]),
                  ('mask',[]),
                  ('coords',['nside_catalog','nside_mask','nside_likelihood',
                             'nside_pixel','roi_radius','roi_radius_annulus',
                             'roi_radius_interior','coordsys',
                             ]),
                  ('likelihood',[]),
                  ('output',[]),
                  ('batch',[]),
                  ])  
  
          keys = np.array(list(sections.keys()))
          found = np.in1d(keys,list(self.keys()))
  
          if not np.all(found):
              msg = 'Missing sections: '+str(keys[~found])
              raise Exception(msg)
  
          for section,keys in sections.items():
              keys = np.array(keys)
              found = np.in1d(keys,list(self[section].keys()))
              if not np.all(found):
                  msg = 'Missing keys in %s: '%(section)+str(keys[~found])
                  raise Exception(msg)
docs: Enforce some structure to the config file