--- loncom/interface/statistics/lonproblemanalysis.pm 2002/09/07 23:07:38 1.10 +++ loncom/interface/statistics/lonproblemanalysis.pm 2002/11/25 18:12:52 1.15 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: lonproblemanalysis.pm,v 1.10 2002/09/07 23:07:38 minaeibi Exp $ +# $Id: lonproblemanalysis.pm,v 1.15 2002/11/25 18:12:52 minaeibi Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,11 +27,11 @@ # # (Navigate problems for statistical reports # YEAR=2002 -# 5/12,7/26 Behrouz Minaei +# 5/12,7/26,9/7,11/22 Behrouz Minaei # ### -package Apache::lonproblemanalysis; +package Apache::lonproblemanalysis; use strict; use Apache::lonnet(); @@ -90,7 +90,9 @@ sub BuildAnalyzePage { # Remove students who don't have the proper section. my @sectionsSelected = split(':',$cache{'sectionsSelected'}); - for(my $studentIndex=((scalar @$students)-1); $studentIndex>=0; + + my $studentCount = scalar @$students; + for(my $studentIndex=$studentCount-1; $studentIndex>=0; $studentIndex--) { my $value = $cache{$students->[$studentIndex].':section'}; my $found = 0; @@ -115,19 +117,22 @@ sub BuildAnalyzePage { $r->print('Can not untie hash.'); $r->rflush(); } + #if($status eq 'true') + { &Apache::lonhtmlcommon::Close_PrgWin($r); } - 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; - } + +# 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)) { @@ -138,15 +143,19 @@ sub BuildAnalyzePage { 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 $title = 'LON-CAPA Statistics'; + 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.
'; @@ -159,7 +168,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; @@ -168,18 +177,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 = ''; @@ -242,7 +259,7 @@ sub OptionResponseTable { $sequences{$sequence} .= ':::'.$_; } } - + my $Str = ''; foreach my $sequence (@orderedSequences) { @@ -289,12 +306,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; @@ -302,7 +321,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. @@ -313,10 +332,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); } } @@ -326,6 +345,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)=@_; @@ -333,7 +408,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'}; @@ -392,7 +467,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".''. @@ -518,7 +593,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];
#