public static ReturnsFromWeightsResult DoIt_DailyWeights(ConstructGen<double> dailyWts_, DateTime? maxPnlDate_=null)
    {
      var wts = (ConstructGen<double>)dailyWts_.Clone();

      var indexPrices = Singleton<ComIndexPrices>.Instance.GetData(DataConstants.DATA_START, DateTime.Today, false);
      var indexReturns = indexPrices.ToReturns().GetSubValues(dailyWts_.Dates.First(),DateTime.Today);


      var coms = Singleton<ComIDs>.Instance.ToArray();

      var spotPnl = new ConstructGen<double>(wts.ColumnHeadings) {Name = wts.Name};
      var dollImpWts = new ConstructGen<double>(wts.ColumnHeadings);

      double[] currentWts = Utils.GetArrayOfValue(0d, wts.ArrayLength);

      for (int i = 0; i < indexReturns.Dates.Count; ++i)
      {
        var date = indexReturns.Dates[i];

        if (maxPnlDate_.HasValue && date > maxPnlDate_.Value)
          break;

        var todayIndexReturns = indexReturns.GetValues(date);
        var todayStratReturns=new double[wts.ArrayLength];

        for (int j = 0; j < todayStratReturns.Length; ++j)
        {
          // set today's strat returns
          todayStratReturns[j] = currentWts[j]*todayIndexReturns[j];

          // dollar impact weights
          currentWts[j] *= (1d + todayStratReturns[j]);
        }

        spotPnl.SetValues(date, todayStratReturns);

        // if the weights have change at the end of today, update currentWts so they affect tomorrows pnl
        if (wts.Dates.Contains(indexReturns.Dates[i]))
          currentWts = wts.GetValues(indexReturns.Dates[i]);

        dollImpWts.SetValues(date, (double[]) currentWts.Clone());
      }

      return new ReturnsFromWeightsResult(dailyWts_.Name)
      {
        SpotPnl = spotPnl,
        OriginalWts = dailyWts_,
        DailyDollarImpactedWeights = dollImpWts,
        SpotsUsed = indexPrices.GetSubValues(dailyWts_.Dates.First(),DateTime.Today)
      };
    }