function updateSideEffectMonitor(gen) {
if (gen == 0){
d3.select("#monitor")
.selectAll('circle').remove()
}
let xScale = d3
.scaleLinear()
.domain([0, simulationSteps - 1])
.range([margin, width - margin]);
let yScale = d3
.scaleLinear()
.domain([1, 0])
.range([margin, height - margin]);
history.traffic.forEach(
d => (d.averageTraffic = d3.mean(d.roadTraffic, e => e))
);
history.noise.forEach(d => (d.averageNoise = d3.mean(d.roadNoise, e => e)));
let initialValue = 0;
history.co2.forEach(
d =>
(d.totalCarbonEmission = d.carbonEmission.reduce(
(totalValue, currentValue) => {
return totalValue + currentValue;
},
initialValue
))
);
d3.select("#monitor")
.selectAll('.trafficDot')
.data(history.traffic)
.enter()
.append('circle')
.attr('cx', d => xScale(d.generationNumber))
.attr('cy', d => yScale(d.averageTraffic))
.attr('r',0)
.attr('fill','red')
.attr('class','trafficDot')
.transition()
.duration(genTime)
.attr('r',10)
;
d3.select("#monitor")
.selectAll('.noiseDot')
.data(history.noise)
.transition()
.attr('cx', d => xScale(d.generationNumber))
.attr('cy', d => yScale(d.averageNoise));
}