double[] scomponent() {

    DisturbanceSmoother smoother = new DisturbanceSmoother();
    smoother.setSsf(ssf);
    smoother.process(ssfdata);
    SmoothingResults sstates = smoother.calcSmoothedStates();
    double[] cmp = new double[ssfdata.getCount()];
    DataBlock z = new DataBlock(ssf.getStateDim());
    DataBlock zc = z.drop(2, 0);
    for (int i = 0; i < cmp.length; ++i) {
      zc.copy(S.row(i));
      cmp[i] = sstates.zcomponent(i, z);
    }
    return cmp;
  }
  // time-varying trading days
  // @Test
  public void demoTD() {
    TsData s = Data.X;
    CompositeResults rslts = TramoSeatsProcessingFactory.process(s, TramoSeatsSpecification.RSA5);
    PreprocessingModel regarima = rslts.get("preprocessing", PreprocessingModel.class);
    SeatsResults seats = rslts.get("decomposition", SeatsResults.class);
    assertTrue(seats != null && regarima != null);

    if (regarima.isMultiplicative()) {
      s = s.log();
    }
    int[] calPos =
        regarima.description.getRegressionVariablePositions(ComponentType.CalendarEffect);
    UcarimaModel ucm = seats.getUcarimaModel();
    // compute the full decomposition...
    SsfUcarima stoch = new SsfUcarima(ucm);
    ExtendedSsfData xdata = new ExtendedSsfData(new SsfData(s, null));
    xdata.setForecastsCount(s.getFrequency().intValue());
    Matrix x =
        regarima
            .description
            .buildRegressionVariables()
            .all()
            .matrix(new TsDomain(s.getStart(), xdata.getCount()));
    RegSsf xssf = new RegSsf(stoch, x.subMatrix());

    Filter filter = new Filter();
    filter.setInitializer(new DiffuseSquareRootInitializer());
    filter.setSsf(xssf);
    DiffuseFilteringResults fr = new DiffuseFilteringResults(true);
    fr.getVarianceFilter().setSavingP(true);
    fr.getFilteredData().setSavingA(true);
    filter.process(xdata, fr);
    Smoother smoother = new Smoother();
    smoother.setSsf(xssf);
    smoother.setCalcVar(true);
    SmoothingResults sm = new SmoothingResults();
    smoother.process(xdata, fr, sm);

    Smoother lsmoother = new Smoother();
    lsmoother.setSsf(stoch);
    lsmoother.setCalcVar(true);
    SmoothingResults lsm = new SmoothingResults();
    ExtendedSsfData xldata =
        new ExtendedSsfData(new SsfData(regarima.linearizedSeries(false), null));
    xldata.setForecastsCount(s.getFrequency().intValue());
    lsmoother.process(xldata, lsm);

    int spos = stoch.cmpPos(1);
    DataBlock Z = new DataBlock(xssf.getStateDim());
    double[] v = new double[xdata.getCount()];
    double[] c = new double[xdata.getCount()];
    double[] svar = sm.componentVar(spos);
    double[] slvar = lsm.componentVar(spos);
    int start = regarima.description.getRegressionVariablesStartingPosition();
    for (int i = 0; i < v.length; ++i) {
      Z.set(spos, 1);
      for (int j = 0; j < calPos.length; ++j) {
        Z.set(stoch.getStateDim() + calPos[j], x.get(i, calPos[j]));
      }
      v[i] = sm.zvariance(i, Z);
      Z.set(spos, 0);
      c[i] = sm.zvariance(i, Z);
      System.out.print(svar[i]);
      System.out.print('\t');
      System.out.print(slvar[i]);
      System.out.print('\t');
      System.out.print(c[i]);
      System.out.print('\t');
      System.out.println(v[i]);
    }
    System.out.println(sm.P(50));
    System.out.println(sm.P(svar.length - 1));
    System.out.println(regarima.estimation.getLikelihood().getBVar());
  }