--- loncom/interface/statistics/lonstudentassessment.pm 2004/02/12 16:29:00 1.89
+++ loncom/interface/statistics/lonstudentassessment.pm 2004/02/20 16:38:49 1.93
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonstudentassessment.pm,v 1.89 2004/02/12 16:29:00 matthew Exp $
+# $Id: lonstudentassessment.pm,v 1.93 2004/02/20 16:38:49 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -306,6 +306,7 @@ the chart page.
#######################################################
sub CreateInterface {
my $Str = '';
+ $Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,&mt('Chart'));
# $Str .= &CreateLegend();
$Str .= '
'."\n";
$Str .= '';
@@ -474,6 +475,7 @@ my @OutputDataOptions =
sequence_max => 1,
grand_total => 1,
summary_table => 1,
+ maximum_row => 1,
shortdesc => 'Total Score and Maximum Possible for each '.
'Sequence or Folder',
longdesc => 'The score of each student as well as the '.
@@ -490,6 +492,7 @@ my @OutputDataOptions =
sequence_max => 1,
grand_total => 1,
summary_table => 1,
+ maximum_row => 1,
shortdesc => 'Score on each Problem Part',
longdesc =>'The students score on each problem part, computed as'.
'the part weight * part awarded',
@@ -504,7 +507,8 @@ my @OutputDataOptions =
sequence_sum => 0,
sequence_max => 0,
grand_total => 0,
- summary_table => 1,
+ summary_table => 0,
+ maximum_row => 0,
shortdesc => 'Number of Tries before success on each Problem Part',
longdesc =>'The number of tries before success on each problem part.',
},
@@ -519,6 +523,7 @@ my @OutputDataOptions =
sequence_max => 1,
grand_total => 1,
summary_table => 1,
+ maximum_row => 0,
shortdesc => 'Number of Problem Parts completed successfully.',
longdesc => 'The Number of Problem Parts completed successfully and '.
'the maximum possible for each student',
@@ -757,10 +762,12 @@ sub html_finish {
#
# Check for suppressed output and close the progress window if so
$r->print("\n");
- if ($single_student_mode) {
- $r->print(&SingleStudentTotal());
- } else {
- $r->print(&StudentAverageTotal());
+ if ($chosen_output->{'summary_table'}) {
+ if ($single_student_mode) {
+ $r->print(&SingleStudentTotal());
+ } else {
+ $r->print(&StudentAverageTotal());
+ }
}
$r->rflush();
return;
@@ -873,7 +880,8 @@ sub excel_initialize {
undef ($total_formula);
#
my $total_columns = scalar(&get_student_fields_to_show());
-
+ my $num_students = scalar(@Apache::lonstatistics::Students);
+ #
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
if ($chosen_output->{'every_problem'}) {
$total_columns += $seq->{'num_assess_parts'};
@@ -927,6 +935,24 @@ END
$rows_output = 0;
$cols_output = 0;
#
+ # Determine rows
+ my $header_row = $rows_output++;
+ my $description_row = $rows_output++;
+ $rows_output++; # blank row
+ my $summary_header_row;
+ if ($chosen_output->{'summary_table'}) {
+ $summary_header_row = $rows_output++;
+ $rows_output+= scalar(&Apache::lonstatistics::Sequences_with_Assess());
+ $rows_output++;
+ }
+ my $sequence_name_row = $rows_output++;
+ my $resource_name_row = $rows_output++;
+ my $maximum_data_row = $rows_output++;
+ if (! $chosen_output->{'maximum_row'}) {
+ $rows_output--;
+ }
+ my $first_data_row = $rows_output++;
+ #
# Create sheet
$excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
#
@@ -945,25 +971,15 @@ END
# File::Temp is used to determine the temporary directory.
$excel_workbook->set_tempdir($Apache::lonnet::tmpdir);
#
+ my $format = &Apache::loncommon::define_excel_formats($excel_workbook);
+ #
# Add a worksheet
my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
$sheetname = &Apache::loncommon::clean_excel_name($sheetname);
$excel_sheet = $excel_workbook->addworksheet($sheetname);
#
- # Define some potentially useful formats
- my $format;
- $format->{'header'} = $excel_workbook->add_format(bold => 1,
- bottom => 1,
- align => 'center');
- $format->{'bold'} = $excel_workbook->add_format(bold=>1);
- $format->{'h1'} = $excel_workbook->add_format(bold=>1, size=>18);
- $format->{'h2'} = $excel_workbook->add_format(bold=>1, size=>16);
- $format->{'h3'} = $excel_workbook->add_format(bold=>1, size=>14);
- $format->{'date'} = $excel_workbook->add_format(num_format=>
- 'mmm d yyyy hh:mm AM/PM');
- #
# Put the course description in the header
- $excel_sheet->write($rows_output,$cols_output++,
+ $excel_sheet->write($header_row,$cols_output++,
$ENV{'course.'.$ENV{'request.course.id'}.'.description'},
$format->{'h1'});
$cols_output += 3;
@@ -985,24 +1001,21 @@ END
$sectionstring = "Section ".$Sections[0];
}
}
- $excel_sheet->write($rows_output,$cols_output++,$sectionstring,
+ $excel_sheet->write($header_row,$cols_output++,$sectionstring,
$format->{'h3'});
$cols_output += scalar(@Sections);
#
# Put the date in there too
- $excel_sheet->write($rows_output++,$cols_output++,
+ $excel_sheet->write($header_row,$cols_output++,
'Compiled on '.localtime(time),$format->{'h3'});
#
$cols_output = 0;
- $excel_sheet->write($rows_output++,$cols_output++,
+ $excel_sheet->write($description_row,$cols_output++,
$chosen_output->{'shortdesc'},
$format->{'h3'});
- #
- # Figure out the rows we need
- my $sequence_name_row = $rows_output+1;
- my $resource_name_row = $sequence_name_row+1;
- my $maximum_data_row = $sequence_name_row+2;
- my $first_data_row = $sequence_name_row+3;
+ ##############################################
+ # Output headings for the raw data
+ ##############################################
#
# Add the student headers
$cols_output = 0;
@@ -1015,11 +1028,11 @@ END
my $total_formula_string = '=0';
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
$excel_sheet->write($sequence_name_row,,
- $cols_output,$seq->{'title'},$format->{'h3'});
+ $cols_output,$seq->{'title'},$format->{'bold'});
# Determine starting cell
$seq->{'Excel:startcell'}=
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($maximum_data_row,$cols_output);
+ ($first_data_row,$cols_output);
$seq->{'Excel:startcol'}=$cols_output;
my $count = 0;
if ($chosen_output->{'every_problem'}) {
@@ -1053,7 +1066,7 @@ END
} else {
$seq->{'Excel:endcell'} =
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($maximum_data_row,$cols_output-1);
+ ($first_data_row,$cols_output-1);
$seq->{'Excel:endcol'} = $cols_output-1;
}
# Create the formula for summing up this sequence
@@ -1067,7 +1080,7 @@ END
# Determine cell the score is held in
$seq->{'Excel:scorecell'} =
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($maximum_data_row,$cols_output);
+ ($first_data_row,$cols_output);
$seq->{'Excel:scorecol'}=$cols_output;
if ($chosen_output->{'base'} eq 'parts correct total') {
$excel_sheet->write($resource_name_row,$cols_output++,
@@ -1088,7 +1101,7 @@ END
#
$total_formula_string.='+'.
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($maximum_data_row,$cols_output-1);
+ ($first_data_row,$cols_output-1);
if ($chosen_output->{'sequence_max'}) {
$excel_sheet->write($resource_name_row,$cols_output++,
'maximum',
@@ -1100,9 +1113,10 @@ END
$format->{'bold'});
}
$total_formula = $excel_sheet->store_formula($total_formula_string);
- #
+ ##############################################
# Output a row for MAX, if appropriate
- if ($chosen_output->{'scores'}) {
+ ##############################################
+ if ($chosen_output->{'maximum_row'}) {
$cols_output = 0;
foreach my $field (&get_student_fields_to_show()) {
if ($field eq 'username' || $field eq 'fullname' ||
@@ -1169,8 +1183,57 @@ END
$total_formula,undef,
%total_cell_translation);
}
- } # End of MAXIMUM row output if ($chosen_output->{'scores'}) {
+ } # End of MAXIMUM row output if ($chosen_output->{'maximum_row'}) {
$rows_output = $first_data_row;
+ ##############################################
+ # Output summary table, which actually is above the sequence name row.
+ ##############################################
+ if ($chosen_output->{'summary_table'}) {
+ $cols_output = 0;
+ $excel_sheet->write($summary_header_row,$cols_output++,
+ 'Summary Table',$format->{'bold'});
+ if ($chosen_output->{'maximum_row'}) {
+ $excel_sheet->write($summary_header_row,$cols_output++,
+ 'Maximum',$format->{'bold'});
+ }
+ $excel_sheet->write($summary_header_row,$cols_output++,
+ 'Average',$format->{'bold'});
+ $excel_sheet->write($summary_header_row,$cols_output++,
+ 'Median',$format->{'bold'});
+ $excel_sheet->write($summary_header_row,$cols_output++,
+ 'Std Dev',$format->{'bold'});
+ my $row = $summary_header_row+1;
+ foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
+ $cols_output = 0;
+ $excel_sheet->write($row,$cols_output++,
+ $seq->{'title'},
+ $format->{'bold'});
+ if ($chosen_output->{'maximum_row'}) {
+ $excel_sheet->write
+ ($row,$cols_output++,
+ '='.
+ &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
+ ($maximum_data_row,$seq->{'Excel:scorecol'})
+ );
+ }
+ my $range =
+ &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
+ ($first_data_row,$seq->{'Excel:scorecol'}).
+ ':'.
+ &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
+ ($first_data_row+$num_students-1,$seq->{'Excel:scorecol'});
+ $excel_sheet->write($row,$cols_output++,
+ '=AVERAGE('.$range.')');
+ $excel_sheet->write($row,$cols_output++,
+ '=MEDIAN('.$range.')');
+ $excel_sheet->write($row,$cols_output++,
+ '=STDEV('.$range.')');
+ $row++;
+ }
+ }
+ ##############################################
+ # Take care of non-excel initialization
+ ##############################################
#
# Let the user know what we are doing
my $studentcount = scalar(@Apache::lonstatistics::Students);