public static void Generate(DateTime start)
        {
            var allContractsCTD = FutureContractsFactory.CreateFutureCTDContracts();
            var contractsToRun = UserSpecifiedContracts != null ? allContractsCTD.Where(c => UserSpecifiedContracts.Select(x => x.ToUpper()).Contains(c.Ric)) : allContractsCTD;

            var rollSetting = new RollSettings
            {
                RollType = RollType.CTD,
                CTDSource = GenType,
                Ctdoverrides = GetCTDOverrideFromFile(),
            };

            var ctddataResult = new List<Tuple<string, CTDItem[]>>();
            foreach (var contract in contractsToRun)
            {
                var rollLogic = RollFactory.CreateRollLogic(contract, rollSetting);
                var futureRollLogic = rollLogic as FirstNoticeCTDRollLogic;
                if (futureRollLogic != null)
                {
                    var futstat = futureRollLogic.FetchFutureStaticFromCarbon().Where(x => x.FirstNoticeDate > start.AddMonths(-6)).OrderBy(d => d.FirstNoticeDate).ToArray();
                    var generator = RollFactory.CreateCtdGenerator(GenType);                  
                    generator.CTDOverrides = rollSetting.Ctdoverrides;
                    generator.IsSmoothStart = false;     // this is hardcoded to false because we do not want to look at past CTD in the CTD generation process
                    generator.StartDate = start;

                    var ctddata = generator.CreateCTDSeries(futstat, AsOf());

                    ctddataResult.Add(new Tuple<string, CTDItem[]>(contract.BbgBase.Market(), ctddata));
                }

            }


            var ctdresultPerGroup = ctddataResult.GroupBy(c => c.Item1)
                                        .Select(g =>
                                        {
                                            var result = g.SelectMany(x => x.Item2).ToArray();  
      

                                            bool successful = false;
                                            if (!IsTopup)
                                            {
                                                var newFrame = result.FutureStaticToFrame();
                                                newFrame.Print();
                                                successful = CarbonModel.SaveFrameToCarbon(CarbonFutureStaticAdaptor.GetFutureStaticMoniker(g.Key), newFrame).Result.Successful;
                                            }
                                            else
                                                successful = CarbonFutureStaticAdaptor.InsertDataToCarbonFrame(result, g.Key).Result.Successful;

                                            return successful;
                                        });

           
            if(ctdresultPerGroup.Any(r => !r))
                    throw new Exception("Unsuccessfully saving results to carbon");

            
        }
 public static RollCache CreateRollCache(RollSettings setting)
 {
     switch (setting.RollType)
     {
         case RollType.CT:
             return new CTCache(setting.DataSource);
         case RollType.Future:                    
         case RollType.CTD:
             return new FutureRollCache(setting);
         default:
             throw new ArgumentOutOfRangeException();
     }
 }
        public HistSeriesChartViewModel()
        {
            var rollsetting = new RollSettings {DataSource = RollDataSource.CarbonLive};
            futureRollCache = new FutureRollCache(rollsetting);   // we use carbon live for this.
            futureContracts = FutureContractsFactory.CreateFutureContracts();

            var task = new Task(() =>
            {
                try
                {
                    var bonds = Generator.Go(Generator.CashBondRolling.Monthly);
                            var dictionary = new Dictionary<BondCurves, List<CTDLine<BondSpreads>>>
                      {
                        {BondCurves.USD3mLibor, Generator.GetSpreads(bonds, BondCurves.USD3mLibor)}
                      };

                      m_cd = new ChartDataSource(chartComponents_: new[]
                                {
                                new ChartComponent(),
                                new ChartComponent(),
                                new ChartComponent()
                                },
                                            bonds_: bonds,
                                            spreads_: dictionary
                                            );
                        
                      // subscribe to live curve and live bonds
                      m_live = new LiveDataModel(bonds.Last());
                    
                }
                catch (Exception ex_)
                {
                    Logger.Error("Error building CTD data for seasonality application", typeof(HistSeriesChartViewModel), ex_);
                }
            });

            task.ContinueWith( t =>
            {
                // hook up carbon and live data result
                m_live.SubscribeForLiveCurveAndBondPrices();                
            });

            task.ContinueWith(t => m_live.BondSpreadModel().BondSpreadResultObservable().Where(b => b != null)
                                .ObserveOn(SynchronizationContext.Current)
                                .Subscribe(LiveChartUpdate), TaskScheduler.FromCurrentSynchronizationContext());
            task.Start();

        }
        public static IRollLogic CreateRollLogic(IContract future, RollSettings rollsettings)
        {
            var futureContract = future as FutureContract;
            if (futureContract == null) return null;

            var rollcontrol = rollsettings.RollMethod ?? futureContract.ContractEnd;    // if not roll method set use default
            switch (rollcontrol)
            {
                case RollControl.FirstNotice:                    
                    return futureContract.HasCTD ? new FirstNoticeCTDRollLogic(future, CreateCtdGenerator(rollsettings.CTDSource)) : new FirstIssueFutureRollLogic(future);
                case RollControl.DeliveryDate:
                    break;
                case RollControl.LastTrade:
                    break;
                case RollControl.MonthEnd:
                    return new MonthEndFutureRollLogic(future);                
                default:
                    throw new ArgumentOutOfRangeException();
            }

            return null;
        }