/**
** SickStudentsModelWithUI.java
**
** Copyright 2011 by Joseph Harrison, Mark Coletti, Cristina Metgher, Andrew Crooks
** George Mason University.
**
** Licensed under the Academic Free License version 3.0
**
** See the file "LICENSE" for more information
**
** $Id$
*
**/
package sim.app.geo.sickStudents;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import org.jfree.data.xy.XYSeries;
import sim.display.Console;
import sim.display.Controller;
import sim.display.Display2D;
import sim.display.GUIState;
import sim.engine.Schedule;
import sim.engine.SimState;
import sim.engine.Steppable;
import sim.portrayal.geo.GeomVectorFieldPortrayal;
import sim.portrayal.simple.OvalPortrayal2D;
import sim.util.gui.SimpleColorMap;
import sim.util.media.chart.*;
public class SickStudentsModelWithUI extends GUIState {
public SickStudentsModel model;
public Display2D display;
public JFrame displayFrame;
public TimeSeriesChartGenerator diseaseTimeSeriesChart = new TimeSeriesChartGenerator() ;
public JFrame diseaseTimeSeriesFrame;
public XYSeries susceptibleSeries = new XYSeries("Susceptible");
public XYSeries infectedSeries = new XYSeries("Infected");
public XYSeries recoveredSeries = new XYSeries("Recovered");
// GIS portrayals
GeomVectorFieldPortrayal elementarySchoolCatchmentsPortrayal = new GeomVectorFieldPortrayal();
GeomVectorFieldPortrayal middleSchoolCatchmentsPortrayal = new GeomVectorFieldPortrayal();
GeomVectorFieldPortrayal highSchoolCatchmentsPortrayal = new GeomVectorFieldPortrayal();
GeomVectorFieldPortrayal elementarySchoolsPortrayal = new GeomVectorFieldPortrayal();
GeomVectorFieldPortrayal middleSchoolsPortrayal = new GeomVectorFieldPortrayal();
GeomVectorFieldPortrayal highSchoolsPortrayal = new GeomVectorFieldPortrayal();
GeomVectorFieldPortrayal householdsPortrayal = new GeomVectorFieldPortrayal();
double lastTime = 0, time = 0;
public SickStudentsModelWithUI() {
super(new SickStudentsModel(System.currentTimeMillis()));
model = (SickStudentsModel) state;
}
public SickStudentsModelWithUI(SimState state) {
super(state);
model = (SickStudentsModel) state;
}
public static String getName() {
return "Sick Students";
}
public Object getSimulationInspectedObject() {
return state;
} // non-volatile
public void start() {
super.start();
// set up our portrayals
setupPortrayals();
susceptibleSeries.clear();
infectedSeries.clear();
recoveredSeries.clear();
}
public void load(SimState state) {
super.load(state);
setupPortrayals();
}
public void init(final Controller c) {
super.init(c);
display = new Display2D(model.width, model.height, this);
display.attach(elementarySchoolCatchmentsPortrayal, "Elementary School Catchments");
display.attach(middleSchoolCatchmentsPortrayal, "Middle School Catchments");
display.attach(highSchoolCatchmentsPortrayal, "High School Catchments");
display.attach(elementarySchoolsPortrayal, "Elementary Schools");
display.attach(middleSchoolsPortrayal, "Middle Schools");
display.attach(highSchoolsPortrayal, "High Schools");
display.attach(householdsPortrayal, "Households");
displayFrame = display.createFrame();
controller.registerFrame(displayFrame);
displayFrame.setVisible(true); // this makes the map window visible by default
c.registerFrame(createDiseaseTimeSeriesFrame());
diseaseTimeSeriesFrame.setVisible(true); // this makes the SIR chart visible by default
((Console) controller).setSize(380, 540);
}
@SuppressWarnings("serial")
public void setupPortrayals() {
// setup GIS portrayals
elementarySchoolCatchmentsPortrayal.setField(model.elementarySchoolZones);
elementarySchoolCatchmentsPortrayal.setPortrayalForAll(new CatchmentPortrayal(
new SimpleColorMap(0.0, 1.0, Color.LIGHT_GRAY, Color.RED), model));
middleSchoolCatchmentsPortrayal.setField(model.middleSchoolZones);
middleSchoolCatchmentsPortrayal.setPortrayalForAll(new CatchmentPortrayal(
new SimpleColorMap(0.0, 1.0, Color.LIGHT_GRAY, Color.RED), model));
highSchoolCatchmentsPortrayal.setField(model.highSchoolZones);
highSchoolCatchmentsPortrayal.setPortrayalForAll(new CatchmentPortrayal(
new SimpleColorMap(0.0, 1.0, Color.LIGHT_GRAY, Color.RED), model));
elementarySchoolsPortrayal.setField(model.elementarySchools);
elementarySchoolsPortrayal.setPortrayalForAll(new OvalPortrayal2D(Color.BLUE, 3.0));
middleSchoolsPortrayal.setField(model.middleSchools);
middleSchoolsPortrayal.setPortrayalForAll(new OvalPortrayal2D(Color.BLUE, 5.0));
highSchoolsPortrayal.setField(model.highSchools);
highSchoolsPortrayal.setPortrayalForAll(new OvalPortrayal2D(Color.blue, 7.0));
householdsPortrayal.setField(model.householdsField);
householdsPortrayal.setPortrayalForAll(new OvalPortrayal2D(Color.black, 1.0));
display.reset();
display.setBackdrop(Color.WHITE);
display.repaint();
this.scheduleRepeatingImmediatelyAfter(new Steppable() {
@Override
public void step(SimState state) {
time = state.schedule.getTime();
if (time == Schedule.AFTER_SIMULATION) {
return;
}
int sCount = 0, iCount = 0, rCount = 0;
for (Student s : model.students) {
switch (s.status) {
case SUSCEPTIBLE:
sCount++;
break;
case INFECTED:
iCount++;
break;
case RECOVERED:
rCount++;
break;
}
}
susceptibleSeries.add(time, (sCount / (double) model.students.size()));
infectedSeries.add(time, (iCount / (double) model.students.size()));
recoveredSeries.add(time, (rCount / (double) model.students.size()));
diseaseTimeSeriesChart.update(ChartGenerator.FORCE_KEY, true);
}
});
diseaseTimeSeriesChart.repaint();
}
public JFrame createDiseaseTimeSeriesFrame() {
diseaseTimeSeriesChart = new TimeSeriesChartGenerator();
diseaseTimeSeriesChart.setTitle("Disease Statistics");
diseaseTimeSeriesChart.setDomainAxisLabel("Days");
diseaseTimeSeriesChart.setRangeAxisLabel("Proportion of Students");
((TimeSeriesAttributes)(diseaseTimeSeriesChart.addSeries(susceptibleSeries, null))).setStrokeColor(Color.blue);
((TimeSeriesAttributes)(diseaseTimeSeriesChart.addSeries(infectedSeries, null))).setStrokeColor(Color.red);
diseaseTimeSeriesChart.addSeries(recoveredSeries, null);
diseaseTimeSeriesChart.setForeground(Color.black);
diseaseTimeSeriesFrame = diseaseTimeSeriesChart.createFrame(this);
diseaseTimeSeriesFrame.getContentPane().setLayout(new BorderLayout());
diseaseTimeSeriesFrame.getContentPane().add(diseaseTimeSeriesChart, BorderLayout.CENTER);
diseaseTimeSeriesFrame.pack();
return diseaseTimeSeriesFrame;
}
public void quit() {
super.quit();
if (displayFrame != null) {
displayFrame.dispose();
}
displayFrame = null; // let gc
display = null; // let gc
if (diseaseTimeSeriesFrame != null) {
diseaseTimeSeriesFrame.dispose();
}
diseaseTimeSeriesFrame = null;
}
public static void main(String[] args) {
new SickStudentsModelWithUI().createController();
}
}