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

matthew lon-capa-cvs@mail.lon-capa.org
Tue, 01 Apr 2003 17:00:24 -0000


This is a MIME encoded message

--matthew1049216424
Content-Type: text/plain

matthew		Tue Apr  1 12:00:24 2003 EDT

  Modified files:              
    /loncom/interface/statistics	lonproblemstatistics.pm 
  Log:
  Modified to accept a hash ref from loncoursedata::get_problem_statistics.
  Fields output is now configured in one place instead of 3.  The @Fields array
  holds the description of each field, its format, and much more.
  Removed the output options 'Degree of Difficulty Plot' and 'Percent Wrong
  Plot' (see below).
  Plots are now available from the 'ungrouped statistics' page.
  &statistics_html_table_data now loops through @Fields to determine its behavior.
  Added &statistics_table_header to output the proper fields and links for the
  HTML statistics tables.
  &get_statistics (the wrapper for loncoursedata::get_problem_statistics) now
  requires the sequence, resource, part, and problem number as inputs in order
  to add extra data to the returned hash reference.
  
  
--matthew1049216424
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20030401120024.txt"

Index: loncom/interface/statistics/lonproblemstatistics.pm
diff -u loncom/interface/statistics/lonproblemstatistics.pm:1.48 loncom/interface/statistics/lonproblemstatistics.pm:1.49
--- loncom/interface/statistics/lonproblemstatistics.pm:1.48	Fri Mar 28 10:20:59 2003
+++ loncom/interface/statistics/lonproblemstatistics.pm	Tue Apr  1 12:00:24 2003
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonproblemstatistics.pm,v 1.48 2003/03/28 15:20:59 matthew Exp $
+# $Id: lonproblemstatistics.pm,v 1.49 2003/04/01 17:00:24 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -56,6 +56,108 @@
 use Apache::lonstatistics;
 use Spreadsheet::WriteExcel;
 
+my @Fields = (
+           { name => 'problem_num',
+             title => 'P#',
+             align => 'right',
+             color => '#FFFFE6' },
+           { name   => 'container',
+             title  => 'Container',
+             align  => 'left',
+             color  => '#FFFFE6',
+             sortable => 'yes' },
+           { name   => 'title',
+             title  => 'Title',
+             align  => 'left',
+             color  => '#FFFFE6',
+             special  => 'link',
+             sortable => 'yes', },
+           { name   => 'part', 
+             title  => 'Part',
+             align  => 'left',
+             color  => '#FFFFE6' },
+           { name   => 'num_students',
+             title  => '#Stdnts',
+             align  => 'right',
+             color  => '#EEFFCC',
+             format => '%d',
+             sortable  => 'yes',
+             graphable => 'yes',
+             long_title => 'Number of Students Attempting Problem' },
+           { name   => 'tries',
+             title  => 'Tries',
+             align  => 'right',
+             color  => '#EEFFCC',
+             format => '%d',
+             sortable  => 'yes',
+             graphable => 'yes',
+             long_title => 'Total Number of Tries' },
+           { name   => 'max_tries',
+             title  => 'Max Tries',
+             align  => 'right',
+             color  => '#DDFFFF',
+             format => '%d',
+             sortable  => 'yes',
+             graphable => 'yes',
+             long_title => 'Maximum Number of Tries' },
+           { name   => 'mean_tries',
+             title  => 'Mean Tries',
+             align  => 'right',
+             color  => '#DDFFFF',
+             format => '%5.2f',
+             sortable  => 'yes',
+             graphable => 'yes',
+             long_title => 'Average Number of Tries' },
+           { name   => 'std_tries',
+             title  => 'S.D. tries',
+             align  => 'right',
+             color  => '#DDFFFF',
+             format => '%5.2f',
+             sortable  => 'yes',
+             graphable => 'yes',
+             long_title => 'Standard Deviation of Number of Tries' },
+           { name   => 'skew_tries',
+             title  => 'Skew Tries',
+             align  => 'right',
+             color  => '#DDFFFF',
+             format => '%5.2f',
+             sortable  => 'yes',
+             graphable => 'yes',
+             long_title => 'Skew of Number of Tries' },
+           { name   => 'deg_of_diff',
+             title  => 'DoDiff',
+             align  => 'right',
+             color  => '#DDFFFF',
+             format => '%5.2f',
+             sortable  => 'yes',
+             graphable => 'yes',
+             long_title => 'Degree of Difficulty' },
+           { name   => 'num_solved',
+             title  => '#YES',
+             align  => 'right',
+             color  => '#FFDDDD',
+             format => '%d',
+             sortable  => 'yes',
+             graphable => 'yes',
+             long_title => 'Number of Students able to Solve' },
+           { name   => 'num_override',
+             title  => '#yes',
+             align  => 'right',
+             color  => '#FFDDDD',
+             format => '%d',
+             sortable  => 'yes',
+             graphable => 'yes',
+             long_title => 'Number of Students given Override' },
+           { name   => 'per_wrong',
+             title  => '%Wrng',
+             align  => 'right',
+             color  => '#FFFFE6',
+             format => '%4.1f',
+             sortable  => 'yes',
+             graphable => 'yes',
+             long_title => 'Percent Wrong' },
+);
+
 ###############################################
 ###############################################
 
@@ -112,7 +214,7 @@
 variables $output_mode and $show.  @OutputOptions holds the descriptions of
 the output options and the values for $output_mode and $show.
 
- Based on code from lonstudentassessment.pm.
+Based on code from lonstudentassessment.pm.
 
 =cut
 
@@ -142,20 +244,6 @@
        mode => 'excel',
        show => 'all',
      },
-     { name  => 'Degree of Difficulty Plot',
-       value => 'plot deg diff',
-       description => 'Generate a plot of the degree of difficulty of each '.
-           'problem part.',
-       mode => 'plot',
-       show => 'deg of diff',
-     },
-     { name  => 'Percent Wrong Plot',
-       value => 'plot per wrong',
-       description => 'Generate a plot showing the percent of students who '.
-           'were unable to complete each problem part',
-       mode => 'plot',
-       show => 'per wrong',
-     },
      );
 
 sub OutputDescriptions {
@@ -196,6 +284,10 @@
     # Build the form element
     $Str = qq/<select size="5" name="$elementname">/;
     foreach my $option (@OutputOptions) {
+        if (exists($option->{'special'}) && 
+            $option->{'special'} =~ /do not show/) {
+            next;
+        }
         $Str .= "\n".'    <option value="'.$option->{'value'}.'"';
         $Str .= " selected " if ($option->{'value'} eq $selected);
         $Str .= ">".$option->{'name'}."<\/option>";
@@ -265,6 +357,7 @@
     $r->print('<input type="hidden" name="statsfirstcall" value="no" />');
     $r->print('<input type="hidden" name="sortby" value="'.$ENV{'form.sortby'}.
               '" />');
+    $r->print('<input type="hidden" name="plot" value="" />');
     if (! exists($ENV{'form.statsfirstcall'})) {
         $r->print(<<ENDMSG);
 <p>
@@ -294,12 +387,6 @@
     } elsif ($output_mode eq 'excel') {
         $r->print("<h2>Preparing Excel Spreadsheet</h2>");
         &output_excel($r);
-    } elsif ($output_mode eq 'plot') {
-        if ($show eq 'deg of diff') {
-            &plot_statistics($r,'DoDiff');
-        } elsif ($show eq 'per wrong') {
-            &plot_statistics($r,'%Wrng');
-        }
     } else {
         $r->print("<h1>Not implemented</h1>");
     }
@@ -324,35 +411,23 @@
     my ($r) = @_;
     my $problem_num = 0;
     #$r->print(&ProblemStatisticsLegend());
-    my @Header = ("Title","Part","#Stdnts","Tries","Mod",
-                  "Mean","#YES","#yes","%Wrng","DoDiff",
-                  "S.D.","Skew.");#,"D.F.1st","D.F.2nd");
-    # #FFFFE6 #EEFFCC #DDFFFF FFDDDD #DDFFDD #FFDDFF
     foreach my $sequence (&Apache::lonstatistics::Sequences_with_Assess()) {
         next if ($sequence->{'num_assess'}<1);
         $r->print("<h3>".$sequence->{'title'}."</h3>");
         $r->print('<table border="0"><tr><td bgcolor="#777777">'."\n");
         $r->print('<table border="0" cellpadding="3">'."\n");
-        $r->print('<tr bgcolor="#FFFFE6"><th>'.
-                  join("</th><th>",@Header)."</th></tr>\n");
+        $r->print('<tr bgcolor="#FFFFE6">');
+        my $Str = &statistics_table_header('no container no plots');
+        $r->print('<tr bgcolor="#FFFFE6">'.$Str."</tr>\n");
         foreach my $resource (@{$sequence->{'contents'}}) {
             next if ($resource->{'type'} ne 'assessment');
             foreach my $part (@{$resource->{'parts'}}) {
                 $problem_num++;
-                my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD,
-                    $SKEW) = &get_statistics($resource->{'symb'},$part);
-                #
-                $part = '&nbsp;' if ($part == 0);
-                #
-                my $wrongpercent = 0;
-                if (defined($num) && $num > 0) {
-                    $wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10;
-                }
+                my $data = &get_statistics($sequence,$resource,$part,
+                                           $problem_num);
                 my $option = '';
-                $r->print('<tr>'.&statistics_html_table_data
-                          ($resource,$part,$num,$tries,$mod,$mean,$Solved,
-                           $solved,$wrongpercent,$DegOfDiff,$STD,$SKEW,
-                           $option).
+                $r->print('<tr>'.&statistics_html_table_data($data,
+                                                             'no container').
                           "</tr>\n");
             }
         }
@@ -381,39 +456,29 @@
 sub output_html_ungrouped {
     my ($r,$option) = @_;
     #
+    if (exists($ENV{'form.plot'}) && $ENV{'form.plot'} ne '') {
+        &plot_statistics($r,$ENV{'form.plot'});
+    }
+    #
     my $problem_num = 0;
     my $show_container = 0;
     my $show_part = 0;
     #$r->print(&ProblemStatisticsLegend());
-    my @Header = ("Title","Part","#Stdnts","Tries","Mod",
-                  "Mean","#YES","#yes","%Wrng","DoDiff",
-                  "S.D.","Skew");#,"D.F.1st","D.F.2nd");
-    #
     my $sortby = undef;
-    foreach (@Header) {
-        if ($ENV{'form.sortby'} eq $_) {
-            $sortby = $_;
+    foreach my $field (@Fields) {
+        if ($ENV{'form.sortby'} eq $field->{'name'}) {
+            $sortby = $field->{'name'};
         }
     }
-    if (! defined($sortby) || $sortby eq '') {
-        $sortby = 'Container';
+    if (! defined($sortby) || $sortby eq '' || $sortby eq 'problem_num') {
+        $sortby = 'container';
     }
     # If there is more than one sequence, list their titles
     my @Sequences = &Apache::lonstatistics::Sequences_with_Assess();
-    if (@Sequences > 1) {
-        unshift(@Header,"Container");
-        $show_container = 1;
-    }
-    # 
-    # If the option for showing the problem number is needed, push that
-    # on the list too
-    if (defined($option) && $option =~ /show probnum/) {
-        unshift(@Header,"P#");
+    if (@Sequences < 1) {
+        $option .= ' no container';
     }
     #
-    $r->print('<table border="0"><tr><td bgcolor="#777777">'."\n");
-    $r->rflush();
-    #
     # Compile the data
     my @Statsarray;
     foreach my $sequence (@Sequences) {
@@ -422,57 +487,18 @@
             next if ($resource->{'type'} ne 'assessment');
             foreach my $part (@{$resource->{'parts'}}) {
                 $problem_num++;
-                my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD,
-                    $SKEW) = &get_statistics($resource->{'symb'},$part);
-                #
+                my $data = &get_statistics($sequence,$resource,$part,
+                                           $problem_num);
                 $show_part = 1 if ($part ne '0');
-                $part = '&nbsp;' if ($part == 0);
                 #
-                my $wrongpercent = 0;
-                if (defined($num) && $num > 0) {
-                    $wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10;
-                }
-                push (@Statsarray,
-                      { 'sequence' => $sequence,
-                        'resource' => $resource,
-                        'Title' => $resource->{'title'},
-                        'Part'  => $part,
-                        '#Stdnts' => $num,
-                        'Tries' => $tries,
-                        'Mod' => $mod,
-                        'Mean' => $mean,
-                        '#YES' => $Solved,
-                        '#yes' => $solved,
-                        '%Wrng' => $wrongpercent,
-                        'DoDiff' => $DegOfDiff,
-                        'S.D.' => $STD,
-                        'Skew' => $SKEW,
-                        'problem_num' => $problem_num,
-                      });
+                push (@Statsarray,$data);
             }
         }
     }
     #
-    # Table Headers
-    $r->print('<table border="0" cellpadding="3">'."\n");
-    my $Str = '';
-    foreach (@Header) {
-        next if ($_ eq 'Part' && !$show_part);
-        # Do not allow sorting on some fields
-        if ($_ eq $sortby || /^(Part|P\#)$/) {  
-            $Str .= '<th>'.$_.'</th>';
-        } else {
-            $Str .= '<th>'.
-     '<a href="javascript:document.Statistics.sortby.value='."'$_'".
-         ';document.Statistics.submit();">'.
-             $_.'</a></th>';
-        }
-    }
-    $r->print('<tr bgcolor="#FFFFE6">'.$Str."</tr>\n");
-    #
     # Sort the data
     my @OutputOrder;
-    if ($sortby eq 'Container') {
+    if ($sortby eq 'container') {
         @OutputOrder = @Statsarray;
     } else {
         # $sortby is already defined, so we can charge ahead
@@ -480,8 +506,8 @@
             # Alpha comparison
             @OutputOrder = sort {
                 lc($a->{$sortby}) cmp lc($b->{$sortby}) ||
-                    lc($a->{'Title'}) cmp lc($b->{'Title'}) ||
-                        lc($a->{'Part'}) cmp lc($b->{'Part'});
+                    lc($a->{'title'}) cmp lc($b->{'title'}) ||
+                        lc($a->{'part'}) cmp lc($b->{'part'});
             } @Statsarray;
         } else {
             # Numerical comparison
@@ -501,30 +527,35 @@
                 }
                 if ($retvalue eq '0') {
                     $retvalue = $b->{$sortby} <=> $a->{$sortby} ||
-                                lc($a->{'Title'}) <=> lc($b->{'Title'}) ||
-                                lc($a->{'Part'})  <=> lc($b->{'Part'});
+                                lc($a->{'title'}) <=> lc($b->{'title'}) ||
+                                lc($a->{'part'})  <=> lc($b->{'part'});
                 }
                 $retvalue;
             } @Statsarray;
         }
     }
-    $option .= ',no part' if (! $show_part);
-    foreach my $row (@OutputOrder) {
-        $r->print('<tr>');
-        if (defined($option) && $option =~ /show probnum/) {
-            $r->print('<td bgcolor="#FFFFE6">'.$row->{'problem_num'}.'</td>');
-        }
-        if ($show_container) {
-            $r->print('<td bgcolor="#FFFFE6">'
-                      .$row->{'sequence'}->{'title'}.'</td>');
-        }
-        $r->print(&statistics_html_table_data
-                  ($row->{'resource'},$row->{'Part'},$row->{'#Stdnts'},
-                   $row->{'Tries'},$row->{'Mod'},$row->{'Mean'},
-                   $row->{'#YES'},$row->{'#yes'},$row->{"\%Wrng"},
-                   $row->{'DoDiff'},$row->{'S.D.'},$row->{'Skew'},
-                   $option));
-        $r->print("</tr>\n");
+    $option .= 'no part' if (! $show_part);
+    my $num_output = 0;
+    #
+    # output the headers
+    $r->print('<table border="0"><tr><td bgcolor="#777777">'."\n");
+    $r->print('<table border="0" cellpadding="3">'."\n");
+    my $Str = &statistics_table_header($option.' sortable');
+    $r->print('<tr bgcolor="#FFFFE6">'.$Str."</tr>\n");
+    #
+    foreach my $rowdata (@OutputOrder) {
+        $num_output++;
+        if ($num_output % 25 == 0) {
+            $r->print("</table>\n</td></tr></table>\n");
+            #
+            $r->print('<table border="0"><tr><td bgcolor="#777777">'."\n");
+            $r->print('<table border="0" cellpadding="3">'."\n");
+            my $Str = &statistics_table_header($option.' sortable');
+            $r->print('<tr bgcolor="#FFFFE6">'.$Str."</tr>\n");
+            $r->rflush();
+        }
+        $r->print('<tr>'.&statistics_html_table_data($rowdata,$option).
+                  "</tr>\n");
     }
     $r->print("</table>\n");
     $r->print("</td></tr></table>\n");
@@ -616,35 +647,31 @@
     $cols_output=0;
     #
     # Add the headers
-    my @Header = ("Container","Title","Part","#Stdnts","Tries","Mod",
-                  "Mean","#YES","#yes","%Wrng","DoDiff",
-                  "S.D.","Skew.");#,"D.F.1st","D.F.2nd");
-    foreach (@Header) {
-        $excel_sheet->write($rows_output,$cols_output++,$_);
+    foreach my $field (@Fields) {
+        next if ($field->{'name'} eq 'problem_num');
+        $excel_sheet->write($rows_output,$cols_output++,$field->{'title'});
     }
     $rows_output++;
     #
     # Write the data
+    my $problem_num=0;
     foreach my $sequence (&Apache::lonstatistics::Sequences_with_Assess()) {
         next if ($sequence->{'num_assess'}<1);
         foreach my $resource (@{$sequence->{'contents'}}) {
             next if ($resource->{'type'} ne 'assessment');
             foreach my $part (@{$resource->{'parts'}}) {
                 $cols_output=0;
-                my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD,
-                    $SKEW) = &get_statistics($resource->{'symb'},$part);
+                $problem_num++;
+                my $data = &get_statistics($sequence,$resource,$part,
+                                           $problem_num);
                 #
                 if (!defined($part) || $part eq '') {
                     $part = ' ';
                 }
-                my $wrongpercent = 0;
-                if (defined($num) && $num > 0) {
-                    $wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10;
-                }
-                foreach ($sequence->{'title'},$resource->{'title'},$part,
-                         $num,$tries,$mod,$mean,$Solved,$solved,$wrongpercent,
-                         $DegOfDiff,$STD,$SKEW) {
-                    $excel_sheet->write($rows_output,$cols_output++,$_);
+                foreach my $field (@Fields) {
+                    next if ($field->{'name'} eq 'problem_num');
+                    $excel_sheet->write($rows_output,$cols_output++,
+                                        $data->{$field->{'name'}});
                 }
                 $rows_output++;
             }
@@ -674,38 +701,62 @@
 ###############################################
 ###############################################
 sub statistics_html_table_data {
-    my ($resource,$part,$num,$tries,$mod,$mean,$Solved,$solved,$wrongpercent,
-        $DegOfDiff,$STD,$SKEW,$options) = @_;
+    my ($data,$options) = @_;
     my $row = '';
-    $row .= '<td bgcolor="#FFFFE6">'.
-        '<a href="'.$resource->{'src'}.'" target="_blank" >'.
-            $resource->{'title'}.'</a>'.
-                '</td>';
-    $row .= '<td bgcolor="#FFFFE6">'.$part.'</td>' if ($options !~ /no part/);
-    foreach ($num,$tries) {
-        $row .= '<td bgcolor="#EEFFCC" align="right">'.$_.'</td>';
-    }
-    foreach ($mod) {
-        $row .= '<td bgcolor="#DDFFFF" align="right">'.$_.'</td>';
-    }
-    foreach ($mean) {
-        $row .= '<td bgcolor="#DDFFFF" align="right">'.
-                  sprintf("%5.2f",$_).'</td>';
-    }
-    foreach ($Solved,$solved) {
-        $row .= '<td bgcolor="#DDFFFF" align="right">'.$_.'</td>';
-    }
-    foreach ($wrongpercent) {
-        $row .= '<td bgcolor="#DDFFFF" align="right">'.
-                  sprintf("%5.1f",$_).'</td>';
-    }
-    foreach ($DegOfDiff,$STD,$SKEW) {
-        $row .= '<td bgcolor="#FFDDDD" align="right">'.
-                  sprintf("%5.2f",$_).'</td>';
+    foreach my $field (@Fields) {
+        next if ($options =~ /no $field->{'name'}/);
+        $row .= '<td bgcolor="'.$field->{'color'}.'"';
+        if (exists($field->{'align'})) {
+            $row .= ' align="'.$field->{'align'}.'"';
+            }
+        $row .= '>';
+        if (exists($field->{'special'}) && $field->{'special'} eq 'link') {
+            $row .= '<a href="'.$data->{$field->{'name'}.'.link'}.
+                ' target="_blank">';
+        }
+        if (exists($field->{'format'})) {
+            $row .= sprintf($field->{'format'},$data->{$field->{'name'}});
+        } else {
+            $row .= $data->{$field->{'name'}};
+        }
+        if (exists($field->{'special'}) && $field->{'special'} eq 'link') {
+            $row.= '</a>';
+        }
+        $row .= '</td>';
     }
     return $row;
 }
 
+sub statistics_table_header {
+    my ($options) = @_;
+    my $header_row;
+    foreach my $field (@Fields) {
+        next if ($options =~ /no $field->{'name'}/);
+        $header_row .= '<th>';
+        if ($options =~ /sortable/ && 
+            exists($field->{'sortable'}) && $field->{'sortable'} eq 'yes') {
+            $header_row .= '<a href="javascript:'.
+                'document.Statistics.sortby.value='."'".$field->{'name'}."'".
+                    ';document.Statistics.submit();">';
+        }
+        $header_row .= $field->{'title'};
+        if ($options =~ /sortable/) {
+            $header_row.= '</a>';
+        }
+        if ($options !~ /no plots/        && 
+            exists($field->{'graphable'}) && 
+            $field->{'graphable'} eq 'yes') {
+            $header_row.=' (';
+            $header_row .= '<a href="javascript:'.
+                "document.Statistics.plot.value='$field->{'name'}'".
+                    ';document.Statistics.submit();">';
+            $header_row .= 'plot</a>)';
+        }
+        $header_row .= '</th>';
+    }
+    return $header_row;
+}
+
 ###############################################
 ###############################################
 
@@ -721,58 +772,44 @@
     my ($r,$datafield) = @_;
     my @Data;
     #
-    my %Fields = ('#Stdnts'=> 0,
-                  'Tries'  => 1,
-                  'Mod'    => 2,
-                  'Mean'   => 3,
-                  '#YES'   => 4,
-                  '#yes'   => 5,
-                  '%Wrng'  => 9,
-                  'DoDiff' => 6,
-                  'S.D.'   => 7,
-                  'Skew'   => 8,);
-    #
-    my $field = '%Wrng';
-    foreach (keys(%Fields)) {
-        $field = $_ if ($datafield eq $_);
+    #
+    my $sortfield = undef;
+    my $title = undef;
+    foreach my $field (@Fields) {
+        if ($datafield eq $field->{'name'} &&
+            exists($field->{'graphable'}) && $field->{'graphable'} eq 'yes') {
+            $sortfield = $field->{'name'};
+            $title = $field->{'long_title'};
+        }
     }
-    my $fieldindex = $Fields{$field};
+    return if (! defined($sortfield) || $sortfield eq '');
+    &Apache::lonnet::logthis('data field = '.$datafield);
     #
     my $Max = 0;
+    my $problem_num = 0;
     foreach my $sequence (&Apache::lonstatistics::Sequences_with_Assess()) {
         next if ($sequence->{'num_assess'}<1);
         foreach my $resource (@{$sequence->{'contents'}}) {
             next if ($resource->{'type'} ne 'assessment');
             foreach my $part (@{$resource->{'parts'}}) {
-                my @Results= &get_statistics($resource->{'symb'},$part);
-                my ($num,$Solved,$solved) = @Results[0,4,5];
-                my $wrongpercent = 0;
-                if (defined($num) && $num > 0) {
-                    $wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10;
-                }
-                push (@Results,$wrongpercent);
-                my $data = $Results[$fieldindex];
-                $data = 0 if ($data eq 'nan');
-                $Max = $data if ($Max<$data);
-                push (@Data,$data);
+                my $problem_number++;
+                my $data = &get_statistics($sequence,$resource,$part,
+                                           $problem_num);
+                my $value = $data->{$sortfield};
+                $Max = $value if ($Max < $value);
+                push (@Data,$value);
             }
         }
     }
     #
     # Print out plot request
-    my $title = 'Percent Wrong';
-    if ($field eq 'DoDiff') {
-        $title = 'Degree of Difficulty';
-    }
-    my $yaxis = 'Percent';
-    if ($field eq 'DoDiff') {
-        $yaxis = '';
-    } elsif ($field ne '%Wrng') {
-        $yaxis = '';
+    my $yaxis = '';
+    if ($sortfield eq 'per_wrong') {
+        $yaxis = 'Percent';
     }
     #
     # Determine appropriate value for $Max
-    if ($field eq 'DoDiff') {
+    if ($sortfield eq 'deg_of_diff') {
         if ($Max > 0.5) {
             $Max = 1;
         } elsif ($Max > 0.2) {
@@ -780,7 +817,7 @@
         } elsif ($Max > 0.1) {
             $Max = 0.2;
         }
-    } elsif ($field eq '%Wrng') {
+    } elsif ($sortfield eq 'per_wrong') {
         if ($Max > 50) {
             $Max = 100;
         } elsif ($Max > 25) {
@@ -801,7 +838,7 @@
     #
     # Print out the data
     $ENV{'form.sortby'} = 'Contents';
-    &output_html_ungrouped($r,'show probnum');
+#    &output_html_ungrouped($r);
     return;
 }
 
@@ -818,21 +855,16 @@
 ###############################################
 sub DrawGraph {
     my ($values,$title,$xaxis,$yaxis,$Max)=@_;
-    $title = '' if (! defined($title));    
+    $title = '' if (! defined($title));
     $xaxis = '' if (! defined($xaxis));
     $yaxis = '' if (! defined($yaxis));
     #
     my $sendValues = join(',', @$values);
     my $sendCount = scalar(@$values);
-    if ( $Max > 1 ) {
-	if ($Max % 10) {
-            if ( int($Max) < $Max ) {
-	    	$Max++;
-		$Max = int($Max);
-	    }
-	}
-    } else { 
-        $Max = 1; 
+    $Max =1 if ($Max < 1);
+    if ( int($Max) < $Max ) {
+        $Max++;
+        $Max = int($Max);
     }
     my @GData = ($title,$xaxis,$yaxis,$Max,$sendCount,$sendValues);
     return '<IMG src="/cgi-bin/graph.png?'.
@@ -840,17 +872,24 @@
 }
 
 sub get_statistics {
-    my ($symb,$part) = @_;
+    my ($sequence,$resource,$part,$problem_num) = @_;
     #
+    my $symb = $resource->{'symb'};
     my $courseid = $ENV{'request.course.id'};
     #
     my $students = \@Apache::lonstatistics::Students;
     if ($Apache::lonstatistics::SelectedSections[0] eq 'all') {
         $students = undef;
     }
-    my @Results = &Apache::loncoursedata::get_problem_statistics
+    my $data = &Apache::loncoursedata::get_problem_statistics
                         ($students,$symb,$part,$courseid);
-    return @Results;
+    $data->{'part'}        = $part;
+    $data->{'problem_num'} = $problem_num;
+    $data->{'container'}   = $sequence->{'title'};
+    $data->{'title'}       = $resource->{'title'};
+    $data->{'title.link'}  = $resource->{'src'};
+    #
+    return $data;
 }
 
 ###############################################
@@ -874,7 +913,7 @@
     $Ptr .= '<b>Tries</b></td>';
     $Ptr .= '<td>Total number of tries for solving the problem.';
     $Ptr .= '</td></tr><tr><td>';
-    $Ptr .= '<b>Mod</b></td>';
+    $Ptr .= '<b>Max Tries</b></td>';
     $Ptr .= '<td>Largest number of tries for solving the problem by a student.';
     $Ptr .= '</td></tr><tr><td>';
     $Ptr .= '<b>Mean</b></td>';

--matthew1049216424--