/*...............................................................................................................*/
  public void setTableAndTaxa(MesquiteTable table, Taxa taxa) {
    // if (this.data !=null)
    //	this.data.removeListener(this);
    if (taxa != this.taxa) observedStates = null;
    this.taxa = taxa;
    matrixSourceTask.initialize(taxa);

    this.table = table;

    doCalcs();
  }
  public void doCalcs() {
    if (bits != null) bits.clearAllBits();
    if (taxa == null) return;
    if (bits == null) bits = new Bits(taxa.getNumTaxa());
    else bits.resetSize(taxa.getNumTaxa());
    if (observedStates == null) {
      tInfo = null;
      observedStates = matrixSourceTask.getCurrentMatrix(taxa);
      if (observedStates != null) {
        captureCharacterDataFromObservedStates();

        if (data != null) tInfo = data.getTaxaInfo(true);
      }
    }
    if (observedStates == null) return;
    for (int it = 0; it < taxa.getNumTaxa(); it++) {
      if (hasData(it)) bits.setBit(it);
    }
  }