[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--