[LON-CAPA-cvs] cvs: loncom /interface/statistics lonstudentassessment.pm

matthew lon-capa-cvs@mail.lon-capa.org
Thu, 12 Feb 2004 21:15:47 -0000


This is a MIME encoded message

--matthew1076620547
Content-Type: text/plain

matthew		Thu Feb 12 16:15:47 2004 EDT

  Modified files:              
    /loncom/interface/statistics	lonstudentassessment.pm 
  Log:
  Added summary table to excel output.
  
  
--matthew1076620547
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20040212161547.txt"

Index: loncom/interface/statistics/lonstudentassessment.pm
diff -u loncom/interface/statistics/lonstudentassessment.pm:1.89 loncom/interface/statistics/lonstudentassessment.pm:1.90
--- loncom/interface/statistics/lonstudentassessment.pm:1.89	Thu Feb 12 11:29:00 2004
+++ loncom/interface/statistics/lonstudentassessment.pm	Thu Feb 12 16:15:47 2004
@@ -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.90 2004/02/12 21:15:47 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -474,6 +474,7 @@
        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 +491,7 @@
        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 +506,8 @@
        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 +522,7 @@
        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 +761,12 @@
     #
     # Check for suppressed output and close the progress window if so
     $r->print("</pre>\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 +879,8 @@
     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 +934,24 @@
     $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);
     #
@@ -963,7 +988,7 @@
                                                     '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 +1010,21 @@
             $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 +1037,11 @@
     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 +1075,7 @@
         } 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 +1089,7 @@
         # 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 +1110,7 @@
         #
         $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 +1122,10 @@
                             $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 +1192,57 @@
                                          $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); 

--matthew1076620547--