my ($events, $key_names, $start_date, $end_date, $ref_events, $verbose) = @_;
my @event_dates = sort {$a cmp $b} (keys %$ref_events);
warn scalar(@event_dates), " dates\n" if $verbose;
my $max_workers = 0;
my @data_timings = ();
my %tot_area = ();
my $num_curr_workers = 0;
my %hash_curr_workers = (
map {$_ => 0 } @$key_names);
foreach my $event_date (@event_dates) {
last if $end_date and ($event_date gt $end_date);
next unless exists $events->{$event_date};
if ((scalar(@data_timings) == 0) and $start_date and ($event_date gt $start_date)) {
push @data_timings, [$start_date, { %hash_curr_workers }];
%tot_area = %hash_curr_workers;
}
my $topup_hash = $events->{$event_date};
foreach my $key_id (keys %$topup_hash) {
$hash_curr_workers{$key_id} += $topup_hash->{$key_id};
$num_curr_workers += $topup_hash->{$key_id};
}
# Due to rounding errors, the sums may be slightly different
die sum(values %hash_curr_workers)."!=$num_curr_workers" if abs(sum(values %hash_curr_workers) - $num_curr_workers) > $rounding_error_threshold;
next if $start_date and ($event_date lt $start_date);
#FIXME It should be normalised by the length of the time interval
map {$tot_area{$_} += $hash_curr_workers{$_}} keys %hash_curr_workers;
$max_workers = $num_curr_workers if ($num_curr_workers > $max_workers);
# We need to repeat the previous value to have an histogram shape
push @data_timings, [$event_date, { %{$data_timings[-1]->[1]} }] if @data_timings;
push @data_timings, [$event_date, { %hash_curr_workers }];
}
push @data_timings, [$end_date, { %{$data_timings[-1]->[1]} }] if @data_timings and $end_date and ($data_timings[-1]->[0] lt $end_date);
warn "Last timing: ", Dumper $data_timings[-1] if $verbose and @data_timings;
warn "Highest y value: ", $max_workers, "\n" if $verbose;
warn "Total area: ", Dumper \%tot_area if $verbose;
return [\%tot_area, \@data_timings, $max_workers];
}