private Set<String> getDownstream(String mut) {
    Set<String> tfs = new HashSet<String>();
    tfs.add(mut);

    if (depth > 1) tfs.addAll(travSt.getDownstream(tfs, depth - 1));

    return travExp.getDownstream(tfs);
  }
  public static void main(String[] args) throws IOException {
    Graph graphSt;
    Graph graphExp;
    GiovannisAnalysis finder;
    Dataset1 dataset = Dataset1.THCA;
    int depth = 3;
    double fdrThr = 0.01;

    graphSt = PathwayCommons.getGraph(SIFEnum.CONTROLS_STATE_CHANGE_OF);
    graphExp = PathwayCommons.getGraph(SIFEnum.CONTROLS_EXPRESSION_OF);
    graphExp.merge(MSigDBTFT.getGraph());
    finder = new GiovannisAnalysis(graphSt, graphExp, dataset, depth, fdrThr);

    checkZeros(finder.expMan);

    finder.find();
  }
  private void writeSelf(
      String origTarget, GeneBranch currentParent, GeneBranch down, Writer writer1, Writer writer2)
      throws IOException {
    if (!down.isSelected()) return;

    String edgeTag;

    if (down.isLeaf() || travExp.getUpstream(down.gene).contains(currentParent)) {
      edgeTag = SIFEnum.CONTROLS_EXPRESSION_OF.getTag();
    } else edgeTag = SIFEnum.CONTROLS_STATE_CHANGE_OF.getTag();

    writer1.write(currentParent.gene + "\t" + edgeTag + "\t" + down.gene + "\n");

    writeWeights(origTarget, currentParent, down, edgeTag, writer2);

    writeBranches(origTarget, down, writer1, writer2);
  }