private double calcPval(
     HashMap<Integer, String> singleGeneCaseValueMap, String profileType, String profileStableId)
     throws IllegalArgumentException {
   double _p_value = 0.0;
   if (profileType.equals(GeneticAlterationType.MUTATION_EXTENDED.toString())
       || profileType.equals(GeneticAlterationType.COPY_NUMBER_ALTERATION.toString())) {
     _p_value = runFisherExactTest(singleGeneCaseValueMap, profileType);
   } else if (profileType.equals(GeneticAlterationType.MRNA_EXPRESSION.toString())
       || profileType.equals(GeneticAlterationType.PROTEIN_LEVEL.toString())) {
     _p_value = runTTest(singleGeneCaseValueMap, profileStableId);
   }
   return _p_value;
 }
  @Override
  public ObjectNode process(long entrezGeneId, String[] values, ArrayList<Integer> sampleList) {

    ObjectNode _datum = mapper.createObjectNode();

    // create map to pair sample and value
    HashMap<Integer, String> mapSampleValue = new HashMap<>();
    for (int i = 0; i < values.length; i++) {
      String value = values[i];
      Integer sampleId = sampleList.get(i);
      mapSampleValue.put(sampleId, value);
    }

    // remove empty entry
    Iterator it = mapSampleValue.entrySet().iterator();
    while (it.hasNext()) {
      Map.Entry pair = (Map.Entry) it.next();
      if (pair.getValue().equals("NA")
          || pair.getValue().equals("NaN")
          || pair.getValue().equals("null")) {
        it.remove();
      }
    }

    // get Gene Name and Cytoband
    DaoGeneOptimized daoGeneOptimized = DaoGeneOptimized.getInstance();
    String geneName = daoGeneOptimized.getGene(entrezGeneId).getHugoGeneSymbolAllCaps();
    String cytoband = daoGeneOptimized.getGene(entrezGeneId).getCytoband();

    // statistics analysis
    if (profileType.equals(GeneticAlterationType.COPY_NUMBER_ALTERATION.toString())) {
      if (!(Arrays.asList(queriedGenes)).contains(geneName)) { // remove queried genes from result
        _datum.put(COL_NAME_GENE, geneName);
        _datum.put(COL_NAME_CYTOBAND, cytoband);
        _datum.put(
            COL_NAME_PCT_ALTERED,
            Integer.toString(countAltered(mapSampleValue, profileType, "altered"))
                + "////"
                + Double.toString(calcPct(mapSampleValue, profileType, "altered")));
        _datum.put(
            COL_NAME_PCT_UNALTERED,
            Integer.toString(countAltered(mapSampleValue, profileType, "unaltered"))
                + "////"
                + Double.toString(calcPct(mapSampleValue, profileType, "unaltered")));
        _datum.put(
            COL_NAME_RATIO,
            calcRatio(
                calcPct(mapSampleValue, profileType, "altered"),
                calcPct(mapSampleValue, profileType, "unaltered")));
        _datum.put(COL_NAME_DIRECTION, "place holder"); // calculation is done by the front-end
        _datum.put(COL_NAME_P_VALUE, calcPval(mapSampleValue, profileType, geneticProfileStableId));
        if (!(calcPct(mapSampleValue, profileType, "altered") == 0.0
                && calcPct(mapSampleValue, profileType, "unaltered") == 0.0)
            && !Double.isNaN(calcPval(mapSampleValue, profileType, geneticProfileStableId))) {
          return _datum;
        }
      }
    } else if (profileType.equals(GeneticAlterationType.MRNA_EXPRESSION.toString())) {
      _datum.put(COL_NAME_GENE, geneName);
      _datum.put(COL_NAME_CYTOBAND, cytoband);
      _datum.put(
          COL_NAME_MEAN_ALTERED, calcMean(mapSampleValue, "altered", geneticProfileStableId));
      _datum.put(
          COL_NAME_MEAN_UNALTERED, calcMean(mapSampleValue, "unaltered", geneticProfileStableId));
      _datum.put(
          COL_NAME_STDEV_ALTERED, calcSTDev(mapSampleValue, "altered", geneticProfileStableId));
      _datum.put(
          COL_NAME_STDEV_UNALTERED, calcSTDev(mapSampleValue, "unaltered", geneticProfileStableId));
      _datum.put(COL_NAME_P_VALUE, calcPval(mapSampleValue, profileType, geneticProfileStableId));
      if (!Double.isNaN(calcPval(mapSampleValue, profileType, geneticProfileStableId))) {
        return _datum;
      }
    } else if (profileType.equals(GeneticAlterationType.PROTEIN_LEVEL.toString())) {
      _datum.put(COL_NAME_GENE, geneName);
      _datum.put(COL_NAME_CYTOBAND, cytoband);
      _datum.put(
          COL_NAME_MEAN_ALTERED, calcMean(mapSampleValue, "altered", geneticProfileStableId));
      _datum.put(
          COL_NAME_MEAN_UNALTERED, calcMean(mapSampleValue, "unaltered", geneticProfileStableId));
      _datum.put(
          COL_NAME_STDEV_ALTERED, calcSTDev(mapSampleValue, "altered", geneticProfileStableId));
      _datum.put(
          COL_NAME_STDEV_UNALTERED, calcSTDev(mapSampleValue, "unaltered", geneticProfileStableId));
      _datum.put(COL_NAME_P_VALUE, calcPval(mapSampleValue, profileType, geneticProfileStableId));
      if (!Double.isNaN(calcPval(mapSampleValue, profileType, geneticProfileStableId))) {
        return _datum;
      }
    }

    return null;
  }