code: def scored_to_phenotype(self,phenotypes):
          
          def _apply_score(scored_calls,phenotypes):
              present = sorted(list(set(phenotypes)&set(scored_calls.keys())))
              total = sum([scored_calls[x] for x in present])
              if total > 1: 
                  raise ValueError("You cant extract phenotypes from scores if they are not mutually exclusive")
              if total == 0: return np.nan
              for label in present:
                  if scored_calls[label] == 1: return label
              raise ValueError("Should have hit an exit criteria already")
          output = self.copy()
          output['phenotype_label'] = output.apply(lambda x: _apply_score(x['scored_calls'],phenotypes),1)
          # now update the phenotypes with these
          output['phenotype_calls'] = output.apply(lambda x: 
              dict([(y,1 if x['phenotype_label']==y else 0) for y in phenotypes])
          ,1)
          return output
docs: Convert binary pehnotypes to mutually exclusive phenotypes. 
          If none of the phenotypes are set, then phenotype_label becomes nan
          If any of the phenotypes are multiply set then it throws a fatal error.
  
          Args:
              phenotypes (list): a list of scored_names to convert to phenotypes
  
          Returns:
              CellDataFrame