code: def calculate_performance(molecules, ensemble, sort_order, options):
      
      es = EnsembleStorage()
      es.set_prop('ensemble', ensemble)
  
      # calculate the appropriate score structure type
      score_structure = classification.make_score_structure(molecules, ensemble)
  
      # determine auc value
      auc_structure = classification.make_auc_structure(score_structure)
      auc = classification.calculate_auc(auc_structure, sort_order, 'no stats')
      es.set_prop('auc', auc)
  
      # calculate enrichment factors
      for fpf in classification.make_fpfList(options, score_structure):
          fpf = float(fpf)
          ef_structure = classification.make_ef_structure(score_structure, fpf, sort_order)
          if ef_structure:
              ef = classification.calculate_ef(ef_structure, fpf)
              es.set_prop(ef[0], ef[1], 'ef')
      return es
docs: determine the virtual screening performance of the input ensemble, and return the results in an
      ensemble storage object.
      :param molecules:
      :param ensemble:
      :param sort_order: string. either 'asc' (for binding energy estimates)  or 'dsc' (for similarity scores)
      :param options: instance of s
      :return: