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

matthew lon-capa-cvs@mail.lon-capa.org
Thu, 02 Dec 2004 21:53:34 -0000


This is a MIME encoded message

--matthew1102024414
Content-Type: text/plain

matthew		Thu Dec  2 16:53:34 2004 EDT

  Modified files:              
    /loncom/interface/statistics	lonproblemanalysis.pm 
                                	lonstathelpers.pm 
  Log:
  "finished" numerical response analysis - unit conversion does not work
  reliably yet, so it is disabled. 
  lonstathelpers: now &get_problem_data returns the 'unit' for a response.
  lonproblemanalysis: Added earlier detection of broken problem analysis 
    (See bug 3669 for why this came up)
    radio_response_analysis: Make sure $concepts is at least an array ref
       when it's undef, just to avoid an ISE.
  
  
--matthew1102024414
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20041202165334.txt"

Index: loncom/interface/statistics/lonproblemanalysis.pm
diff -u loncom/interface/statistics/lonproblemanalysis.pm:1.105 loncom/interface/statistics/lonproblemanalysis.pm:1.106
--- loncom/interface/statistics/lonproblemanalysis.pm:1.105	Fri Nov 12 14:47:29 2004
+++ loncom/interface/statistics/lonproblemanalysis.pm	Thu Dec  2 16:53:33 2004
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonproblemanalysis.pm,v 1.105 2004/11/12 19:47:29 matthew Exp $
+# $Id: lonproblemanalysis.pm,v 1.106 2004/12/02 21:53:33 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -38,6 +38,7 @@
 use HTML::Entities();
 use Time::Local();
 use Spreadsheet::WriteExcel();
+use capa;
 
 my $plotcolors = ['#33ff00', 
                   '#0033cc', '#990000', '#aaaa66', '#663399', '#ff9933',
@@ -201,6 +202,13 @@
                                                        'stats_status');
         $r->print(&numerical_one_dimensional_plot($r,600,150,$answers));
     }
+    #
+    if (ref($response_data) ne 'ARRAY') {
+        $r->print('<h2>'.
+                  &mt('There is no submission data for this resource').
+                  '</h2>');
+        return;
+    }
     my $analysis_html = '<table>';
     for (my $plot_num = 1;$plot_num<=$ENV{'form.NumPlots'};$plot_num++) {
         my $restriction_function;
@@ -253,13 +261,12 @@
             $no_data_message = 'No data for [_2] to [_3]';
         }
         #
-        my ($correct,$intervals,$answers) = 
-            &numerical_response_determine_intervals($r,$resource,$partid,
-                                                    $respid,$students);
+        my ($correct,$answers) = 
+            &numerical_determine_answers($r,$resource,$partid,
+                                         $respid,$students);
         if ($c->aborted()) { return; };
         #
-        my $responses = &numerical_classify_responses($response_data,
-                                                      $correct,
+        my $responses = &numerical_classify_responses($response_data,$correct,
                                                       $restriction_function);
         if ($responses->{'_count'} == 0) {
             $analysis_html.= 
@@ -301,15 +308,15 @@
     #
     my $total = $responses->{'_count'};
     return '' if ($total == 0);
-    my $minbin = 0.5;
+    my $minbin = 5;
     while (my ($interval,$submissions) = each(%$responses)) {
         next if ($interval =~ /^_/);
         my ($ans,$ans_low,$ans_high) = split(" ",$interval);
-        my $low_percent  = abs(($ans-$ans_low)/$ans);
-        my $high_percent = abs(($ans_high-$ans)/$ans);
+        my $low_percent  = abs(100*($ans-$ans_low)/$ans);
+        my $high_percent = abs(100*($ans_high-$ans)/$ans);
         if ($minbin > $high_percent) { $minbin = $high_percent; }
         if ($minbin > $low_percent) { $minbin = $low_percent; }
-    }    
+    }
     #
     my @bins;
     if ($minbin < 1) {
@@ -428,26 +435,48 @@
 }
 
 sub numerical_classify_responses {
+    &Apache::lonnet::logthis('--------------');
     my ($full_row_data,$correct,$function) = @_;
     my %submission_data;
     my %students;
     my $max=0;
     foreach my $row (@$full_row_data) {
+#        &Apache::lonnet::logthis(' row = '.join(',',@$row));
         my %subm = &hashify_attempt($row);
         if (ref($correct) eq 'HASH') {
-            $subm{'correct'} = $correct->{$subm{'student'}};
-        } else {
-            $subm{'correct'} = $correct;
+            $subm{'correct'} = $correct->{$subm{'student'}}->{'answer'};
+            $subm{'unit'} = $correct->{$subm{'student'}}->{'unit'};
+        } else { # This probably never happens....
+            $subm{'correct'} = $correct->{'answer'};
+            $subm{'unit'} = $correct->{'unit'};
         }
         $subm{'submission'} =~ s/=\d+\s*$//;
         if (&$function(\%subm)) {
+            my $scaled = '1';
+            my ($sname,$sdom) = split(':',$subm{'student'});
+            # Note that $subm{'unit'} is modified by the following call
+            # We do not use it again but you should be aware just in case.
+#            my ($myunit,$mysub) = ($subm{'unit'},$subm{'submission'});
+#            $myunit = 'm';
+#            # &Apache::lonnet::logthis($myunit);
+#            my $result = 
+#                &capa::caparesponse_get_real_response($myunit,
+#                                                      $mysub,
+#                                                      \$scaled);
+#            # &Apache::lonnet::logthis('  '.$myunit.':'.$subm{'unit'}.
+#            #  ' '.$mysub.':'.$subm{'submission'}.'; '.$result);
+#            next if (! defined($scaled));
+#            next if ($result ne '6');
+#            my $submission = $scaled;
             my $submission = $subm{'submission'};
             $students{$subm{'student'}}++;
             if (&numerical_submission_is_correct($subm{'award'})) { 
+                &Apache::lonnet::logthis('correct:'.$submission.':'.$subm{'correct'});
                 $submission_data{'_correct'}++;
                 $submission_data{'_count'}++;
                 $submission_data{$subm{'correct'}}->{$submission}->[0]++;
             } elsif (&numerical_submission_is_incorrect($subm{'award'})) { 
+                &Apache::lonnet::logthis('incorrect:'.$submission.':'.$subm{'correct'});
                 $submission_data{'_count'}++;
                 $submission_data{$subm{'correct'}}->{$submission}->[1]++;
             }
@@ -464,6 +493,7 @@
 
 sub numerical_submission_is_correct {
     my ($award) = @_;
+    &Apache::lonnet::logthis('award = "'.$award.'"');
     if ($award =~ /^(APPROX_ANS|EXACT_ANS)$/) {
         return 1;
     } else {
@@ -512,7 +542,7 @@
     return $table;
 }
 
-sub numerical_response_determine_intervals {
+sub numerical_determine_answers {
     my ($r,$resource,$partid,$respid,$students)=@_;
     my $c = $r->connection();
     #
@@ -522,9 +552,6 @@
     &Apache::lonstathelpers::ensure_proper_cache($resource->{'symb'});
     #
     my $correct;
-    # %intervals differs from %answers because it may be possible for two
-    # students to have the same correct answer but different intervals.
-    my %intervals; 
     my %answers;
     foreach my $student (@$students) {
         last if ($c->aborted());
@@ -537,15 +564,14 @@
                                                                 $sdom);
         # make the key
         my $key = $partid.'.'.$respid;
-        my $interval = join(' ',($analysis->{$key.'.answer'}->[0],
-                                 $analysis->{$key.'.ans_low'}->[0],
-                                 $analysis->{$key.'.ans_high'}->[0]));
-        $correct->{$sname.':'.$sdom} = $interval;
-        $intervals{$interval}++;
+        $correct->{$sname.':'.$sdom}->{'answer'} = 
+            $analysis->{$key.'.answer'}->[0];
+        $correct->{$sname.':'.$sdom}->{'unit'} = 
+            $analysis->{$key.'.unit'}->[0];
         $answers{$analysis->{$key.'.answer'}->[0]}++;
     }
     &Apache::lonstathelpers::write_analysis_cache();
-    return ($correct,\%intervals,\%answers);
+    return ($correct,\%answers);
 }
 
 #
@@ -571,7 +597,11 @@
         }
     }
     #
-    my $h_scale = ($width-10)/($max_x-$min_x);
+    my $min_max_difference = $max_x - $min_x;
+    if (! defined($min_max_difference) || $min_max_difference == 0) {
+        $min_max_difference = 1;
+    }
+    my $h_scale = ($width-10)/$min_max_difference;
     #
     my $ticscale = 5;
     if ($max_y * $ticscale > $height/2) {
@@ -601,7 +631,6 @@
     }
     $plot .= '</drawimage>';
     my $plotresult =  &Apache::lonxml::xmlparse($r,'web',$plot);
-    
     my $result = '<table>'.
         '<tr><td colspan="3" align="center">'.
         '<font size="+2">'.&mt('Distribution of correct answers').'</font>'.
@@ -652,33 +681,6 @@
     return &arc($x,$y,$radius,$radius,0,360,$color,$thickness,$filled);
 }
 
-sub build_student_data_worksheet {
-    my ($workbook,$format) = @_;
-    my $rows_output = 3;
-    my $cols_output = 0;
-    my $worksheet  = $workbook->addworksheet('Student Data');
-    $worksheet->write($rows_output++,0,'Student Data',$format->{'h3'});
-    my @Headers = ('full name','username','domain','section',
-                   "student\nnumber",'identifier');
-    $worksheet->write_row($rows_output++,0,\@Headers,$format->{'header'});
-    my @Students = @Apache::lonstatistics::Students;
-    my $studentrows = &Apache::loncoursedata::get_student_data(\@Students);
-    my %ids;
-    foreach my $row (@$studentrows) {
-        my ($mysqlid,$student) = @$row;
-        $ids{$student}=$mysqlid;
-    }
-    foreach my $student (@Students) {
-        my $name_domain = $student->{'username'}.':'.$student->{'domain'};
-        $worksheet->write_row($rows_output++,0,
-                          [$student->{'fullname'},
-                           $student->{'username'},$student->{'domain'},
-                           $student->{'section'},$student->{'id'},
-                           $ids{$name_domain}]);
-    }
-    return $worksheet;
-}
-
 #########################################################
 #########################################################
 ##
@@ -700,6 +702,9 @@
     my $analysis_html;
     my $foildata = $problem_analysis->{'_Foils'};
     my ($table,$foils,$concepts) = &build_foil_index($problem_analysis);
+    if (! defined($concepts)) {
+        $concepts = [];
+    }
     #
     my %true_foils;
     my $num_true = 0;
@@ -1593,6 +1598,33 @@
 ##
 #########################################################
 #########################################################
+sub build_student_data_worksheet {
+    my ($workbook,$format) = @_;
+    my $rows_output = 3;
+    my $cols_output = 0;
+    my $worksheet  = $workbook->addworksheet('Student Data');
+    $worksheet->write($rows_output++,0,'Student Data',$format->{'h3'});
+    my @Headers = ('full name','username','domain','section',
+                   "student\nnumber",'identifier');
+    $worksheet->write_row($rows_output++,0,\@Headers,$format->{'header'});
+    my @Students = @Apache::lonstatistics::Students;
+    my $studentrows = &Apache::loncoursedata::get_student_data(\@Students);
+    my %ids;
+    foreach my $row (@$studentrows) {
+        my ($mysqlid,$student) = @$row;
+        $ids{$student}=$mysqlid;
+    }
+    foreach my $student (@Students) {
+        my $name_domain = $student->{'username'}.':'.$student->{'domain'};
+        $worksheet->write_row($rows_output++,0,
+                          [$student->{'fullname'},
+                           $student->{'username'},$student->{'domain'},
+                           $student->{'section'},$student->{'id'},
+                           $ids{$name_domain}]);
+    }
+    return $worksheet;
+}
+
 sub OR_excel_sheet {
     my ($r,$resource,$performance_data,$ORdata) = @_;
     my $response = '';
Index: loncom/interface/statistics/lonstathelpers.pm
diff -u loncom/interface/statistics/lonstathelpers.pm:1.31 loncom/interface/statistics/lonstathelpers.pm:1.32
--- loncom/interface/statistics/lonstathelpers.pm:1.31	Wed Nov 10 16:50:29 2004
+++ loncom/interface/statistics/lonstathelpers.pm	Thu Dec  2 16:53:33 2004
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstathelpers.pm,v 1.31 2004/11/10 21:50:29 matthew Exp $
+# $Id: lonstathelpers.pm,v 1.32 2004/12/02 21:53:33 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1132,7 +1132,7 @@
                         $Partdata{$part}->{'_Foils'}->{$foil}->{'_Concept'}=
                                                                       $concept;
                     }
-                } elsif ($key =~ /^(incorrect|answer|ans_low|ans_high|str_type)$/) {
+                } elsif ($key =~ /^(unit|incorrect|answer|ans_low|ans_high|str_type)$/) {
                     $Partdata{$part}->{$key}=$value;
                 }
             } else {

--matthew1102024414--