--- loncom/interface/statistics/lonproblemanalysis.pm 2002/08/14 20:42:49 1.8 +++ loncom/interface/statistics/lonproblemanalysis.pm 2002/11/22 03:56:05 1.12 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: lonproblemanalysis.pm,v 1.8 2002/08/14 20:42:49 stredwic Exp $ +# $Id: lonproblemanalysis.pm,v 1.12 2002/11/22 03:56:05 minaeibi Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,16 +26,12 @@ # 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(); @@ -70,7 +66,7 @@ sub BuildProblemAnalysisPage { $Ptr .= '
'; $r->print($Ptr); $r->rflush(); - $r->print(&OptionResponseTable($cache{'OptionResponses'}, \%cache)); + $r->print(&OptionResponseTable($cache{'OptionResponses'}, \%cache, $r)); untie(%cache); @@ -115,17 +111,21 @@ sub BuildAnalyzePage { splice(@$students, $studentIndex, 1); } } - untie(%cache); + unless(untie(%cache)) { + $r->print('Can not untie hash.'); + $r->rflush(); + } - if(&Apache::loncoursedata::DownloadStudentCourseDataSeparate($students, - 'true', - $cacheDB, - 'true', - 'true', - $courseID, - $r, - $c) ne 'OK') { - $r->print($Str); + 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; } @@ -138,7 +138,7 @@ 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'}; @@ -146,7 +146,7 @@ sub BuildAnalyzePage { $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 +159,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 +168,19 @@ sub BuildAnalyzePage { $r->print($Str); $Str = ''; if($c->aborted()) { untie(%cache); return; } - + #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); + &OpStatus($problemId, $students->[$index], \%ConceptData, + $analyzeData->{'foil_to_concept'}, $analyzeData, + \%cache, $courseID); } $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 = ''; @@ -226,7 +227,7 @@ sub IntervalOptions { } sub OptionResponseTable { - my ($optionResponses,$cache)=@_; + my ($optionResponses,$cache,$r)=@_; my @optionResponses=split(':::', $optionResponses); my %partCount; @@ -255,7 +256,8 @@ sub OptionResponseTable { my $count = 1; foreach(@optionProblems) { my (undef, $problemId, $part, $response)= - split(':',$sequences{$sequence}); + split(':',$optionProblems[$count-1]); +# split(':',$sequences{$sequence}); my $uri = $cache->{$problemId.':source'}; my $title = $cache->{$problemId.':title'}; @@ -289,11 +291,13 @@ sub OptionResponseTable { #---- Analyze Web Page ------------------------------------------------------- #restore the student submissions and finding the result +=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; @@ -301,7 +305,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. @@ -312,27 +316,152 @@ 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->{$_}, + $time, $ConceptData); + } + } + } + } + } + + return; +} +=cut + +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; + +# $jr->print("
ID= $problemID
student= $student
prob= $symb
"); + + foreach my $id (@$ids) { + my ($part, $response) = split(/\./, $id); +#=pod + my %reshash=&Apache::lonnet::restore($symb,$courseID,$udom,$uname); + if ($reshash{'version'}) { + my $tries=0; + #&Apache::lonhomework::showhash(%$analyzeData); + 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); + } + } + } + } + } + } +#=cut +=pod + my $time=$cache->{$student.':'.$problemID.':'.$part.':timestamp'}; + my @submissions = split(':::', $cache->{$student.':'.$problemID.':'. + $part.':'.$response. + ':submission'}); + foreach my $Resp (@submissions) { + my %submission=&Apache::lonnet::str2hash($Resp); + foreach (keys(%submission)) { + if($submission{$_}) { + my $answer = $analyzeData->{$id.'.foil.value.'.$_}; + if($submission{$_} eq $answer) { + &Decide("true", $foil_to_concept->{$_}, $time, $ConceptData); } else { - &Decide("false", $foil_to_concept->{$_}, + &Decide("false", $foil_to_concept->{$_}, $time, $ConceptData); } } } } +=cut } return; } +=pod +sub OpStatus { + my ($rid,$student,$ConceptData,$foil_to_concept,$analyzeData,$cache)=@_; + my ($uname,$udom)=split(/\:/,$student); + my $code='U'; + $rid=~/(\d+)\.(\d+)/; + my $symb=&Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'. + &Apache::lonnet::declutter($hash{'src_'.$rid}); + my %reshash=&Apache::lonnet::restore($symb,$cid,$udom,$uname); + my @True = (); + my @False = (); + my $flag=0; + if ($reshash{'version'}) { + my $tries=0; + &Apache::lonhomework::showhash(%Answer); + 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 = $Answer{"$Id1.$Id2.foil.value.$_"}; + if ($submission{$_}) { + if ($submission{$_} eq $Ansr) { + &Decide("true",$_,$time ); + } + else {&Decide("false",$_,$time );} + } + } + } + } + } + } +} +=cut + sub DrawGraph { my ($k,$Src,$Concepts,$ConceptData)=@_; my $Max=0; 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'}; @@ -391,7 +520,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".''. @@ -517,7 +646,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];
#