docs: def make_report(self):
          """Build the report and return a restructed text string"""
          oq, ds = self.oq, self.dstore
          for name in ('params', 'inputs'):
              self.add(name)
          if 'csm_info' in ds:
              self.add('csm_info')
              if ds['csm_info'].source_models[0].name != 'scenario':
                  # required_params_per_trt makes no sense for GMFs from file
                  self.add('required_params_per_trt')
              self.add('rlzs_assoc', ds['csm_info'].get_rlzs_assoc())
          if 'csm_info' in ds:
              self.add('ruptures_per_trt')
          if 'rup_data' in ds:
              self.add('ruptures_events')
          if oq.calculation_mode in ('event_based_risk',):
              self.add('avglosses_data_transfer')
          if 'exposure' in oq.inputs:
              self.add('exposure_info')
          if 'source_info' in ds:
              self.add('slow_sources')
              self.add('times_by_source_class')
              self.add('dupl_sources')
          if 'task_info' in ds:
              self.add('task_info')
              tasks = set(ds['task_info'])
              if 'classical' in tasks:
                  self.add('task_hazard:0')
                  self.add('task_hazard:-1')
              self.add('job_info')
          if 'performance_data' in ds:
              self.add('performance')
          return self.text