[LON-CAPA-cvs] cvs: loncom /interface/statistics lonproblemanalysis.pm
matthew
lon-capa-cvs@mail.lon-capa.org
Tue, 28 Sep 2004 20:41:58 -0000
This is a MIME encoded message
--matthew1096404118
Content-Type: text/plain
matthew Tue Sep 28 16:41:58 2004 EDT
Modified files:
/loncom/interface/statistics lonproblemanalysis.pm
Log:
Interface simplification: got rid of "analyze as" nonsense. We try to
produce three plots for each attempt or time interval: concept, foil correct,
and foil incorrect. If there is only one concept the concept plot is omitted.
Some Style Police(tm) induced changes. Titles of plots are more consistent
(since they appear on the same page now).
--matthew1096404118
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20040928164158.txt"
Index: loncom/interface/statistics/lonproblemanalysis.pm
diff -u loncom/interface/statistics/lonproblemanalysis.pm:1.87 loncom/interface/statistics/lonproblemanalysis.pm:1.88
--- loncom/interface/statistics/lonproblemanalysis.pm:1.87 Thu Jun 24 14:47:36 2004
+++ loncom/interface/statistics/lonproblemanalysis.pm Tue Sep 28 16:41:58 2004
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonproblemanalysis.pm,v 1.87 2004/06/24 18:47:36 matthew Exp $
+# $Id: lonproblemanalysis.pm,v 1.88 2004/09/28 20:41:58 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -63,7 +63,6 @@
my %Saveable_Parameters = ('Status' => 'scalar',
'Section' => 'array',
'NumPlots' => 'scalar',
- 'AnalyzeAs' => 'scalar',
'AnalyzeOver' => 'scalar',
);
&Apache::loncommon::store_course_settings('problem_analysis',
@@ -140,16 +139,16 @@
$r->rflush();
my %Data = &Apache::lonstathelpers::get_problem_data
($resource->{'src'});
- my $ProblemData = $Data{$current_problem->{'part'}.
+ my $problem_data = $Data{$current_problem->{'part'}.
'.'.
$current_problem->{'respid'}};
if ($current_problem->{'resptype'} eq 'option') {
&OptionResponseAnalysis($r,$current_problem,
- $ProblemData,
+ $problem_data,
\@Students);
} elsif ($current_problem->{'resptype'} eq 'radiobutton') {
&RadioResponseAnalysis($r,$current_problem,
- $ProblemData,
+ $problem_data,
\@Students);
} elsif ($current_problem->{'resptype'} eq 'numerical') {
##
@@ -160,7 +159,7 @@
foreach my $respid (@{$res->{'partdata'}->{$partid}->{'ResponseIds'}}) {
$current_problem->{'respid'}=$respid;
&NumericalResponseAnalysis($r,$current_problem,
- $ProblemData,\@Students);
+ $problem_data,\@Students);
}
}
} else {
@@ -187,7 +186,7 @@
#########################################################
#########################################################
sub NumericalResponseAnalysis {
- my ($r,$problem,$ProblemData,$Students) = @_;
+ my ($r,$problem,$problem_data,$Students) = @_;
my $c = $r->connection();
my ($resource,$partid,$respid) = ($problem->{'resource'},
$problem->{'part'},
@@ -377,7 +376,7 @@
#########################################################
#########################################################
sub RadioResponseAnalysis {
- my ($r,$problem,$ProblemData,$Students) = @_;
+ my ($r,$problem,$problem_data,$Students) = @_;
my ($resource,$respid) = ($problem->{'resource'},
$problem->{'respid'});
my $analysis_html;
@@ -395,13 +394,13 @@
}
if (exists($ENV{'form.ExcelOutput'})) {
$analysis_html .= &RR_Excel_output($r,$problem->{'resource'},
- $PerformanceData,$ProblemData);
+ $PerformanceData,$problem_data);
} elsif ($ENV{'form.AnalyzeOver'} eq 'Tries') {
$analysis_html .= &RR_Tries_Analysis($r,$problem->{'resource'},
- $PerformanceData,$ProblemData);
+ $PerformanceData,$problem_data);
} elsif ($ENV{'form.AnalyzeOver'} eq 'Time') {
$analysis_html .= &RR_Time_Analysis($r,$problem->{'resource'},
- $PerformanceData,$ProblemData);
+ $PerformanceData,$problem_data);
} else {
$analysis_html .= '<h2>'.
&mt('The analysis you have selected is not supported at this time').
@@ -411,35 +410,26 @@
}
sub RR_Excel_output {
- my ($r,$PerformanceData,$ProblemData) = @_;
+ my ($r,$PerformanceData,$problem_data) = @_;
return '<h1>No!</h1>';
}
sub RR_Tries_Analysis {
- my ($r,$resource,$PerformanceData,$ProblemData) = @_;
+ my ($r,$resource,$PerformanceData,$problem_data) = @_;
my $analysis_html;
my $mintries = 1;
my $maxtries = $ENV{'form.NumPlots'};
- my ($table,$Foils,$Concepts) = &build_foil_index($ProblemData);
- if ((! defined($Concepts)) || ((@$Concepts < 2) &&
- ($ENV{'form.AnalyzeAs'} ne 'Foils'))) {
+ my ($table,$Foils,$Concepts) = &build_foil_index($problem_data);
+ if ((! defined($Concepts)) || (@$Concepts < 2)) {
$table = '<h3>'.
&mt('Not enough data for concept analysis. '.
'Performing Foil Analysis').
'</h3>'.$table;
- $ENV{'form.AnalyzeAs'} = 'Foils';
}
$analysis_html .= $table;
my @TryData = &RR_tries_data_analysis($r,$PerformanceData);
-# if ($ENV{'form.AnalyzeAs'} eq 'Foils') {
$analysis_html .= &RR_Tries_Foil_Analysis($mintries,$maxtries,$Foils,
- \@TryData,$ProblemData);
-# } else {
-# $analysis_html = &RR_Tries_Concept_Analysis($mintries,$maxtries,
-# $Concepts,
-# \@TryData,
-# $ProblemData);
-# }
+ \@TryData,$problem_data);
return $analysis_html;
}
@@ -455,13 +445,13 @@
}
sub RR_Time_Analysis {
- my ($r,$PerformanceData,$ProblemData) = @_;
+ my ($r,$PerformanceData,$problem_data) = @_;
my $html;
return $html;
}
sub RR_Tries_Foil_Analysis {
- my ($min,$max,$Foils,$TryData,$ProblemData) = @_;
+ my ($min,$max,$Foils,$TryData,$problem_data) = @_;
my $html;
#
# Compute the data neccessary to make the plots
@@ -480,7 +470,7 @@
push (@PlotData_Correct,0);
push (@PlotData_Incorrect,0);
} else {
- if ($ProblemData->{'_Foils'}->{$foilid}->{'value'} eq 'true') {
+ if ($problem_data->{'_Foils'}->{$foilid}->{'value'} eq 'true') {
push (@PlotData_Correct,
int(100*$DataSet{$foilid}/$total));
push (@PlotData_Incorrect,0);
@@ -506,19 +496,19 @@
}
sub RR_Tries_Concept_Analysis {
- my ($min,$max,$Concepts,$ResponseData,$ProblemData) = @_;
+ my ($min,$max,$Concepts,$ResponseData,$problem_data) = @_;
my $html;
return $html;
}
sub RR_Time_Foil_Analysis {
- my ($min,$max,$Foils,$ResponseData,$ProblemData) = @_;
+ my ($min,$max,$Foils,$ResponseData,$problem_data) = @_;
my $html;
return $html;
}
sub RR_Time_Concept_Analysis {
- my ($min,$max,$Concepts,$ResponseData,$ProblemData) = @_;
+ my ($min,$max,$Concepts,$ResponseData,$problem_data) = @_;
my $html;
return $html;
}
@@ -563,7 +553,7 @@
#########################################################
#########################################################
sub OptionResponseAnalysis {
- my ($r,$problem,$ProblemData,$Students) = @_;
+ my ($r,$problem,$problem_data,$Students) = @_;
my ($resource,$respid) = ($problem->{'resource'},
$problem->{'respid'});
# Note: part data is not needed.
@@ -581,19 +571,19 @@
if (exists($ENV{'form.ExcelOutput'})) {
my $result = &OR_excel_sheet($r,$resource,
$PerformanceData,
- $ProblemData);
+ $problem_data);
$r->print($result);
$r->rflush();
} else {
if ($ENV{'form.AnalyzeOver'} eq 'Tries') {
my $analysis_html = &OR_tries_analysis($r,
$PerformanceData,
- $ProblemData);
+ $problem_data);
$r->print($analysis_html);
$r->rflush();
} elsif ($ENV{'form.AnalyzeOver'} eq 'Time') {
my $analysis_html = &OR_time_analysis($PerformanceData,
- $ProblemData);
+ $problem_data);
$r->print($analysis_html);
$r->rflush();
} else {
@@ -616,78 +606,93 @@
my $mintries = 1;
my $maxtries = $ENV{'form.NumPlots'};
my ($table,$Foils,$Concepts) = &build_foil_index($ORdata);
- if (! defined($Concepts) ||
- ((@$Concepts < 2) && ($ENV{'form.AnalyzeAs'} ne 'Foils'))) {
- $table = '<h3>'.
- &mt('Not enough data for concept analysis. '.
- 'Performing Foil Analysis').
- '</h3>'.$table;
- $ENV{'form.AnalyzeAs'} = 'Foils';
- }
- my %ResponseData = &OR_analyze_by_tries($r,$PerformanceData,
+ my %response_data = &OR_analyze_by_tries($r,$PerformanceData,
$mintries,$maxtries);
my $analysis = '';
- if ($ENV{'form.AnalyzeAs'} eq 'Foils') {
- $analysis = &OR_Tries_Foil_Analysis($mintries,$maxtries,$Concepts,
- \%ResponseData,$ORdata);
- } else {
- $analysis = &OR_Tries_Concept_Analysis($mintries,$maxtries,
- $Concepts,\%ResponseData,$ORdata);
- }
- $table .= $analysis;
- return $table;
-}
-
-sub OR_Tries_Foil_Analysis {
- my ($mintries,$maxtries,$Concepts,$respdat,$ORdata) = @_;
- my %ResponseData = %$respdat;
#
- # Compute the data neccessary to make the plots
- my @PlotData;
- foreach my $concept (@$Concepts) {
+ # Compute the data necessary to make the plots
+ my @foil_plot;
+ my @concept_data;
+ for (my $j=0;$j<=scalar(@$Concepts);$j++) {
+ my $concept = $Concepts->[$j];
foreach my $foilid (@{$concept->{'foils'}}) {
for (my $try=$mintries;$try<=$maxtries;$try++) {
- if ($ResponseData{$foilid}->[$try]->{'_total'} == 0) {
- push(@{$PlotData[$try]->{'_correct'}},0);
+ # concept analysis data
+ $concept_data[$j]->{'_correct'} +=
+ $response_data{$foilid}->[$try]->{'_correct'};
+ $concept_data[$j]->{'_total'} +=
+ $response_data{$foilid}->[$try]->{'_total'};
+ #
+ # foil analysis data
+ if ($response_data{$foilid}->[$try]->{'_total'} == 0) {
+ push(@{$foil_plot[$try]->{'_correct'}},0);
} else {
- push(@{$PlotData[$try]->{'_correct'}},
- 100*$ResponseData{$foilid}->[$try]->{'_correct'}/
- $ResponseData{$foilid}->[$try]->{'_total'});
+ push(@{$foil_plot[$try]->{'_correct'}},
+ 100*$response_data{$foilid}->[$try]->{'_correct'}/
+ $response_data{$foilid}->[$try]->{'_total'});
}
foreach my $option (@{$ORdata->{'_Options'}}) {
- push(@{$PlotData[$try]->{'_total'}},
- $ResponseData{$foilid}->[$try]->{'_total'});
- if ($ResponseData{$foilid}->[$try]->{'_total'} == 0) {
- push (@{$PlotData[$try]->{$option}},0);
+ push(@{$foil_plot[$try]->{'_total'}},
+ $response_data{$foilid}->[$try]->{'_total'});
+ if ($response_data{$foilid}->[$try]->{'_total'} == 0) {
+ push (@{$foil_plot[$try]->{$option}},0);
} else {
- if ($ResponseData{$foilid}->[$try]->{'_total'} ==
- $ResponseData{$foilid}->[$try]->{'_correct'}) {
- push(@{$PlotData[$try]->{$option}},0);
+ if ($response_data{$foilid}->[$try]->{'_total'} ==
+ $response_data{$foilid}->[$try]->{'_correct'}) {
+ push(@{$foil_plot[$try]->{$option}},0);
} else {
- push (@{$PlotData[$try]->{$option}},
+ push (@{$foil_plot[$try]->{$option}},
100 *
- $ResponseData{$foilid}->[$try]->{$option} /
- ($ResponseData{$foilid}->[$try]->{'_total'}
+ $response_data{$foilid}->[$try]->{$option} /
+ ($response_data{$foilid}->[$try]->{'_total'}
-
- $ResponseData{$foilid}->[$try]->{'_correct'}
+ $response_data{$foilid}->[$try]->{'_correct'}
));
}
}
} # End of foreach my $option
}
} # End of foreach my $foilid
- } # End of foreach my $concept
+ } # End of concept loops
#
# Build a table for the plots
my $analysis_html = "<table>\n";
my $optionkey = &build_option_index($ORdata);
+ my $num_concepts = 1;
+ if (defined($Concepts)) { $num_concepts = scalar(@$Concepts); }
+ #
for (my $try=$mintries;$try<=$maxtries;$try++) {
- my $count = $ResponseData{'_total'}->[$try];
- my $title = 'Submission '.$try.' (N='.$count.')';
+ my $concept_graph='';
+ if ($num_concepts > 1) {
+ #
+ # Create concept plot
+ my @concept_plot_data;
+ for (my $j=0;$j<=$#concept_data;$j++) {
+ my $total = $concept_data[$j]->{'_total'};
+ if ($total == 0) {
+ $concept_plot_data[$j] = 0;
+ } else {
+ $concept_plot_data[$j] = 100 *
+ sprintf('%0.3f',
+ $concept_data[$j]->{'_correct'} / $total);
+ }
+ }
+ #
+ my $title;
+ my $count = $response_data{'_total'}->[$try];
+ $title = 'Attempt '.$try.' (N='.$count.')';
+ $concept_graph = &Apache::loncommon::DrawBarGraph
+ ($title,'Concept Number','Percent Correct',
+ 100,$plotcolors,undef,\@concept_plot_data);
+ }
+ #
+ # Create Foil Plots
+ my $count = $response_data{'_total'}->[$try];
+ my $title = 'Attempt '.$try.' (N='.$count.')';
my @Datasets;
foreach my $option ('_correct',@{$ORdata->{'_Options'}}) {
- next if (! exists($PlotData[$try]->{$option}));
- push(@Datasets,$PlotData[$try]->{$option});
+ next if (! exists($foil_plot[$try]->{$option}));
+ push(@Datasets,$foil_plot[$try]->{$option});
}
#
# Put a blank in the data set between concepts
@@ -714,10 +719,9 @@
push(@Labels,'');
}
#
- my $correctgraph = &Apache::loncommon::DrawBarGraph
+ my $correct_graph = &Apache::loncommon::DrawBarGraph
($title,'Foil Number','Percent Correct',
100,$plotcolors,\@Labels,$Datasets[0]);
- $analysis_html.= '<tr><td>'.$correctgraph.'</td>';
#
#
@@ -725,83 +729,23 @@
for (my $i=0; $i< scalar(@{$Datasets[0]});$i++) {
$Datasets[0]->[$i]=0;
}
- $count = $ResponseData{'_total'}->[$try] -
- $ResponseData{'_correct'}->[$try];
- $title = 'Submission '.$try.' (N='.$count.')';
- my $incorrectgraph = &Apache::loncommon::DrawBarGraph
+ $count = $response_data{'_total'}->[$try] -
+ $response_data{'_correct'}->[$try];
+ $title = 'Attempt '.$try.' (N='.$count.')';
+ my $incorrect_graph = &Apache::loncommon::DrawBarGraph
($title,'Foil Number','% Option Chosen Incorrectly',
100,$plotcolors,\@Labels,@Datasets);
- $analysis_html.= '<td>'.$incorrectgraph.'</td>';
- $analysis_html.= '<td>'.$optionkey."<td></tr>\n";
+ $analysis_html.=
+ '<tr>'.
+ '<td>'.$concept_graph.'</td>'.
+ '<td>'.$correct_graph.'</td>'.
+ '<td>'.$incorrect_graph.'</td>'.
+ '<td>'.$optionkey.'<td>'.
+ '</tr>'.$/;
}
$analysis_html .= "</table>\n";
- return $analysis_html;
-}
-
-sub OR_Tries_Concept_Analysis {
- my ($mintries,$maxtries,$Concepts,$respdat,$ORdata) = @_;
- my %ResponseData = %$respdat;
- my $analysis_html = "<table>\n";
- #
- # Compute the data neccessary to make the plots
- my @PlotData;
- # Concept analysis
- #
- # Note: we do not bother with characterizing the students incorrect
- # answers at the concept level because an incorrect answer for one foil
- # may be a correct answer for another foil.
- my %ConceptData;
- foreach my $concept (@{$Concepts}) {
- for (my $i=$mintries;$i<=$maxtries;$i++) {
- #
- # Gather the per-attempt data
- my $cdata = $ConceptData{$concept}->[$i];
- foreach my $foilid (@{$concept->{'foils'}}) {
- $cdata->{'_correct'} +=
- $ResponseData{$foilid}->[$i]->{'_correct'};
- $cdata->{'_total'} +=
- $ResponseData{$foilid}->[$i]->{'_total'};
- }
- push (@{$PlotData[$i]->{'_total'}},$cdata->{'_total'});
- if ($cdata->{'_total'} == 0) {
- push (@{$PlotData[$i]->{'_correct'}},0);
- } else {
- push (@{$PlotData[$i]->{'_correct'}},
- 100*$cdata->{'_correct'}/$cdata->{'_total'});
- }
- }
- }
- # Build a table for the plots
- for (my $i=$mintries;$i<=$maxtries;$i++) {
- my $minstu = $PlotData[$i]->{'_total'}->[0];
- my $maxstu = $PlotData[$i]->{'_total'}->[0];
- foreach my $count (@{$PlotData[$i]->{'_total'}}) {
- if ($minstu > $count) {
- $minstu = $count;
- }
- if ($maxstu < $count) {
- $maxstu = $count;
- }
- }
- $maxstu = 0 if (! defined($maxstu));
- $minstu = 0 if (! defined($minstu));
- my $title;
- my $count = $ResponseData{'_total'}->[$i];
- if ($count == 0) {
- $count = 'no submissions';
- } elsif ($count == 1) {
- $count = '1 submission';
- } else {
- $count = $count.' submissions';
- }
- $title = 'Attempt '.$i.', '.$count;
- my $graphlink = &Apache::loncommon::DrawBarGraph
- ($title,'Concept Number','Percent Correct',
- 100,$plotcolors,undef,$PlotData[$i]->{'_correct'});
- $analysis_html.= '<tr><td>'.$graphlink."</td></tr>\n";
- }
- $analysis_html .= "</table>\n";
- return $analysis_html;
+ $table .= $analysis_html;
+ return $table;
}
sub OR_analyze_by_tries {
@@ -833,17 +777,21 @@
#
#########################################################
sub OR_time_analysis {
- my ($PerformanceData,$ORdata) = @_;
+ my ($performance_data,$ORdata) = @_;
my ($table,$Foils,$Concepts) = &build_foil_index($ORdata);
- if ((@$Concepts < 2) && ($ENV{'form.AnalyzeAs'} ne 'Foils')) {
+ my $foilkey = &build_option_index($ORdata);
+ my $num_concepts = 1;
+ if (defined($Concepts)) { $num_concepts = scalar(@$Concepts); }
+ #
+ if ($num_concepts < 2) {
$table = '<h3>'.
&mt('Not enough data for concept analysis. '.
'Performing Foil Analysis').
- '</h3>'.$table;
- $ENV{'form.AnalyzeAs'} = 'Foils';
+ '</h3>'.$table;
}
+ #
my $num_plots = $ENV{'form.NumPlots'};
- my $num_data = scalar(@$PerformanceData)-1;
+ my $num_data = scalar(@$performance_data)-1;
my $percent = sprintf('%2f',100/$num_plots);
#
$table .= "<table>\n";
@@ -855,16 +803,20 @@
('enddate_'.$i);
if (! defined($starttime) || ! defined($endtime)) {
my $sec_in_day = 86400;
- my $last_sub_time = &get_time_from_row($PerformanceData->[-1]);
+ my $last_sub_time = &get_time_from_row($performance_data->[-1]);
my ($sday,$smon,$syear);
(undef,undef,undef,$sday,$smon,$syear) =
localtime($last_sub_time - $sec_in_day*$i);
$starttime = &Time::Local::timelocal(0,0,0,$sday,$smon,$syear);
$endtime = $starttime + $sec_in_day;
if ($i == ($num_plots -1 )) {
- $starttime = &get_time_from_row($PerformanceData->[0]);
+ $starttime = &get_time_from_row($performance_data->[0]);
}
}
+ $table .= '<tr><td colspan="4" align="center">'.
+ &mt('Data from [_1] to [_2]',
+ &Apache::lonlocal::locallocaltime($starttime),
+ &Apache::lonlocal::locallocaltime($endtime)).'</td></tr>'.$/;
my $startdateform = &Apache::lonhtmlcommon::date_setter
('Statistics','startdate_'.$i,$starttime);
my $enddateform = &Apache::lonhtmlcommon::date_setter
@@ -873,13 +825,13 @@
my $begin_index;
my $end_index;
my $j;
- while (++$j < scalar(@$PerformanceData)) {
- last if (&get_time_from_row($PerformanceData->[$j])
+ while (++$j < scalar(@$performance_data)) {
+ last if (&get_time_from_row($performance_data->[$j])
> $starttime);
}
$begin_index = $j;
- while (++$j < scalar(@$PerformanceData)) {
- last if (&get_time_from_row($PerformanceData->[$j]) > $endtime);
+ while (++$j < scalar(@$performance_data)) {
+ last if (&get_time_from_row($performance_data->[$j]) > $endtime);
}
$end_index = $j;
##
@@ -889,29 +841,44 @@
startdateform => $startdateform,
enddateform => $enddateform,
};
- if ($ENV{'form.AnalyzeAs'} eq 'Foils') {
- $table .= &OR_Foil_Time_Analysis($PerformanceData,$ORdata,$Foils,
+ my $concept_correct_plot = '';
+ if ($num_concepts > 1) {
+ $concept_correct_plot =
+ &OR_Concept_Time_Analysis($performance_data,
+ $ORdata,$Concepts,
$interval);
- } else {
- $table .= &OR_Concept_Time_Analysis($PerformanceData,$ORdata,
- $Concepts,$interval);
}
+ my ($foil_correct_plot,$foil_incorrect_plot) =
+ &OR_Foil_Time_Analysis($performance_data,$ORdata,
+ $Foils,$Concepts,$interval);
+ $table .= '<tr>'.
+ '<td>'.$concept_correct_plot.'</td>'.
+ '<td>'.$foil_correct_plot.'</td>'.
+ '<td>'.$foil_incorrect_plot.'</td>'.
+ '<td align="left" valign="top">'.$foilkey.'</td></tr>'.$/;
+ $table .= '<tr><td colspan="4" align="center">'.
+ &mt('Start time: [_1]',
+ $interval->{'startdateform'}).'<br />'.
+ &mt('End time: [_1]',
+ $interval->{'enddateform'}).
+ '</td></tr>'.$/;
+ $table.= '<tr><td colspan="4"> </td></tr>'.$/;
}
+ $table .= '</table>';
#
return $table;
}
sub OR_Foil_Time_Analysis {
- my ($PerformanceData,$ORdata,$Foils,$interval) = @_;
+ my ($performance_data,$ORdata,$Foils,$Concepts,$interval) = @_;
my $analysis_html;
- my $foilkey = &build_option_index($ORdata);
my ($begin_index,$end_index) = ($interval->{'begin_index'},
$interval->{'end_index'});
my %TimeData;
#
# Compute the number getting the foils correct or incorrects
for (my $j=$begin_index;$j<=$end_index;$j++) {
- my $row = $PerformanceData->[$j];
+ my $row = $performance_data->[$j];
next if (! defined($row));
my %Row = &Process_OR_Row($row);
while (my ($foilid,$href) = each(%Row)) {
@@ -924,26 +891,34 @@
}
}
}
- my @Plotdata;
- foreach my $foil (@$Foils) {
- my $total = $TimeData{$foil}->{'_total'};
- if ($total == 0) {
- push(@{$Plotdata[0]},0);
- } else {
- push(@{$Plotdata[0]},
- 100 * $TimeData{$foil}->{'_correct'} / $total);
- }
- my $total_incorrect = $total - $TimeData{$foil}->{'_correct'};
- my $optionidx = 1;
- foreach my $option (@{$ORdata->{'_Options'}}) {
- if ($total_incorrect == 0) {
- push(@{$Plotdata[$optionidx]},0);
+ my @plotdata;
+ my @labels;
+ foreach my $concept (@{$Concepts}) {
+ foreach my $foil (@{$concept->{'foils'}}) {
+ push(@labels,scalar(@labels)+1);
+ my $total = $TimeData{$foil}->{'_total'};
+ if ($total == 0) {
+ push(@{$plotdata[0]},0);
} else {
- push(@{$Plotdata[$optionidx]},
- 100 * $TimeData{$foil}->{$option} / $total_incorrect);
+ push(@{$plotdata[0]},
+ 100 * $TimeData{$foil}->{'_correct'} / $total);
+ }
+ my $total_incorrect = $total - $TimeData{$foil}->{'_correct'};
+ for (my $i=0;$i<scalar(@{$ORdata->{'_Options'}});$i++) {
+ my $option = $ORdata->{'_Options'}->[$i];
+ if ($total_incorrect == 0) {
+ push(@{$plotdata[$i+1]},0);
+ } else {
+ push(@{$plotdata[$i+1]},
+ 100 * $TimeData{$foil}->{$option} / $total_incorrect);
+ }
}
- } continue {
- $optionidx++;
+ }
+ # Put in a blank one
+ push(@labels,'');
+ push(@{$plotdata[0]},0);
+ for (my $i=0;$i<scalar(@{$ORdata->{'_Options'}});$i++) {
+ push(@{$plotdata[$i+1]},0);
}
}
#
@@ -957,15 +932,15 @@
} else {
$title = $count.' submissions';
}
- my $correctplot = &Apache::loncommon::DrawBarGraph($title,
+ my $correct_plot = &Apache::loncommon::DrawBarGraph($title,
'Foil Number',
'Percent Correct',
100,
$plotcolors,
undef,
- $Plotdata[0]);
- for (my $j=0; $j< scalar(@{$Plotdata[0]});$j++) {
- $Plotdata[0]->[$j]=0;
+ $plotdata[0]);
+ for (my $j=0; $j< scalar(@{$plotdata[0]});$j++) {
+ $plotdata[0]->[$j]=0;
}
$count = $end_index-$begin_index-$TimeData{'_correct'};
if ($count == 0) {
@@ -975,32 +950,19 @@
} else {
$title = $count.' submissions';
}
- my $incorrectplot = &Apache::loncommon::DrawBarGraph($title,
+ my $incorrect_plot = &Apache::loncommon::DrawBarGraph($title,
'Foil Number',
'Incorrect Option Choice',
100,
$plotcolors,
undef,
- @Plotdata);
- $analysis_html.='<tr>'.
- '<td>'.$correctplot.'</td>'.
- '<td>'.$incorrectplot.'</td>'.
- '<td align="left" valign="top">'.$foilkey.'</td>'."</tr>\n";
- $analysis_html.= '<tr>'.'<td colspan="3">'.
- '<b>Start Time</b>:'.
- ' '.$interval->{'startdateform'}.'<br />'.
- '<b>End Time</b> : '.
- ' '.$interval->{'enddateform'}.'<br />'.
-# '<b>Plot Title</b> :'.
-# (" "x3).$interval->{'titleform'}.
- '</td>'.
- "</tr>\n";
- return $analysis_html;
+ @plotdata);
+
+ return ($correct_plot,$incorrect_plot);
}
sub OR_Concept_Time_Analysis {
- my ($PerformanceData,$ORdata,$Concepts,$interval) = @_;
- my $analysis_html;
+ my ($performance_data,$ORdata,$Concepts,$interval) = @_;
##
## Determine starttime, endtime, startindex, endindex
my ($begin_index,$end_index) = ($interval->{'begin_index'},
@@ -1009,7 +971,7 @@
#
# Compute the number getting the foils correct or incorrects
for (my $j=$begin_index;$j<=$end_index;$j++) {
- my $row = $PerformanceData->[$j];
+ my $row = $performance_data->[$j];
next if (! defined($row));
my %Row = &Process_OR_Row($row);
while (my ($foilid,$href) = each(%Row)) {
@@ -1024,7 +986,7 @@
}
#
# Put the data in plottable form
- my @Plotdata;
+ my @plotdata;
foreach my $concept (@$Concepts) {
my ($total,$correct);
foreach my $foil (@{$concept->{'foils'}}) {
@@ -1032,32 +994,21 @@
$correct += $TimeData{$foil}->{'_correct'};
}
if ($total == 0) {
- push(@Plotdata,0);
+ push(@plotdata,0);
} else {
- push(@Plotdata,100 * $correct / $total);
+ push(@plotdata,100 * $correct / $total);
}
}
#
# Create the plot
my $title = ($end_index - $begin_index).' submissions';
- my $correctplot = &Apache::loncommon::DrawBarGraph($title,
- 'Concept Number',
- 'Percent Correct',
- 100,
- $plotcolors,
- undef,
- \@Plotdata);
- $analysis_html.='<tr>'.
- '<td>'.$correctplot.'</td>'.
- '<td align="left" valign="top">'.
- '<b>Start Time</b>: '.$interval->{'startdateform'}.'<br />'.
- '<b>End Time</b> : '.
- ' '.$interval->{'enddateform'}.'<br />'.
-# '<b>Plot Title</b> :'.(" "x3).
-# $interval->{'titleform'}.
- '</td>'.
- "</tr>\n";
- return $analysis_html;
+ return &Apache::loncommon::DrawBarGraph($title,
+ 'Concept Number',
+ 'Percent Correct',
+ 100,
+ $plotcolors,
+ undef,
+ \@plotdata);
}
#########################################################
@@ -1068,7 +1019,7 @@
#########################################################
#########################################################
sub OR_excel_sheet {
- my ($r,$resource,$PerformanceData,$ORdata) = @_;
+ my ($r,$resource,$performance_data,$ORdata) = @_;
my $response = '';
my (undef,$Foils,$Concepts) = &build_foil_index($ORdata);
#
@@ -1106,7 +1057,7 @@
# Do something useful
}
$result = &OR_build_response_data_worksheet($response_data_sheet,$format,
- $PerformanceData,$Foils,
+ $performance_data,$Foils,
$ORdata);
if ($result ne 'okay') {
# Do something useful
@@ -1194,7 +1145,7 @@
}
sub OR_build_response_data_worksheet {
- my ($worksheet,$format,$PerformanceData,$Foils,$ORdata)=@_;
+ my ($worksheet,$format,$performance_data,$Foils,$ORdata)=@_;
my $rows_output = 3;
my $cols_output = 0;
$worksheet->write($rows_output++,0,'Response Data',$format->{'h3'});
@@ -1207,18 +1158,18 @@
}
$worksheet->write_row($rows_output++,0,\@Headers,$format->{'header'});
#
- foreach my $row (@$PerformanceData) {
+ foreach my $row (@$performance_data) {
next if (! defined($row));
my ($student,$award,$grading,$submission,$time,$tries) = @$row;
my @Foilgrades = split('&',$grading);
my @Foilsubs = split('&',$submission);
- my %ResponseData;
+ my %response_data;
for (my $j=0;$j<=$#Foilgrades;$j++) {
my ($foilid,$correct) = split('=',$Foilgrades[$j]);
my (undef,$submission) = split('=',$Foilsubs[$j]);
$submission = &Apache::lonnet::unescape($submission);
- $ResponseData{$foilid.' submission'}=$submission;
- $ResponseData{$foilid.' award'}=$correct;
+ $response_data{$foilid.' submission'}=$submission;
+ $response_data{$foilid.' award'}=$correct;
}
$worksheet->write($rows_output,$cols_output++,$student);
$worksheet->write($rows_output,$cols_output++,
@@ -1227,9 +1178,9 @@
$worksheet->write($rows_output,$cols_output++,$tries);
foreach my $foilid (@$Foils) {
$worksheet->write($rows_output,$cols_output++,
- $ResponseData{$foilid.' submission'});
+ $response_data{$foilid.' submission'});
$worksheet->write($rows_output,$cols_output++,
- $ResponseData{$foilid.' award'});
+ $response_data{$foilid.' award'});
}
$rows_output++;
$cols_output = 0;
@@ -1445,23 +1396,6 @@
$Str .= '</nobr><br />';
}
{
- $Str .= '<nobr>'.&mt('Analyze as ');
- $Str .= &Apache::loncommon::help_open_topic
- ('Analysis_Analyze_as');
- $Str .='<select name="AnalyzeAs" >';
- $Str .= '<option value="Concepts" ';
- if (! exists($ENV{'form.AnalyzeAs'}) ||
- $ENV{'form.AnalyzeAs'} eq 'Concepts'){
- # Default to Concepts
- $Str .= ' selected ';
- }
- $Str .= '>'.&mt('Concepts').'</option>';
- $Str .= '<option value="Foils" ';
- $Str .= ' selected ' if ($ENV{'form.AnalyzeAs'} eq 'Foils');
- $Str .= '>'.&mt('Foils').'</option>';
- $Str .= '</select></nobr><br />';
- }
- {
$Str .= '<nobr>'.&mt('Number of Plots:');
$Str .= &Apache::loncommon::help_open_topic
('Analysis_num_plots');
--matthew1096404118--