hist.add(1, modEvent.subcat());
  public Event getHistory(TrainerEvent trainerEvent, int backOffLevel) {    ModifierEvent modEvent = (ModifierEvent)trainerEvent;    if (modEvent.parent() == baseNP)      return getBaseNPHistory(modEvent, backOffLevel);    Symbol side = Constants.sideToSym(modEvent.side());    MutableEvent hist = historiesWithSubcats[backOffLevel];    hist.clear();    Symbol verbInterveningSym =      Constants.booleanToSym(modEvent.verbIntervening());    Symbol mappedPrevModSym =      Collins.mapPrevMod(modEvent.previousMods().symbolAt(0));    Symbol parent =      Language.training.removeArgAugmentation(modEvent.parent());    switch (backOffLevel) {    case 0:      // for p(M(t)_i | P, H, w, t, verbIntervening, map(M_i-1), subcat, side)      hist.add(0, parent);      hist.add(0, Language.training.removeGapAugmentation(modEvent.head()));      hist.add(0, modEvent.headWord().word());      hist.add(0, modEvent.headWord().tag());      hist.add(0, verbInterveningSym);      hist.add(0, mappedPrevModSym);      hist.add(1, modEvent.subcat());      hist.add(0, side);      break;    case 1:      // for p(M(t)_i | P, H, t, verbIntervening, map(M_i-1), subcat, side)      hist.add(0, parent);      hist.add(0, Language.training.removeGapAugmentation(modEvent.head()));      hist.add(0, modEvent.headWord().tag());      hist.add(0, verbInterveningSym);      hist.add(0, mappedPrevModSym);      hist.add(1, modEvent.subcat());      hist.add(0, side);      break;    case 2:      // for p(M(t)_i | P, H, verbIntervening, map(M_i-1), subcat, side)      hist.add(0, parent);      hist.add(0, Language.training.removeGapAugmentation(modEvent.head()));      hist.add(0, verbInterveningSym);      hist.add(0, mappedPrevModSym);      hist.add(1, modEvent.subcat());      hist.add(0, side);      break;    case 3:      // for p(M(t)_i | P)      hist = histories[backOffLevel]; // efficiency hack: don't need subcat      hist.clear();      hist.add(0, parent);      break;    }    return hist;  }