--- loncom/interface/statistics/lonproblemanalysis.pm 2010/01/14 17:20:51 1.138
+++ loncom/interface/statistics/lonproblemanalysis.pm 2020/11/10 19:28:32 1.147
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonproblemanalysis.pm,v 1.138 2010/01/14 17:20:51 bisitz Exp $
+# $Id: lonproblemanalysis.pm,v 1.147 2020/11/10 19:28:32 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -31,6 +31,7 @@ use Apache::lonnet;
use Apache::loncommon();
use Apache::lonhtmlcommon();
use Apache::loncoursedata();
+use Apache::lonquickgrades();
use Apache::lonstatistics;
use Apache::lonlocal;
use Apache::lonstathelpers();
@@ -73,6 +74,9 @@ sub BuildProblemAnalysisPage {
#
&Apache::lonstatistics::PrepareClasslist();
#
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Detailed Problem Analysis'));
+ &Apache::lonquickgrades::startGradeScreen($r,'statistics');
+
$r->print(&CreateInterface());
#
my @Students = @Apache::lonstatistics::Students;
@@ -88,7 +92,7 @@ sub BuildProblemAnalysisPage {
&Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status');
$r->rflush();
#
- my $problem_types = '(option|radiobutton|numerical)';
+ my $problem_types = &analyzable_types();
if (exists($env{'form.problemchoice'}) &&
! exists($env{'form.SelectAnother'})) {
foreach my $button (@SubmitButtons) {
@@ -114,21 +118,9 @@ sub BuildProblemAnalysisPage {
$r->rflush();
#
# Determine which problem we are to analyze
- my $current_problem = &Apache::lonstathelpers::get_target_from_id
- ($env{'form.problemchoice'});
- #
- my ($navmap,$prev,$curr,$next) =
- &Apache::lonstathelpers::get_prev_curr_next($current_problem,
- $problem_types,
- 'response',
- );
- if (exists($env{'form.PrevProblemAnalysis'}) && defined($prev)) {
- $current_problem = $prev;
- } elsif (exists($env{'form.NextProblemAnalysis'}) && defined($next)) {
- $current_problem = $next;
- } else {
- $current_problem = $curr;
- }
+ my ($navmap,$current_problem) = &get_current_problem(); # need to retrieve $navmap
+ # to support $resource->* calls
+ # for src and compTitle (below)
#
# Store the current problem choice and send it out in the form
$env{'form.problemchoice'} =
@@ -142,7 +134,7 @@ sub BuildProblemAnalysisPage {
my $resource = $current_problem->{'resource'};
$r->print('
'.$resource->compTitle.'
');
$r->print(''.$resource->src.'
');
- $r->print(''.&Apache::lonstatistics::section_and_enrollment_description().'
');
+ $r->print(''.&Apache::lonstatistics::section_and_enrollment_description().'
');
if ($env{'form.show_prob'} eq 'true') {
$r->print('
'
.&Apache::lonstathelpers::render_resource($resource)
@@ -189,6 +181,28 @@ sub BuildProblemAnalysisPage {
}
}
+sub analyzable_types {
+ return '(option|radiobutton|numerical)';
+}
+
+sub get_current_problem {
+ my ($problem_types) = @_;
+ my $current_problem = &Apache::lonstathelpers::get_target_from_id
+ ($env{'form.problemchoice'});
+ my ($navmap,$prev,$curr,$next) =
+ &Apache::lonstathelpers::get_prev_curr_next($current_problem,
+ $problem_types,
+ 'response');
+ if (exists($env{'form.PrevProblemAnalysis'}) && ($prev ne '')) {
+ $current_problem = $prev;
+ } elsif (exists($env{'form.NextProblemAnalysis'}) && ($next ne '')) {
+ $current_problem = $next;
+ } else {
+ $current_problem = $curr;
+ }
+ return ($navmap,$current_problem);
+}
+
#########################################################
#########################################################
##
@@ -396,10 +410,13 @@ sub numerical_plot_percent {
if ($max <$_) { $max = $_; last; }
}
#
- my $title = &mt('Percent Difference');
+ my %lt = &Apache::lonlocal::texthash(
+ 'title' => 'Percent Difference',
+ 'xlabel' => 'Percent Difference from Correct',
+ 'ylabel' => 'Percent of Answers');
my @labels = (1..scalar(@bins)-1);
my $graph = &Apache::loncommon::DrawBarGraph
- ($title,'Percent Difference from Correct','Percent of Answers',
+ ($lt{'title'},$lt{'xlabel'},$lt{'ylabel'},
$max,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect,
{xskip=>1});
#
@@ -469,10 +486,13 @@ sub numerical_plot_differences {
if ($max <$_) { $max = $_; last; }
}
#
- my $title = &mt('Difference between submission and correct');
+ my %lt = &Apache::lonlocal::texthash(
+ 'title' => 'Difference between submission and correct',
+ 'xlabel' => 'Difference from Correct',
+ 'ylabel' => 'Percent of Answers');
my @labels = (1..scalar(@bins)-1);
my $graph = &Apache::loncommon::DrawBarGraph
- ($title,'Difference from Correct','Percent of Answers',
+ ($lt{'title'},$lt{'xlabel'},$lt{'ylabel'},
$max,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect,
{xskip=>1});
#
@@ -626,10 +646,7 @@ sub numerical_determine_answers {
my ($r,$resource,$partid,$respid,$students)=@_;
my $c = $r->connection();
#
- my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
- ($r,'Student Answer Compilation Status',
- 'Student Answer Compilation Progress', scalar(@$students),
- 'inline',undef,'Statistics','stats_status');
+ my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,scalar(@$students));
#
# Read in the cache (if it exists) before we start timing things.
&Apache::lonstathelpers::ensure_proper_cache($resource->{'symb'});
@@ -663,7 +680,7 @@ sub numerical_determine_answers {
}
$answers{$correct->{$sname.':'.$sdom}{'answer'}}++;
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
- &mt('last student'));
+ 'last student');
}
&Apache::lonstathelpers::write_analysis_cache();
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
@@ -857,8 +874,8 @@ sub radio_response_analysis {
$no_data_text,@extra_data);
if ($env{'form.AnalyzeOver'} eq 'tries') {
$restriction_function = sub {($_[0]->{'tries'} == $plot_num?1:0)};
- $correct_foil_title = 'Attempt '.$plot_num;
- $incorrect_foil_title = 'Attempt '.$plot_num;
+ $correct_foil_title = &mt('Attempt [_1]',$plot_num);
+ $incorrect_foil_title = &mt('Attempt [_1]',$plot_num);
$pre_graph_text =
'Attempt [_1], [_2] submissions, [_3] correct, [_4] incorrect';
$post_graph_text = '';
@@ -916,8 +933,9 @@ sub radio_response_analysis {
# Concept Plot
my $concept_plot = '';
if (scalar(@$concepts) > 1) {
+ my $title = &mt('Correct Concepts');
$concept_plot = &RR_concept_plot($concepts,$foil_choice_data,
- 'Correct Concepts');
+ $title);
}
# % Choosing plot
my $choice_plot = &RR_create_percent_selected_plot
@@ -1032,10 +1050,11 @@ sub RR_concept_plot {
for (my $i=0;$i<=$#correct;$i++) {
$correct[$i] = sprintf('%0f',$correct[$i]/$total*100);
}
- my $xlabel = 'concept';
+ my $xlabel = &mt('concept');
+ my $ylabel = &mt('Percent Choosing');
my $plot= &Apache::loncommon::DrawBarGraph($title,
$xlabel,
- 'Percent Choosing',
+ $ylabel,
100,
['#33ff00','#ff3300'],
undef,
@@ -1101,10 +1120,11 @@ sub RR_create_percent_selected_plot {
@labels = (1 .. scalar(@correct));
}
#
- my $xlabel = 'foil chosen';
+ my $xlabel = &mt('foil chosen');
+ my $ylabel = &mt('Percent Choosing');
my $plot= &Apache::loncommon::DrawBarGraph($title,
$xlabel,
- 'Percent Choosing',
+ $ylabel,
100,
['#33ff00','#ff3300'],
\@labels,
@@ -1165,8 +1185,10 @@ sub RR_create_stacked_selection_plot {
push(@empty_row,0);
}
#
+ my $xlabel = &mt('Correct Foil');
+ my $ylabel = &mt('foils chosen Incorrectly');
my $graph = &Apache::loncommon::DrawBarGraph
- ($title,'Correct Foil','foils chosen Incorrectly',
+ ($title,$xlabel,$ylabel,
100,$plotcolors,\@labels,\@empty_row,@dataset);
return ($graph,\%count_per_foil);
}
@@ -1250,7 +1272,7 @@ sub OptionResponseAnalysis {
$r->print($analysis_html);
$r->rflush();
} else {
- $r->print('div class="LC_warning"'
+ $r->print(''
.&mt('The analysis you have selected is not supported at this time.')
.'
'
);
@@ -1362,8 +1384,12 @@ sub OR_tries_analysis {
}
}
#
+ my %lt = &Apache::lonlocal::texthash(
+ 'title' => 'Correct Concepts',
+ 'xlabel' => 'Concept Number',
+ 'ylabel' => 'Percent Correct');
$concept_graph = &Apache::loncommon::DrawBarGraph
- ('Correct Concepts','Concept Number','Percent Correct',
+ ($lt{'title'},$lt{'xlabel'},$lt{'ylabel'},
100,$plotcolors,undef,\@concept_plot_data,{xskip=>1});
}
#
@@ -1401,8 +1427,12 @@ sub OR_tries_analysis {
push(@Labels,'');
}
#
+ my %lt = &Apache::lonlocal::texthash(
+ 'title' => 'Correct Statements',
+ 'xlabel' => 'Statement',
+ 'ylabel' => '% Answered Correct');
my $correct_graph = &Apache::loncommon::DrawBarGraph
- ('Correct Statements','Statement','% Answered Correct',
+ ($lt{'title'},$lt{'xlabel'},$lt{'ylabel'},
100,$plotcolors,\@Labels,$Datasets[0],{xskip=>1});
#
@@ -1413,8 +1443,12 @@ sub OR_tries_analysis {
}
my $count = $response_data{'_total'}->[$try] -
$response_data{'_correct'}->[$try];
+ %lt = &Apache::lonlocal::texthash(
+ 'title' => 'Incorrect Statements',
+ 'xlabel' => 'Statement',
+ 'ylabel' => '% Chosen Incorrectly');
my $incorrect_graph = &Apache::loncommon::DrawBarGraph
- ('Incorrect Statements','Statement','% Chosen Incorrectly',
+ ($lt{'title'},$lt{'xlabel'},$lt{'ylabel'},
100,$plotcolors,\@Labels,@Datasets,{xskip=>1});
$analysis_html.=
''.
@@ -1476,10 +1510,11 @@ sub OR_time_analysis {
if (defined($Concepts)) { $num_concepts = scalar(@$Concepts); }
#
if ($num_concepts < 2) {
- $table = ''.
- &mt('Not enough data for concept analysis. '.
- 'Performing Foil Analysis').
- ''.$table;
+ $table = ''.
+ &mt('Not enough data for concept analysis.'.
+ ' Performing Foil Analysis instead.').
+ ' '.
+ $table;
}
#
my $num_plots = $env{'form.NumPlots'};
@@ -1536,7 +1571,7 @@ sub OR_time_analysis {
$correct |= 0;
##
$table .= ' |
'.
- &mt('[_1] submissions from [_2] students, [_3] correct, [_4] incorrect',
+ &mt('[quant,_1,submission,submissions,No submissions] from [quant,_2,student], [_3] correct, [_4] incorrect',
$data_count,$student_count,$correct,$data_count-$correct).
' |
'.$/;
my $concept_correct_plot = '';
@@ -1608,9 +1643,13 @@ sub OR_Foil_Time_Analysis {
}
#
# Create the plot
- my $correct_plot = &Apache::loncommon::DrawBarGraph('Correct Statements',
- 'Statement Number',
- 'Percent Correct',
+ my %lt = &Apache::lonlocal::texthash(
+ 'title' => 'Correct Statements',
+ 'xlabel' => 'Statement Number',
+ 'ylabel' => 'Percent Correct');
+ my $correct_plot = &Apache::loncommon::DrawBarGraph($lt{'title'},
+ $lt{'xlabel'},
+ $lt{'ylabel'},
100,
$plotcolors,
undef,
@@ -1619,10 +1658,14 @@ sub OR_Foil_Time_Analysis {
for (my $j=0; $j< scalar(@{$plotdata[0]});$j++) {
$plotdata[0]->[$j]=0;
}
+ %lt = &Apache::lonlocal::texthash(
+ 'title' => 'Incorrect Statements',
+ 'xlabel' => 'Statement Number',
+ 'ylabel' => 'Incorrect Option Choice');
my $incorrect_plot =
- &Apache::loncommon::DrawBarGraph('Incorrect Statements',
- 'Statement Number',
- 'Incorrect Option Choice',
+ &Apache::loncommon::DrawBarGraph($lt{'title'},
+ $lt{'xlabel'},
+ $lt{'ylabel'},
100,
$plotcolors,
undef,
@@ -1651,9 +1694,13 @@ sub OR_Concept_Time_Analysis {
}
#
# Create the plot
- return &Apache::loncommon::DrawBarGraph('Correct Concepts',
- 'Concept Number',
- 'Percent Correct',
+ my %lt = &Apache::lonlocal::texthash(
+ 'title' => 'Correct Concepts',
+ 'xlabel' => 'Concept Number',
+ 'ylabel' => 'Percent Correct');
+ return &Apache::loncommon::DrawBarGraph($lt{'title'},
+ $lt{'xlabel'},
+ $lt{'ylabel'},
100,
$plotcolors,
undef,
@@ -1875,7 +1922,6 @@ sub CreateInterface {
##
## Build the menu
my $Str = '';
- $Str .= &Apache::lonhtmlcommon::breadcrumbs('Detailed Problem Analysis');
$Str .= '';
$Str .= &Apache::loncommon::start_data_table();
$Str .= &Apache::loncommon::start_data_table_header_row();
@@ -1913,16 +1959,16 @@ sub CreateInterface {
$showprob_checkbox.' '.&mt('Show problem').
'
';
##
- my $analyze_selector = '';
$Str .= '