--- loncom/interface/statistics/lonproblemanalysis.pm 2002/08/14 16:18:55 1.7 +++ loncom/interface/statistics/lonproblemanalysis.pm 2003/03/03 21:52:24 1.20 @@ -1,7 +1,6 @@ # The LearningOnline Network with CAPA -# (Publication Handler # -# $Id: lonproblemanalysis.pm,v 1.7 2002/08/14 16:18:55 stredwic Exp $ +# $Id: lonproblemanalysis.pm,v 1.20 2003/03/03 21:52:24 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,16 +25,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(); @@ -60,9 +55,7 @@ sub BuildProblemAnalysisPage { $Ptr .= ''."\n"; my @sectionsSelected = split(':',$cache{'sectionsSelected'}); my @sections = split(':',$cache{'sectionList'}); - $Ptr .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections, - \@sectionsSelected, - 'Statistics'); + $Ptr .= &Apache::lonstatistics::SectionSelect('Section','multiple',5); $Ptr .= ''."\n"; $Ptr .= 'Intervals'."\n"; $Ptr .= ''; @@ -70,7 +63,8 @@ sub BuildProblemAnalysisPage { $Ptr .= '
'; $r->print($Ptr); $r->rflush(); - $r->print(&OptionResponseTable($cache{'OptionResponses'}, \%cache)); +# $r->print($cache{'OptionResponses'}.'
'); + $r->print(&OptionResponseTable($cache{'OptionResponses'}, \%cache, $r)); untie(%cache); @@ -94,7 +88,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,20 +111,26 @@ sub BuildAnalyzePage { splice(@$students, $studentIndex, 1); } } - untie(%cache); - - if(&Apache::loncoursedata::DownloadStudentCourseDataSeparate($students, - 'true', - $cacheDB, - 'true', - 'true', - $courseID, - $r, - $c) ne 'OK') { - $r->print($Str); - return; - } - + 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.'; @@ -138,15 +140,17 @@ 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 $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 +163,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 +172,26 @@ sub BuildAnalyzePage { $r->print($Str); $Str = ''; if($c->aborted()) { untie(%cache); return; } - + + + my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r, $title, + $heading,$#students+1); + #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); + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, + 'last student '.$students->[$index]); + &OpStatus($problemId, $students->[$index], \%ConceptData, + $analyzeData->{'foil_to_concept'}, $analyzeData, + \%cache, $courseID); } + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); $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,15 +238,17 @@ sub IntervalOptions { } sub OptionResponseTable { - my ($optionResponses,$cache)=@_; + my ($optionResponses,$cache,$r)=@_; my @optionResponses=split(':::', $optionResponses); my %partCount; my %sequences; + my @orderedSequences=(); foreach(@optionResponses) { my ($sequence, $problemId, $part, undef)=split(':',$_); $partCount{$problemId.':'.$part}++; if(!defined($sequences{$sequence})) { + push(@orderedSequences, $sequence); $sequences{$sequence} = $_; } else { $sequences{$sequence} .= ':::'.$_; @@ -243,7 +257,7 @@ sub OptionResponseTable { my $Str = ''; - foreach my $sequence (sort(keys(%sequences))) { + foreach my $sequence (@orderedSequences) { my @optionProblems = split(':::', $sequences{$sequence}); $Str .= ''.$cache->{$sequence.':title'}.''."\n"; @@ -253,7 +267,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'}; @@ -286,12 +301,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; @@ -299,7 +316,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. @@ -310,10 +327,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); } } @@ -323,6 +340,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)=@_; @@ -330,7 +403,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'}; @@ -360,7 +433,7 @@ sub DrawGraph { $GData = $Titr.'&Concepts&Answers&'.$Max.'&'.$P_No.'&'; $GData .= (join(',',@data1)).'&'.(join(',',@data2)); - return ''; + return ''; } sub DrawTable { @@ -389,7 +462,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".''. @@ -515,7 +588,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];
#