code: def run_preassembly(self, stmts, print_summary=True):
          pa1 = Preassembler(hierarchies, stmts)
          logger.info("Combining duplicates")
          pa1.combine_duplicates()
          logger.info("Mapping sites")
          (valid, mapped) = sm.map_sites(pa1.unique_stmts)
          correctly_mapped_stmts = []
          for ms in mapped:
              if all([True if mm[1] is not None else False
                           for mm in ms.mapped_mods]):
                  correctly_mapped_stmts.append(ms.mapped_stmt)
          mapped_stmts = valid + correctly_mapped_stmts 
          pa2 = Preassembler(hierarchies, mapped_stmts)
          logger.info("Combining duplicates again")
          pa2.combine_duplicates()
          pa2.combine_related()
          self.results = {}
          self.results['raw'] = stmts
          self.results['duplicates1'] = pa1.unique_stmts
          self.results['valid'] = valid
          self.results['mapped'] = mapped
          self.results['mapped_stmts'] = mapped_stmts
          self.results['duplicates2'] = pa2.unique_stmts
          self.results['related2'] = pa2.related_stmts
          if print_summary:
              logger.info("\nStarting number of statements: %d" % len(stmts))
              logger.info("After duplicate removal: %d" % len(pa1.unique_stmts))
              logger.info("Unique statements with valid sites: %d" % len(valid))
              logger.info("Unique statements with invalid sites: %d" %
                          len(mapped))
              logger.info("After post-mapping duplicate removal: %d" %
                          len(pa2.unique_stmts))
              logger.info("After combining related statements: %d" %
                          len(pa2.related_stmts))
          if self.basename is not None:
              results_filename = '%s_results.pkl' % self.basename
              with open(results_filename, 'wb') as f:
                  pickle.dump(self.results, f)
          return self.results