docs: def read_exposure(self, haz_sitecol=None):  # after load_risk_model
          """
          Read the exposure, the riskmodel and update the attributes
          .sitecol, .assetcol
          """
          with self.monitor('reading exposure', autoflush=True):
              self.sitecol, self.assetcol, discarded = (
                  readinput.get_sitecol_assetcol(
                      self.oqparam, haz_sitecol, self.riskmodel.loss_types))
              if len(discarded):
                  self.datastore['discarded'] = discarded
                  if hasattr(self, 'rup'):
                      # this is normal for the case of scenario from rupture
                      logging.info('%d assets were discarded because too far '
                                   'from the rupture; use `oq show discarded` '
                                   'to show them and `oq plot_assets` to plot '
                                   'them' % len(discarded))
                  elif not self.oqparam.discard_assets:  # raise an error
                      self.datastore['sitecol'] = self.sitecol
                      self.datastore['assetcol'] = self.assetcol
                      raise RuntimeError(
                          '%d assets were discarded; use `oq show discarded` to'
                          ' show them and `oq plot_assets` to plot them' %
                          len(discarded))
  
          # reduce the riskmodel to the relevant taxonomies
          taxonomies = set(taxo for taxo in self.assetcol.tagcol.taxonomy
                           if taxo != '?')
          if len(self.riskmodel.taxonomies) > len(taxonomies):
              logging.info('Reducing risk model from %d to %d taxonomies',
                           len(self.riskmodel.taxonomies), len(taxonomies))
              self.riskmodel = self.riskmodel.reduce(taxonomies)
          return readinput.exposure