--- loncom/interface/statistics/lonproblemanalysis.pm 2004/06/24 18:47:36 1.87
+++ loncom/interface/statistics/lonproblemanalysis.pm 2004/09/28 20:41:58 1.88
@@ -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 @@ sub BuildProblemAnalysisPage {
my %Saveable_Parameters = ('Status' => 'scalar',
'Section' => 'array',
'NumPlots' => 'scalar',
- 'AnalyzeAs' => 'scalar',
'AnalyzeOver' => 'scalar',
);
&Apache::loncommon::store_course_settings('problem_analysis',
@@ -140,16 +139,16 @@ sub BuildProblemAnalysisPage {
$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 @@ sub BuildProblemAnalysisPage {
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 BuildProblemAnalysisPage {
#########################################################
#########################################################
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 build_student_data_worksheet {
#########################################################
#########################################################
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 @@ sub RadioResponseAnalysis {
}
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 .= '
'.
&mt('The analysis you have selected is not supported at this time').
@@ -411,35 +410,26 @@ sub RadioResponseAnalysis {
}
sub RR_Excel_output {
- my ($r,$PerformanceData,$ProblemData) = @_;
+ my ($r,$PerformanceData,$problem_data) = @_;
return '
No!
';
}
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 = '
'.
&mt('Not enough data for concept analysis. '.
'Performing Foil Analysis').
'
'.$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_tries_data_analysis {
}
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 @@ sub RR_Tries_Foil_Analysis {
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_Foil_Analysis {
}
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 get_Radio_problem_data {
#########################################################
#########################################################
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 @@ sub OptionResponseAnalysis {
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 @@ sub OR_tries_analysis {
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 = '
'.
- &mt('Not enough data for concept analysis. '.
- 'Performing Foil Analysis').
- '
'.$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 = "
\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 @@ sub OR_Tries_Foil_Analysis {
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.= '