public void Expose(ActorExposureRecord exposureRecord)
 {
     if (Filter1 == null) throw new ApplicationException("Filter1 cannot be null");
     if (Filter2 == null) throw new ApplicationException("Filter2 cannot be null");
     var key1 = Filter1(exposureRecord);
     if (!key1.HasValue) return;
     var key2 = Filter2(exposureRecord);
     if (!key2.HasValue) return;
     ObservableConcurrentDictionary<int, ObservableCollection<HistogramBins>> level2;
     if (!Exposures.TryGetValue(key1.Value, out level2))
     {
         level2 = new ObservableConcurrentDictionary<int, ObservableCollection<HistogramBins>>();
         if (!Exposures.TryAdd(key1.Value, level2)) if (!Exposures.TryGetValue(key1.Value, out level2)) throw new ApplicationException("Could not add level two dictionary.");
     }
     ObservableCollection<HistogramBins> bins;
     if (!level2.TryGetValue(key2.Value, out bins))
     {
         bins = new ObservableCollection<HistogramBins> { new HistogramBins(_histogramSource), new HistogramBins(_histogramSource) }; //peakSPL and Energy
         if (!level2.TryAdd(key2.Value, bins)) if (!level2.TryGetValue(key2.Value, out bins)) throw new ApplicationException("Could not add bins.");
     }
     bins[0].Add(exposureRecord.PeakSPL);
     bins[1].Add(exposureRecord.Energy);
 }
 public override void Expose(ActorExposureRecord exposureRecord)
 {
     if (GroupDescriptions == null || GroupDescriptions.Count < GroupLevel) throw new InvalidOperationException("There is no GroupDescription defined for this grouping level");
     var groupDescription = GroupDescriptions[GroupLevel];
     if (groupDescription.RecordToKey == null) throw new InvalidOperationException("RecordToKey cannot be null for the current grouping level");
     if (groupDescription.GroupName == null) throw new InvalidOperationException("GroupName cannot be null for the current grouping level");
     if (groupDescription.RecordFilter != null && (!groupDescription.RecordFilter(exposureRecord))) return;
     var key = groupDescription.RecordToKey(exposureRecord);
     HistogramBins[] bins;
     if (!_groupedExposures.TryGetValue(key, out bins))
     {
         bins = new HistogramBins[2];
         bins[0] = new HistogramBins(HistogramSource, LowBinValue, BinWidth, BinCount)
         {
             DataSetName = groupDescription.GroupName(exposureRecord),
             BarSeriesViewModel = { Fill = new SolidColorBrush(HistogramSource.GuidToColorMap[groupDescription.RecordToGuid(exposureRecord)]) },
         };
         GroupedBarSeriesViewModels[0].BarSeriesCollection.Add(bins[0].BarSeriesViewModel);
         bins[1] = new HistogramBins(HistogramSource, LowBinValue, BinWidth, BinCount)
         {
             DataSetName = groupDescription.GroupName(exposureRecord),
             BarSeriesViewModel = { Fill = new SolidColorBrush(HistogramSource.GuidToColorMap[groupDescription.RecordToGuid(exposureRecord)]) },
         };
         GroupedBarSeriesViewModels[1].BarSeriesCollection.Add(bins[1].BarSeriesViewModel);
         if (_groupedExposures.TryAdd(key, bins))
         {
             Debug.WriteLine(string.Format("Adding histograms for {0} at level {1}", groupDescription.GroupName(exposureRecord), GroupLevel));
         }
         else if (!_groupedExposures.TryGetValue(key, out bins)) throw new ApplicationException("Could not add exposure bins to GroupedExposuresHistogram.");
     }
     bins[0].Add(exposureRecord.PeakSPL);
     bins[1].Add(exposureRecord.Energy);
 }
 public virtual void Expose(ActorExposureRecord exposureRecord)
 {
     if (GroupDescriptions == null || GroupDescriptions.Count < GroupLevel) throw new InvalidOperationException("There is no GroupDescription defined for this grouping level");
     var groupDescription = GroupDescriptions[GroupLevel];
     if (groupDescription.RecordToKey == null) throw new InvalidOperationException("RecordToKey cannot be null for the current grouping level");
     if (groupDescription.GroupName == null) throw new InvalidOperationException("GroupName cannot be null for the current grouping level");
     if (groupDescription.RecordFilter != null && (!groupDescription.RecordFilter(exposureRecord))) return;
     var key = groupDescription.RecordToKey(exposureRecord);
     IGroupedExposures value;
     if (!_groupedExposures.TryGetValue(key, out value))
     {
         if (GroupDescriptions.Count > (GroupLevel + 2))
             value = new GroupedExposures(HistogramSource, LowBinValue, BinWidth, BinCount, GroupLevel + 1)
             {
                 GroupName = groupDescription.GroupName(exposureRecord),
                 GroupDescriptions = GroupDescriptions
             };
         else
             value = new GroupedExposuresHistogram(HistogramSource, LowBinValue, BinWidth, BinCount, GroupLevel + 1)
             {
                 GroupName = groupDescription.GroupName(exposureRecord),
                 GroupDescriptions = GroupDescriptions
             };
         if (_groupedExposures.TryAdd(key, value))
         {
             Debug.WriteLine(string.Format("Adding group {0} at level {1}", groupDescription.GroupName(exposureRecord), GroupLevel));
             Groups.Add(value);
         }
         else if (!_groupedExposures.TryGetValue(key, out value)) throw new ApplicationException("Could not add new exposure group");
     }
     value.Expose(exposureRecord);
 }