public void run() {
		checkCharges();
		view.showContourPlot(false, null);
		double[] data = new double[numberOfAtoms * 4];
		for (int i = 0; i < numberOfAtoms; i++) {
			data[i] = atom[i].rx;
			data[i + numberOfAtoms] = atom[i].ry;
			data[i + numberOfAtoms * 2] = atom[i].vx;
			data[i + numberOfAtoms * 3] = atom[i].vy;
		}
		if (obstacles.isEmpty()) {
			stateHolder = new StateHolder(getModelTime(), heatBathActivated() ? heatBath.getExpectedTemperature() : 0, getNumberOfParticles(), data);
		} else {
			int nmov = 0;
			for (int i = 0; i < obstacles.size(); i++) {
				if (obstacles.get(i).isMovable())
					nmov++;
			}
			if (nmov == 0) {
				stateHolder = new StateHolder(getModelTime(), heatBathActivated() ? heatBath.getExpectedTemperature() : 0, getNumberOfParticles(), data);
			} else {
				double[] data2 = new double[nmov * 4];
				int k = 0;
				RectangularObstacle obs = null;
				for (int i = 0; i < obstacles.size(); i++) {
					obs = obstacles.get(i);
					if (obs.isMovable()) {
						data2[k] = obs.x;
						data2[k + nmov] = obs.y;
						data2[k + nmov * 2] = obs.vx;
						data2[k + nmov * 3] = obs.vy;
						k++;
					}
				}
				stateHolder = new StateHolder(getModelTime(), heatBathActivated() ? heatBath.getExpectedTemperature() : 0, getNumberOfParticles(), data, nmov, data2);
			}
		}
		super.run();
	}