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

matthew lon-capa-cvs@mail.lon-capa.org
Fri, 10 Oct 2003 21:45:34 -0000


This is a MIME encoded message

--matthew1065822334
Content-Type: text/plain

matthew		Fri Oct 10 17:45:34 2003 EDT

  Modified files:              
    /loncom/interface/statistics	lonproblemanalysis.pm 
  Log:
  Major interface changes.  Still only do tries.  Do not print problem
  selection dialogs when we are already looking at a problem, added a 
  button to get to a page where you can select a problem.  Let the user
  select the number of graphs to display.  Hope to add Excel & csv data
  file generation too, but not today.
  
  
--matthew1065822334
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20031010174534.txt"

Index: loncom/interface/statistics/lonproblemanalysis.pm
diff -u loncom/interface/statistics/lonproblemanalysis.pm:1.30 loncom/interface/statistics/lonproblemanalysis.pm:1.31
--- loncom/interface/statistics/lonproblemanalysis.pm:1.30	Fri Oct 10 09:47:48 2003
+++ loncom/interface/statistics/lonproblemanalysis.pm	Fri Oct 10 17:45:34 2003
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonproblemanalysis.pm,v 1.30 2003/10/10 13:47:48 matthew Exp $
+# $Id: lonproblemanalysis.pm,v 1.31 2003/10/10 21:45:34 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -42,7 +42,19 @@
     #
     my @Students = @Apache::lonstatistics::Students;
     #
-    if (exists($ENV{'form.problemchoice'})) {
+    if (exists($ENV{'form.problemchoice'}) && !exists($ENV{'SelectAnother'})) {
+        $r->print('<input type="submit" name="ProblemAnalysis" value="'.
+                  &mt('Analyze Problem Again').'" />');
+        $r->print('&nbsp;'x5);
+        $r->print('<input type="submit" name="ClearCache" value="'.
+                  &mt('Clear Caches').'" />');
+        $r->print('&nbsp;'x5);
+        $r->print('<input type="hidden" name="problemchoice" value="'.
+                  $ENV{'form.problemchoice'}.'" />');
+        $r->print('<input type="submit" name="SelectAnother" value="'.
+                  &mt('Choose a different resource').'" />');
+        $r->print('&nbsp;'x5);
+        #
         $r->print('<hr />');
         &Apache::lonstatistics::Gather_Full_Student_Data($r);
         #
@@ -50,9 +62,6 @@
                      &Apache::lonnet::unescape($ENV{'form.problemchoice'})
                                            );
         #
-#        my ($firsttime,$lasttime) = 
-#            &Apache::loncoursedata::get_timestamp_data($symb,$resid);
-        #
         my $resource = &get_resource_from_symb($symb);
         if (defined($resource)) {
             my %Data = &get_problem_data($resource->{'src'});
@@ -101,61 +110,56 @@
         }
         $r->print('<hr />');
     } else {
+        $r->print('<input type="submit" name="ProblemAnalysis" value="'.
+                  &mt('Analyze Problem').'" />');
+        $r->print('&nbsp;'x5);
         $r->print('<h3>'.&mt('Please select a problem to analyze').'</h3>');
+        $r->print(&OptionResponseProblemSelector());
     }
-    # Okay, they asked for data, so make sure we get the latest data.
-    $r->print(&OptionResponseProblemSelector());
 }
 
 
 sub DoTriesAnalysis {
     my ($PerformanceData,$ORdata) = @_;
     my $mintries = 1;
-    my $maxtries = 10;
+    my $maxtries = $ENV{'form.NumPlots'};
     my %ResponseData = &analyze_option_data_by_tries($PerformanceData,
                                                  $mintries,$maxtries);
     my @Foils = sort(keys(%ResponseData));
     my %Row_Label;
     foreach my $foilid (@Foils) {
         my $value = $ORdata->{'Foiltext'}->{$foilid};
-#        &Apache::lonnet::logthis('row label '.$foilid.' = '.$value);
         $Row_Label{$foilid} = $ORdata->{'Foiltext'}->{$foilid};
     }
+    #
+    # Build up the table of row labels.
     my @Rows;
-    $Rows[0] = ['<td>&nbsp;</td>'];
-    for (my $i=$mintries;$i<=$maxtries;$i++) {
-        push (@{$Rows[0]},
-              '<th colspan="3">'.&mt('Attempt').' '.$i.'</th>');
-    }
-    $Rows[1] = ['<th>'.&mt('Foil').'</th>'];
-    for (my $i=$mintries;$i<=$maxtries;$i++) {
-        push (@{$Rows[1]},('<th>'.&mt('Correct').'</th>',
-                           '<th>'.&mt('Incorrect').'</th>',
-                           '<th>'.&mt('Percent Correct').'</th>',
-                           ));
+    $Rows[0]= [ '<th>'.&mt('Foil Number').'</th>', 
+                '<th>'.&mt('Foil Text').'</td>'];
+    my $table = '<table border="1" >'."\n";
+    my $index = 1;
+    foreach my $foilid (@Foils) {
+        $table .= '<tr><td>'.$index.'</td>'.
+            '<td>'.$Row_Label{$foilid}."</td></tr>\n";
+    } continue {
+        $index++;
     }
+    $table .= "</table>\n";
+    #
+    # Compute the data neccessary to make the plots
     my @PlotData;
     my @CumulativePlotData;
-    my $index = 1;
     foreach my $foilid (@Foils) {
-        my @Data = ('<td>'.$index.' '.$Row_Label{$foilid}.'</td>');
         for (my $i=$mintries;$i<=$maxtries;$i++) {
-            push(@Data,
-                 ('<td>'.$ResponseData{$foilid}->[$i]->{'correct'}.'</td>',
-                  '<td>'.$ResponseData{$foilid}->[$i]->{'incorrect'}.
-                  '</td>',
-                  '<td>'.
-                  sprintf("%4.2f",
-                          $ResponseData{$foilid}->[$i]->{'percent_corr'}).
-                  '</td>'));
             #
             # Gather the per-attempt data
             push (@{$PlotData[$i]->{'good'}},
                   $ResponseData{$foilid}->[$i]->{'percent_corr'});
             push (@{$PlotData[$i]->{'bad'}},
                   100-$ResponseData{$foilid}->[$i]->{'percent_corr'});
-        }
-        for (my $i=0;$i<=$maxtries;$i++) {
+            #
+            # Someday we may need the cumulative data and I think
+            # this is a neat way of computing it as we go along.
             push (@{$CumulativePlotData[$i]->{'good'}},
                   $CumulativePlotData[-1]->{'good'}+
                   $ResponseData{$foilid}->[$i]->{'correct'});
@@ -163,11 +167,11 @@
                   $CumulativePlotData[-1]->{'bad'}+
                   $ResponseData{$foilid}->[$i]->{'incorrect'});
         }
-        push(@Rows,\@Data);
-    } continue {
-        $index++;
     }
-    my @Data = ('<td></td>');
+    # 
+    # Build a table for the plots
+    $table .= "<table>\n";
+    my @Plots;
     for (my $i=$mintries;$i<=$maxtries;$i++) {
         my $minstu = $ResponseData{$Foils[0]}->[$i]->{'total'};
         my $maxstu = $ResponseData{$Foils[0]}->[$i]->{'total'};
@@ -200,14 +204,23 @@
                  $PlotData[$i]->{'good'},
                  $PlotData[$i]->{'bad'});
         }
-        push(@Data,'<td colspan="3">'.$graphlink.'</td>');
+        push(@Plots,$graphlink);
     }
-    push (@Rows,\@Data);
-    my $table = '<table border="1" >'."\n";
-    for (my $i=0; $i <=$#Rows;$i++) {
-        $table .= '<tr>'.join('',@{$Rows[$i]})."</tr>\n";
+    #
+    # Should this be something the user can set?  Too many dialogs!
+    my $plots_per_row = 2;
+    while (my $plotlink = shift(@Plots)) {
+        $table .= '<tr><td>'.$plotlink.'</td>';
+        for (my $i=1;$i<$plots_per_row;$i++) {
+            if ($plotlink = shift(@Plots)) {
+                $table .= '<td>'.$plotlink.'</td>';
+            } else {
+                $table .= '<td></td>';
+            }
+        }
+        $table .= "</tr>\n";
     }
-    $table .= '</table>';
+    $table .= "</table>\n";
     return ($table);
 }
 
@@ -270,10 +283,11 @@
     $Str .= '<tr>';
     $Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>';
     $Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>';
-    $Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b></td>';
-    $Str .= '<td align="center"><b>'.&mt('Analyze By').'</b></td>';
+#    $Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b></td>';
+    $Str .= '<td align="center">&nbsp;</td>';
     $Str .= '</tr>'."\n";
-    #
+    ##
+    ## 
     $Str .= '<tr><td align="center">'."\n";
     $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);
     $Str .= '</td>';
@@ -282,7 +296,7 @@
     $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5);
     $Str .= '</td>';
     #
-    $Str .= '<td align="center">';
+#    $Str .= '<td align="center">';
     my $only_seq_with_assessments = sub { 
         my $s=shift;
         if ($s->{'num_assess'} < 1) { 
@@ -291,31 +305,43 @@
             return 1;
         }
     };
-    $Str .= &Apache::lonstatistics::MapSelect('Maps','multiple,all',5,
+    &Apache::lonstatistics::MapSelect('Maps','multiple,all',5,
                                               $only_seq_with_assessments);
-    $Str .= '</td>';
+#    $Str .= '</td>';
     #
     $Str .= '<td>';
-    $Str .='<input type="radio" name="AnalyzeBy" value="Tries" ';
-    if ($ENV{'form.AnalyzeBy'} eq 'Tries') {
-        $Str .= 'checked ';
-    }
-    $Str .= '>'.&mt('Tries').'<br />';
-    $Str .='<input type="radio" name="AnalyzeBy" value="Time" ';
-    if ($ENV{'form.AnalyzeBy'} eq 'Time') {
-        $Str .= 'checked ';
+    $Str .= '<nobr>'.&mt('Analyze By ');
+    $Str .='<select name="AnalyzeBy" >';
+    #
+    $Str .= '<option value="Tries" ';
+    if (! exists($ENV{'form.AnalyzeBy'}) || $ENV{'form.AnalyzeBy'} eq 'Tries'){
+        # Default to Tries
+        $Str .= ' selected ';
+    }
+    $Str .= '>'.&mt('Tries').'</option>';
+    #
+    $Str .= '<option value="Time" ';
+    $Str .= ' selected ' if ($ENV{'form.AnalyzeBy'} eq 'Time');
+    $Str .= '>'.&mt('Time').'</option>';
+    $Str .= '</select></nobr><br />';
+    #
+    $Str .= '<br /><nobr>'.&mt('Number of Plots:');
+    $Str .= '<select name="NumPlots">';
+    if (! exists($ENV{'form.NumPlots'}) 
+        || $ENV{'form.NumPlots'} < 1 
+        || $ENV{'form.NumPlots'} > 20) {
+        $ENV{'form.NumPlots'} = 7;
+    }
+    foreach my $i (1,2,3,4,5,6,7,8,10,15,20) {
+        $Str .= '<option value="'.$i.'" ';
+        if ($ENV{'form.NumPlots'} == $i) { $Str.=' selected '; }
+        $Str .= '>'.$i.'</option>';
     }
-    $Str .= '>'.&mt('Time').'<br />';
+    $Str .= '</select></nobr>';
     $Str .= '</td>';
     #
     $Str .= '</tr>'."\n";
     $Str .= '</table>'."\n";
-    $Str .= '<input type="submit" name="ProblemAnalysis" value="'.
-        &mt('Analyze Problem').'" />';
-    $Str .= '&nbsp;'x5;
-    $Str .= '<input type="submit" name="ClearCache" value="'.
-        &mt('Clear Caches').'" />';
-    $Str .= '&nbsp;'x5;
     return ($Str);
 }
 

--matthew1065822334--