public void runGrader() throws FileNotFoundException {
		printer.open(assignment);
		for (AssignmentSubmission submission : assignment) {
			for (AssignmentProblem problem : assignment.getProblems()) {
				AssignmentProblemGrader grader = graders.get(problem);
				double grade = grader.gradeQuestion(assignment, problem, submission);
				submission.addGrade(problem, grade);
				questionTotals.put(problem, questionTotals.get(problem) + grade);
			}
			if (submission.getTotal() != 0)
				nonZeroCount += 1;
			printer.printStudentSubmission(submission);
		}
		printer.close();

		for (AssignmentProblem question : assignment.getProblems()) {
			questionAverages.put(question, questionTotals.get(question) / nonZeroCount);
			questionStandardDevs.put(question, 0.0);
		}

		gradeAverage = totalGrade / nonZeroCount;

		for (AssignmentProblem question : assignment.getProblems()) {
			questionAverages.put(question, questionTotals.get(question) / nonZeroCount);
			questionStandardDevs.put(question, 0.0);
		}

		gradeStandardDev = 0;
		for (AssignmentSubmission submission : assignment.getSubmissions()) {
			gradeStandardDev += Math.pow((submission.getTotal() - gradeAverage), 2);
			for (AssignmentProblem question : assignment.getProblems()) {
				double dev = Math.pow(submission.getGrades().get(question) - questionAverages.get(question), 2);
				questionStandardDevs.put(question, questionStandardDevs.get(question) + dev);
			}
		}
		gradeStandardDev = Math.sqrt(gradeStandardDev / nonZeroCount);
		for (AssignmentProblem question : assignment.getProblems()) {
			questionStandardDevs.put(question, Math.sqrt(questionStandardDevs.get(question) / nonZeroCount));
		}
	}