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

matthew lon-capa-cvs@mail.lon-capa.org
Wed, 10 Mar 2004 18:41:37 -0000


This is a MIME encoded message

--matthew1078944097
Content-Type: text/plain

matthew		Wed Mar 10 13:41:37 2004 EDT

  Modified files:              
    /loncom/interface/statistics	lonstudentassessment.pm 
  Log:
  Modified general behavior of sums: If the student has not attempted any
  problem part in a sequence, they receive a sum of ' ' instead of '0'.  
  Modified &StudentTriesOnSequence and &StudentPerformanceOnSequence to return
  a score of ' ' when appropriate.  
  Modified (csv|excel|html)_outputstudent to catch the modified return value.
  Modified html_outputstudent and html_finish to compute statistics properly
  (Now keep track of the number of students contributing to the statistics,
  instead of the number not contributing).
  
  
--matthew1078944097
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20040310134137.txt"

Index: loncom/interface/statistics/lonstudentassessment.pm
diff -u loncom/interface/statistics/lonstudentassessment.pm:1.96 loncom/interface/statistics/lonstudentassessment.pm:1.97
--- loncom/interface/statistics/lonstudentassessment.pm:1.96	Mon Mar  8 12:31:37 2004
+++ loncom/interface/statistics/lonstudentassessment.pm	Wed Mar 10 13:41:37 2004
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstudentassessment.pm,v 1.96 2004/03/08 17:31:37 www Exp $
+# $Id: lonstudentassessment.pm,v 1.97 2004/03/10 18:41:37 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -715,8 +715,10 @@
                                               $seq,$show_links);
         }
         my $ratio='';
-        if ($chosen_output->{'sequence_sum'}) {
+        if ($chosen_output->{'sequence_sum'} && $score ne ' ') {
             $ratio .= sprintf("%3d",$score);
+        } else {
+            $ratio .= ' 'x3;
         }
         if ($chosen_output->{'sequence_max'}) {
             if ($chosen_output->{'sequence_sum'}) {
@@ -739,15 +741,21 @@
     }
     #
     # Total it up and store the statistics info.
-    my ($score,$max) = (0,0);
+    my ($score,$max);
     while (my ($symb,$seq_stats) = each (%{$studentstats})) {
         $Statistics->{$symb}->{'score'} += $seq_stats->{'score'};
         if ($Statistics->{$symb}->{'max'} < $seq_stats->{'max'}) {
             $Statistics->{$symb}->{'max'} = $seq_stats->{'max'};
         }
-        $score += $seq_stats->{'score'};
+        if ($seq_stats->{'score'} ne ' ') {
+            $score += $seq_stats->{'score'};
+            $Statistics->{$symb}->{'num_students'}++;
+        }
         $max   += $seq_stats->{'max'};
     }
+    if (! defined($score)) {
+        $score = ' 'x3;
+    }
     $Str .= ' '.' 'x(length($max)-length($score)).$score.'/'.$max;
     $Str .= " \n";
     #
@@ -775,37 +783,42 @@
 
 sub StudentAverageTotal {
     my $Str = "<h3>Summary Tables</h3>\n";
-    my $num_students = scalar(@Apache::lonstatistics::Students);
-    my $total_ave = 0;
-    my $total_max = 0;
+#    my $max_students;
+#    my $total_ave = 0;
+#    my $total_max = 0;
     $Str .= '<table border=2 cellspacing="1">'."\n";
     $Str .= "<tr><th>Title</th><th>Average</th><th>Maximum</th></tr>\n";
     foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
         my $ave;
-        if ($num_students > $nodata_count) {
-            $ave = int(100*($Statistics->{$seq->{'symb'}}->{'score'}/
-                            ($num_students-$nodata_count)))/100;
+        my $num_students = $Statistics->{$seq->{'symb'}}->{'num_students'};
+#        if ($num_students > $max_students) {
+#            $max_students = $num_students;
+#        }
+        if ($num_students > 0) {
+            $ave = int(100*
+                       ($Statistics->{$seq->{'symb'}}->{'score'}/$num_students)
+                       )/100;
         } else {
             $ave = 0;
         }
-        $total_ave += $ave;
+#        $total_ave += $ave;
         my $max = $Statistics->{$seq->{'symb'}}->{'max'};
-        $total_max += $max;
+#        $total_max += $max;
         $ave = sprintf("%.2f",$ave);
         $Str .= '<tr><td>'.$seq->{'title'}.'</td>'.
             '<td align="right">'.$ave.'&nbsp;</td>'.
             '<td align="right">'.$max.'&nbsp;'.'</td></tr>'."\n";
     }
-    $total_ave = sprintf('%.2f',$total_ave); # only two digit
-    $Str .= "</table>\n";
-    $Str .= '<table border=2 cellspacing="1">'."\n";
-    $Str .= '<tr><th>Number of Students</th><th>Average</th>'.
-        "<th>Maximum</th></tr>\n";
-    $Str .= '<tr>'.
-        '<td align="right">'.($num_students-$nodata_count).'</td>'.
-        '<td align="right">'.$total_ave.'&nbsp;'.'</td>'.
-        '<td align="right">'.$total_max.'&nbsp;'.'</td>';
+#    $total_ave = sprintf('%.2f',$total_ave); # only two digit
     $Str .= "</table>\n";
+#    $Str .= '<table border=2 cellspacing="1">'."\n";
+#    $Str .= '<tr><th>Number of Students</th><th>Average</th>'.
+#        "<th>Maximum</th></tr>\n";
+#    $Str .= '<tr>'.
+#        '<td align="right">'.$max_students.'</td>'.
+#        '<td align="right">'.$total_ave.'&nbsp;'.'</td>'.
+#        '<td align="right">'.$total_max.'&nbsp;'.'</td>';
+#    $Str .= "</table>\n";
     return $Str;
 }
 
@@ -1311,7 +1324,12 @@
                 }
             } else {
                 foreach my $value (@$rawdata) {
-                    $excel_sheet->write($rows_output,$cols_output++,$value);
+                    if ($score eq ' ' || !defined($value)) {
+                        $cols_output++;
+                    } else {                        
+                        $excel_sheet->write($rows_output,$cols_output++,
+                                            $value);
+                    }
                 }
             }
         }
@@ -1336,7 +1354,11 @@
                                              %replaceCells);
             }
         } elsif ($chosen_output->{'sequence_sum'}) {
-            $excel_sheet->write($rows_output,$cols_output++,$score);
+            if ($score eq ' ') {
+                $cols_output++;
+            } else {
+                $excel_sheet->write($rows_output,$cols_output++,$score);
+            }
         }
         if ($chosen_output->{'sequence_max'}) {
             $excel_sheet->write($rows_output,$cols_output++,$seq_max);
@@ -1627,6 +1649,7 @@
     my $performance_length = 0;
     my @TriesData = ();
     my $tries;
+    my $hasdata = 0; # flag - true if the student has any data on the sequence
     foreach my $resource (@{$seq->{'contents'}}) {
         next if ($resource->{'type'} ne 'assessment');
         my $resource_data = $studentdata->{$resource->{'symb'}};
@@ -1651,6 +1674,7 @@
             my $tries = 0;
             if(exists($resource_data->{'resource.'.$partnum.'.tries'})) {
                 $tries = $resource_data->{'resource.'.$partnum.'.tries'};
+                $hasdata =1;
             }
             #
             if ($awarded > 0) {
@@ -1713,6 +1737,9 @@
     if ($seq->{'randompick'}) {
         $max = $seq->{'randompick'};
     }
+    if (! $hasdata && $sum == 0) {
+        $sum = ' ';
+    }
     return ($Str,$performance_length,$sum,$max,\@TriesData);
 }
 
@@ -1750,6 +1777,7 @@
     my $symbol;
     my @ScoreData = ();
     my $partscore;
+    my $hasdata = 0; # flag, 0 if there were no submissions on the sequence
     foreach my $resource (@{$seq->{'contents'}}) {
         next if ($resource->{'type'} ne 'assessment');
         my $resource_data = $studentdata->{$resource->{'symb'}};
@@ -1768,13 +1796,17 @@
             $performance_length++; # one character per part
             $symbol = ' '; # default to space
             #
-            my $awarded = 0;
+            my $awarded;
             if (exists($resource_data->{'resource.'.$part.'.awarded'})) {
                 $awarded = $resource_data->{'resource.'.$part.'.awarded'};
                 $awarded = 0 if (! $awarded);
+                $hasdata = 1;
             }
             #
             $partscore = $weight*$awarded;
+            if (! defined($awarded)) {
+                $partscore = undef;
+            }
             $score += $partscore;
             $symbol = $partscore; 
             if (abs($symbol - sprintf("%.0f",$symbol)) < 0.001) {
@@ -1789,10 +1821,12 @@
                     $symbol = 'x';
                     $max -= $weight; # Do not count 'excused' problems.
                 }
+                $hasdata = 1;
             } else {
                 # Unsolved.  Did they try?
                 if (exists($resource_data->{'resource.'.$part.'.tries'})){
                     $symbol = '.';
+                    $hasdata = 1;
                 } else {
                     $symbol = ' ';
                 }
@@ -1812,6 +1846,9 @@
             }
             $Str .= $symbol;
         }
+    }
+    if (! $hasdata && $score == 0) {
+        $score = ' ';
     }
     return ($Str,$performance_length,$score,$max,\@ScoreData);
 }

--matthew1078944097--