# The LearningOnline Network with CAPA
#
# $Id: lonproblemanalysis.pm,v 1.30 2003/10/10 13:47:48 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
package Apache::lonproblemanalysis;
use strict;
use Apache::lonnet();
use Apache::loncommon();
use Apache::lonhtmlcommon();
use Apache::loncoursedata();
use Apache::lonstatistics;
use Apache::lonlocal;
sub BuildProblemAnalysisPage {
my ($r,$c)=@_;
$r->print('
'.&mt('Option Response Problem Analysis').'
');
$r->print(&CreateInterface());
#
my @Students = @Apache::lonstatistics::Students;
#
if (exists($ENV{'form.problemchoice'})) {
$r->print('');
&Apache::lonstatistics::Gather_Full_Student_Data($r);
#
my ($symb,$part,$resid) = &get_problem_symb(
&Apache::lonnet::unescape($ENV{'form.problemchoice'})
);
#
# my ($firsttime,$lasttime) =
# &Apache::loncoursedata::get_timestamp_data($symb,$resid);
#
my $resource = &get_resource_from_symb($symb);
if (defined($resource)) {
my %Data = &get_problem_data($resource->{'src'});
my $ORdata = $Data{$part.'.'.$resid};
##
## Render the problem
my $base;
($base,undef) = ($resource->{'src'} =~ m|(.*/)[^/]*$|);
$base = "http://".$ENV{'SERVER_NAME'}.$base;
my $rendered_problem =
&Apache::lonnet::ssi_body($resource->{'src'});
$rendered_problem =~ s/<\s*form\s*/)|<\/nop>|g;
$r->print('
'.
''.
$rendered_problem.
'
');
##
## Analyze the problem
my $PerformanceData =
&Apache::loncoursedata::get_optionresponse_data
(\@Students,$symb,$resid);
if (defined($PerformanceData) &&
ref($PerformanceData) eq 'ARRAY') {
if ($ENV{'form.AnalyzeBy'} eq 'Tries') {
my $analysis_html = &DoTriesAnalysis($PerformanceData,
$ORdata);
$r->print($analysis_html);
# } elsif ($ENV{'form.AnalyzeBy'} eq 'Time') {
# my $analysis_html = &DoTimeAnalysis($PerformanceData,
# $ORdata);
# $r->print($analysis_html);
} else {
$r->print('
'.
&mt('The analysis you have selected is '.
'not supported at this time').
'
');
}
} else {
$r->print('
'.
&mt('There is no student data for this problem.').
'
');
}
# Okay, they asked for data, so make sure we get the latest data.
$r->print(&OptionResponseProblemSelector());
}
sub DoTriesAnalysis {
my ($PerformanceData,$ORdata) = @_;
my $mintries = 1;
my $maxtries = 10;
my %ResponseData = &analyze_option_data_by_tries($PerformanceData,
$mintries,$maxtries);
my @Foils = sort(keys(%ResponseData));
my %Row_Label;
foreach my $foilid (@Foils) {
my $value = $ORdata->{'Foiltext'}->{$foilid};
# &Apache::lonnet::logthis('row label '.$foilid.' = '.$value);
$Row_Label{$foilid} = $ORdata->{'Foiltext'}->{$foilid};
}
my @Rows;
$Rows[0] = ['
'];
for (my $i=$mintries;$i<=$maxtries;$i++) {
push (@{$Rows[0]},
'
'.&mt('Attempt').' '.$i.'
');
}
$Rows[1] = ['
'.&mt('Foil').'
'];
for (my $i=$mintries;$i<=$maxtries;$i++) {
push (@{$Rows[1]},('
'.&mt('Correct').'
',
'
'.&mt('Incorrect').'
',
'
'.&mt('Percent Correct').'
',
));
}
my @PlotData;
my @CumulativePlotData;
my $index = 1;
foreach my $foilid (@Foils) {
my @Data = ('
'.$index.' '.$Row_Label{$foilid}.'
');
for (my $i=$mintries;$i<=$maxtries;$i++) {
push(@Data,
('
\n";
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
next if ($seq->{'num_assess'}<1);
my $seq_str = '';
foreach my $res (@{$seq->{'contents'}}) {
# &Apache::lonnet::logthis('checking '.$res->{'title'});
next if ($res->{'type'} ne 'assessment');
foreach my $part (@{$res->{'parts'}}) {
my $partdata = $res->{'partdata'}->{$part};
if (! exists($partdata->{'option'}) ||
$partdata->{'option'} == 0) {
next;
}
for (my $i=0;$i{'ResponseTypes'}});$i++){
my $respid = $partdata->{'ResponseIds'}->[$i];
my $resptype = $partdata->{'ResponseTypes'}->[$i];
if ($resptype eq 'option') {
my $value = &Apache::lonnet::escape($res->{'symb'}.':'.$part.':'.$respid);
my $checked = '';
if ($ENV{'form.problemchoice'} eq $value) {
$checked = 'checked ';
}
$seq_str .= '