<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def do( self, params ):
 """Perform the underlying experiment and summarise its results. Our results are the summary statistics extracted from the results of the instances of the underlying experiment that we performed. We drop from the calculations any experiments whose completion status was False, indicating an error. Our own completion status will be True unless we had an error summarising a field (usually caused by trying to summarise non-numeric data). We record the exceptions generated by any experiment we summarise under the metadata key :attr:`SummaryExperiment.UNDERLYING_EXCEPTIONS` :param params: the parameters to the underlying experiment :returns: the summary statistics of the underlying results"""


        # perform the underlying experiment
        rc = self.experiment().run()
        
        # extract the result dicts as a list
        results = rc[Experiment.RESULTS]
        if not isinstance(results, list):
            # force to list
            results = [ rc ]

        # extract only the successful runs
        sresults = [ res for res in results if res[Experiment.METADATA][Experiment.STATUS] ]
        exs = [ res[Experiment.METADATA][Experiment.EXCEPTION] for res in results if not res[Experiment.METADATA][Experiment.STATUS] ]
       
        # add extra values to our metadata record
        self._metadata[self.UNDERLYING_RESULTS]            = len(results)
        self._metadata[self.UNDERLYING_SUCCESSFUL_RESULTS] = len(sresults)
        self._metadata[self.UNDERLYING_EXCEPTIONS]         = exs

        # construct summary results
        return self.summarise(sresults)