--- loncom/interface/statistics/lonproblemanalysis.pm 2002/08/13 14:44:33 1.6
+++ loncom/interface/statistics/lonproblemanalysis.pm 2002/11/25 18:17:36 1.16
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# (Publication Handler
#
-# $Id: lonproblemanalysis.pm,v 1.6 2002/08/13 14:44:33 stredwic Exp $
+# $Id: lonproblemanalysis.pm,v 1.16 2002/11/25 18:17:36 minaeibi Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -26,19 +26,16 @@
# http://www.lon-capa.org/
#
# (Navigate problems for statistical reports
-# YEAR=2001
-# 5/5,7/9,7/25/1,8/11,9/13,9/26,10/5,10/9,10/22,10/26 Behrouz Minaei
-# 11/1,11/4,11/16,12/14,12/16,12/18,12/20,12/31 Behrouz Minaei
# YEAR=2002
-# 1/22,2/1,2/6,2/25,3/2,3/6,3/17,3/21,3/22,3/26,4/7,5/6 Behrouz Minaei
-# 5/12,5/14,5/15,5/19,5/26,7/16 Behrouz Minaei
+# 5/12,7/26,9/7,11/22 Behrouz Minaei
#
###
-package Apache::lonproblemanalysis;
+package Apache::lonproblemanalysis;
use strict;
use Apache::lonnet();
+use Apache::lonhtmlcommon();
use GDBM_File;
my $jr;
@@ -48,13 +45,28 @@ sub BuildProblemAnalysisPage {
my %cache;
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
- $r->print('
Unable to tie database.');
+ $r->print('Unable to tie database.');
return;
}
- $r->print(&IntervalOptions($cache{'Interval'}));
+ my $Ptr = '';
+ $Ptr .= '';
+ $Ptr .= 'Select Sections ';
+ $Ptr .= ' '."\n";
+ $Ptr .= ''."\n";
+ my @sectionsSelected = split(':',$cache{'sectionsSelected'});
+ my @sections = split(':',$cache{'sectionList'});
+ $Ptr .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections,
+ \@sectionsSelected,
+ 'Statistics');
+ $Ptr .= ' '."\n";
+ $Ptr .= 'Intervals '."\n";
+ $Ptr .= '';
+ $Ptr .= &IntervalOptions($cache{'Interval'});
+ $Ptr .= '
';
+ $r->print($Ptr);
$r->rflush();
- $r->print(&OptionResponseTable($cache{'OptionResponses'}, \%cache));
+ $r->print(&OptionResponseTable($cache{'OptionResponses'}, \%cache, $r));
untie(%cache);
@@ -69,32 +81,78 @@ sub BuildAnalyzePage {
my $Str = '';
my %cache;
- if(&Apache::loncoursedata::DownloadStudentCourseDataSeparate($students, 'true',
- $cacheDB, 'true',
- 'true', $courseID,
- $r, $c) ne 'OK') {
+
+ unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
+ $Str .= 'Unable to tie database.';
$r->print($Str);
return;
}
+ # Remove students who don't have the proper section.
+ my @sectionsSelected = split(':',$cache{'sectionsSelected'});
+
+ my $studentCount = scalar @$students;
+ for(my $studentIndex=$studentCount-1; $studentIndex>=0;
+ $studentIndex--) {
+ my $value = $cache{$students->[$studentIndex].':section'};
+ my $found = 0;
+ foreach (@sectionsSelected) {
+ if($_ eq 'none') {
+ if($value eq '' || !defined($value) || $value eq ' ') {
+ $found = 1;
+ last;
+ }
+ } else {
+ if($value eq $_) {
+ $found = 1;
+ last;
+ }
+ }
+ }
+ if($found == 0) {
+ splice(@$students, $studentIndex, 1);
+ }
+ }
+ unless(untie(%cache)) {
+ $r->print('Can not untie hash.');
+ $r->rflush();
+ }
+
+ &Apache::lonhtmlcommon::Close_PrgWin($r);
+
+### jason code for checing is there data in cache
+# my $error =
+# &Apache::loncoursedata::DownloadStudentCourseDataSeparate($students,
+# 'true',
+# $cacheDB,
+# 'true',
+# 'true',
+# $courseID,
+# $r, $c);
+# if($error ne 'OK') {
+# $r->print($error.' Error downloading course data ');
+# return;
+# }
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
- $Str .= 'Unable to tie database.';
+ $Str .= 'Unable to tie database.';
$r->print($Str);
return;
}
my ($problemId, $part, $responseId)=split(':',$cache{'AnalyzeInfo'});
my $uri = $cache{$problemId.':source'};
- my $problem = $cache{$problemId.':problem'};
+ my $problem = $cache{$problemId.':problem'};
my $title = $cache{$problemId.':title'};
my $interval = $cache{'Interval'};
+ my $heading = 'Restore this particular Option Response Problem '.
+ 'Results, Please wait...';
my %ConceptData;
$ConceptData{"Interval"} = $interval;
#Initialize the option response true answers
- my ($analyzeData) = &InitAnalysis($uri, $part, $responseId, $problem,
+ my ($analyzeData) = &InitAnalysis($uri, $part, $responseId, $problem,
$students->[0], $courseID);
if(defined($analyzeData->{'error'})) {
$Str .= $analyzeData->{'error'}.' Incorrect part requested. ';
@@ -107,7 +165,7 @@ sub BuildAnalyzePage {
if($c->aborted()) { untie(%cache); return; }
#compute the intervals
- &Interval($part, $problem, $interval, $analyzeData->{'concepts'},
+ &Interval($part, $problem, $interval, $analyzeData->{'concepts'},
\%ConceptData);
$title =~ s/\ /"_"/eg;
@@ -116,18 +174,26 @@ sub BuildAnalyzePage {
$r->print($Str);
$Str = '';
if($c->aborted()) { untie(%cache); return; }
-
+
+ &Apache::lonhtmlcommon::Create_PrgWin($r, $title, $heading);
+
+ my $count=0;
#Java script Progress window
for(my $index=0; $index<(scalar @$students); $index++) {
if($c->aborted()) { untie(%cache); return; }
- &OpStatus($problemId, $students->[$index], \%ConceptData,
- $analyzeData->{'foil_to_concept'}, $analyzeData, \%cache);
+ $count++;
+ my $displayString = $count.'/'.$studentCount.': '.$_;
+ &Apache::lonhtmlcommon::Update_PrgWin($displayString, $r);
+ &OpStatus($problemId, $students->[$index], \%ConceptData,
+ $analyzeData->{'foil_to_concept'}, $analyzeData,
+ \%cache, $courseID);
}
+ &Apache::lonhtmlcommon::Close_PrgWin($r);
$Str .= ' ';
for (my $k=0; $k<$interval; $k++ ) {
if($c->aborted()) { untie(%cache); return $Str; }
- $Str .= &DrawGraph($k, $title, $analyzeData->{'concepts'},
+ $Str .= &DrawGraph($k, $title, $analyzeData->{'concepts'},
\%ConceptData);
$r->print($Str);
$Str = '';
@@ -160,8 +226,7 @@ sub IntervalOptions {
}
}
- my $Ptr = 'Select number of intervals '."\n".
- ''."\n";
+ my $Ptr = ''."\n";
for(my $n=1; $n<=7;$ n++) {
$Ptr .= '{$problemId.':source'};
- my $title = $cache->{$problemId.':title'};
-
- my $Temp = ''.$title.' ';
- $Str .= '';
- $Str .= ' '.$number.' ';
- $Str .= ''.$Temp.' ';
- $Str .= ''.$uri.' ';
- if($partCount{$problemId.':'.$part} < 2) {
- $Str .= ' '."\n";
- } else {
- $Str .= ' '."\n";
+ my $Str = '';
+
+ foreach my $sequence (@orderedSequences) {
+ my @optionProblems = split(':::', $sequences{$sequence});
+
+ $Str .= ''.$cache->{$sequence.':title'}.' '."\n";
+ $Str .= " '."\n";
}
- $Str .= ''."\n";
return $Str;
}
@@ -221,12 +303,14 @@ sub OptionResponseTable {
#---- Analyze Web Page -------------------------------------------------------
-#restore the student submissions and finding the result
+# Joson code for reading data from cache
+=pod
sub OpStatus {
- my ($problemID, $student, $ConceptData, $foil_to_concept,
+ my ($problemID, $student, $ConceptData, $foil_to_concept,
$analyzeData, $cache)=@_;
my $ids = $analyzeData->{'parts'};
+
my @True = ();
my @False = ();
my $flag=0;
@@ -234,7 +318,7 @@ sub OpStatus {
my $tries=0;
foreach my $id (@$ids) {
- my ($part, $response) = split(/\./, $id);
+ my ($part, $response) = split(/\./, $id);
my $time=$cache->{$student.':'.$problemID.':'.$part.':timestamp'};
my @submissions = split(':::', $cache->{$student.':'.$problemID.':'.
$part.':'.$response.
@@ -245,10 +329,10 @@ sub OpStatus {
if($submission{$_}) {
my $answer = $analyzeData->{$id.'.foil.value.'.$_};
if($submission{$_} eq $answer) {
- &Decide("true", $foil_to_concept->{$_},
+ &Decide("true", $foil_to_concept->{$_},
$time, $ConceptData);
} else {
- &Decide("false", $foil_to_concept->{$_},
+ &Decide("false", $foil_to_concept->{$_},
$time, $ConceptData);
}
}
@@ -258,6 +342,62 @@ sub OpStatus {
return;
}
+=cut
+
+
+#restore the student submissions and finding the result
+
+sub OpStatus {
+ my ($problemID, $student, $ConceptData, $foil_to_concept,
+ $analyzeData, $cache, $courseID)=@_;
+
+ my $ids = $analyzeData->{'parts'};
+ my ($uname,$udom)=split(/\:/,$student);
+ my $symb = $cache->{$problemID.':problem'};
+
+ my @True = ();
+ my @False = ();
+ my $flag=0;
+ my $tries=0;
+
+ foreach my $id (@$ids) {
+ my ($part, $response) = split(/\./, $id);
+ my %reshash=&Apache::lonnet::restore($symb,$courseID,$udom,$uname);
+ if ($reshash{'version'}) {
+ my $tries=0;
+ for (my $version=1;$version<=$reshash{'version'};$version++) {
+ my $time=$reshash{"$version:timestamp"};
+ foreach my $key (sort(split(/\:/,$reshash{$version.':keys'}))) {
+ if (($key=~/\.(\w+)\.(\w+)\.submission$/)) {
+ my $Id1 = $1; my $Id2 = $2;
+ #check if this is a repeat submission, if so skip it
+ if ($reshash{"$version:resource.$Id1.previous"}) { next; }
+ #if no solved this wasn't a real submission, ignore it
+ if (!defined($reshash{"$version:resource.$Id1.solved"})) {
+ &Apache::lonxml::debug("skipping ");
+ next;
+ }
+ my $Resp = $reshash{"$version:$key"};
+ my %submission=&Apache::lonnet::str2hash($Resp);
+ foreach (keys %submission) {
+ my $Ansr = $analyzeData->{"$Id1.$Id2.foil.value.$_"};
+ if($submission{$_} eq $Ansr) {
+ &Decide("true", $foil_to_concept->{$_},
+ $time, $ConceptData);
+ } else {
+ &Decide("false", $foil_to_concept->{$_},
+ $time, $ConceptData);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return;
+}
+
sub DrawGraph {
my ($k,$Src,$Concepts,$ConceptData)=@_;
@@ -265,7 +405,7 @@ sub DrawGraph {
my @data1;
my @data2;
- # Adjust Data and find the Max
+ # Adjust Data and find the Max
for (my $n=0; $n<(scalar @$Concepts); $n++ ) {
my $tmp=$Concepts->[$n];
$data1[$n]=$ConceptData->{$tmp.'.'.$k.'.true'};
@@ -324,7 +464,7 @@ sub DrawTable {
my $P_No = (scalar @data1);
my $Str = '';
# $Str .= 'From: ['.localtime($ConceptData->{'Int.'.($k-1)});
-# $Str .= '] To: ['.localtime($ConceptData->{"Int.$k"}).'] ';
+# $Str .= '] To: ['.localtime($ConceptData->{"Int.$k"}).']';
$Str .= "\n".''.
"\n".''.
"\n".' # '.
@@ -450,7 +590,7 @@ sub Interval {
for(my $i=1; $i<$Int; $i++) {
$ConceptData->{'Int.'.$i}=$opn+$i*$add;
}
- $ConceptData->{'Int.'.$Int}=$due;
+ $ConceptData->{'Int.'.$Int}=$due;
for(my $i=0; $i<$Int; $i++) {
for(my $n=0; $n<(scalar @$Concepts); $n++ ) {
my $tmp=$Concepts->[$n];