--- loncom/interface/statistics/lonproblemanalysis.pm 2002/09/07 23:07:38 1.10 +++ loncom/interface/statistics/lonproblemanalysis.pm 2002/11/22 03:46:57 1.11 @@ -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.11 2002/11/22 03:46:57 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(); @@ -116,11 +116,11 @@ sub BuildAnalyzePage { $r->rflush(); } - my $error = + my $error = &Apache::loncoursedata::DownloadStudentCourseDataSeparate($students, 'true', $cacheDB, - 'true', + 'true', 'true', $courseID, $r, $c); @@ -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 = ''; @@ -242,7 +243,7 @@ sub OptionResponseTable { $sequences{$sequence} .= ':::'.$_; } } - + my $Str = ''; foreach my $sequence (@orderedSequences) { @@ -290,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; @@ -302,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. @@ -313,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{$_}) { + if ($submission{$_} eq $Ansr) { + &Decide("true",$_,$time ); + } + else {&Decide("false",$_,$time );} + } + } + } + } + } + } +=cut + + 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); } } } } + + } 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'}; @@ -392,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".''. @@ -518,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];
#