--- loncom/interface/statistics/lonproblemstatistics.pm 2002/08/05 18:10:08 1.12 +++ loncom/interface/statistics/lonproblemstatistics.pm 2002/08/06 17:38:26 1.16 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: lonproblemstatistics.pm,v 1.12 2002/08/05 18:10:08 minaeibi Exp $ +# $Id: lonproblemstatistics.pm,v 1.16 2002/08/06 17:38:26 minaeibi Exp $ # # Copyright Michigan State University Board of Trustees # @@ -47,7 +47,7 @@ use GDBM_File; sub BuildProblemStatisticsPage { my ($cacheDB, $students, $courseID, $c, $r)=@_; my %cache; - #my %DoDiff; + unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { return 'Unable to tie database.'; } @@ -70,9 +70,13 @@ sub BuildProblemStatisticsPage { $Ptr .= ''; $Ptr .= &ProblemStatisticsLegend(); $r->print($Ptr); + $r->rflush(); untie(%cache); + &Create_PrgWin($r); + my $count=0; foreach (@$students) { + &Update_PrgWin(scalar(@$students),$count,$_,$r); my $courseData = &Apache::loncoursedata::DownloadCourseInformation($_, $courseID); last if ($c->aborted()); @@ -81,7 +85,9 @@ sub BuildProblemStatisticsPage { $courseData, $_); untie(%cache); } + $count++; } + &Close_PrgWin($r); if($c->aborted()) { return; } unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { @@ -95,12 +101,6 @@ sub BuildProblemStatisticsPage { my $state=$ENV{'form.ProblemStatisticsHeading'}; -# my $state=&Apache::lonstatistics::CheckFormElement(\%cache, -# 'ProblemStatisticsHeading', -# 'ProblemStatisticsHeading', -# 'Homework Sets Order'); - $r->print("
state=".$state); - my $TempCache; if ($state) { @@ -113,11 +113,9 @@ sub BuildProblemStatisticsPage { my $index=0; foreach (@$students) { $index++; - #&Apache::lonstatistics::Update_PrgWin(++$index,$r); &ExtractStudentData(\%cache, $_, \@list,\%Discuss, $r, \%discriminant); } - #&Apache::lonstatistics::Close_PrgWin($r); my ($upper, $lower) = &Discriminant(\%discriminant,$r); $TempCache= &BuildStatisticsTable(\%cache, $upper, $lower, \@list, \%Header, $students, @@ -140,12 +138,6 @@ sub BuildProblemStatisticsPage { #---- Problem Statistics Web Page --------------------------------------- - -sub NumericSort { - $a <=> $b; -} - - sub CreateProblemStatisticsTableHeading { my ($displayFormat,$sequenceSource,$sequenceTitle,$headings,$r)=@_; if($displayFormat eq 'Display CSV Format') { @@ -153,10 +145,12 @@ sub CreateProblemStatisticsTableHeading $r->print($sequenceSource.'"'); return; } - - $r->print('
'.$sequenceTitle.''); - + if ($sequenceSource eq 'Sorted by: ') { + $r->print('
'.$sequenceSource.$sequenceTitle.''); + } else { + $r->print('
'.$sequenceTitle.''); + } my $Result = "\n".''."\n"; for(my $nIndex=0; $nIndex < (scalar (keys %$headings)); $nIndex++) { $Result .= ''. "\n".''. - # "\n".''. "\n".''. "\n".''. "\n".''. @@ -700,7 +688,7 @@ sub TableRow { "\n".''; $r->print("\n".$Ptr.'' ); } - $GraphDat->{'graph_gif:'.$RealIdx}=$DoD.':'.$Wrng; + $GraphDat->{'GraphGif:'.$RealIdx}=$DoD.':'.$Wrng; } @@ -842,9 +830,6 @@ sub ProcessDiscriminant { #------- Creating Discimination factor sub Discriminant { my ($discriminant,$r)=@_; -#$Apache::lonxml::debug=1; -#&Apache::lonhomework::showhash(%$discriminant); -#$Apache::lonxml::debug=0; my @discriminantKeys=keys(%$discriminant); my $Count = scalar @discriminantKeys; @@ -880,69 +865,53 @@ sub Discriminant { # ------------------------------------------- Prepare data for Graphical chart -sub BuildDiffGraph { - my ($r)=@_; +sub BuildGraphicChart { + my ($ylab,$r,$cacheDB)=@_; + my %cache; + my $Col; + my $data=''; + my $count = 0; + my $Max = 0; - my $graphData = &GetGraphData('DiffGraph', $r); - $r->print(''); + unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { + return 'Unable to tie database.'; + } + + my $p_count = $cache{'ProblemCount'}; - return; -} + for ( my $k=0; $k<$p_count;$k++) { + my @Temp=split(/\:/,$cache{'GraphGif:'.$k}); + my $inf = $Temp[$Col]; + if ( $Max < $inf ) {$Max = $inf;} + $data .= $inf.','; + $count++; + } + untie(%cache); +# $r->print("
count=$p_count >>data= $data"); -sub BuildWrongGraph { - my ($r)=@_; + if ( $Max > 1 ) { + $Max += (10 - $Max % 10); + $Max = int($Max); + } else { $Max = 1; } - my $graphData = &GetGraphData('WrongGraph', $r); - $r->print(''); + my $cid=$ENV{'request.course.id'}; - return; -} + if ( $ylab eq 'DoDiff Graph' ) { + $ylab = 'Degree-of-Difficulty'; + $Col = 0; + } else { + $ylab = 'Wrong-Percentage'; + $Col = 1; + } + my $Course = $ENV{'course.'.$cid.'.description'}; + $Course =~ s/\ /"_"/eg; + my $GData=$Course.'&'.'Problems#'.'&'.$ylab.'&'. + $Max.'&'.$count.'&'.$data; + $r->print(''); -sub GetGraphData { - my ($ylab,$r,%GraphDat)=@_; - my $Col; - my $data=''; - my $count = 0; - my $Max = 0; - my $cid=$ENV{'request.course.id'}; - my $GraphDB = "/home/httpd/perl/tmp/$ENV{'user.name'}". - "_$ENV{'user.domain'}_$cid\_graph.db"; - foreach (keys %GraphDat) {delete $GraphDat{$_};} - if (-e "$GraphDB") { - if (tie(%GraphDat,'GDBM_File',"$GraphDB",&GDBM_READER,0640)) { - if ( $ylab eq 'DoDiff Graph' ) { - $ylab = 'Degree-of-Difficulty'; - $Col = 0; - } - else { - $ylab = 'Wrong-Percentage'; - $Col = 1; - } - foreach (sort NumericSort keys %GraphDat) { - my @Temp=split(/\:/,$GraphDat{$_}); - my $inf = $Temp[$Col]; - if ( $Max < $inf ) {$Max = $inf;} - $data .= $inf.','; - $count++; - } - if ( $Max > 1 ) { - $Max += (10 - $Max % 10); - $Max = int($Max); - } - else { $Max = 1; } - untie(%GraphDat); - my $Course = $ENV{'course.'.$cid.'.description'}; - $Course =~ s/\ /"_"/eg; - my $GData=$Course.'&'.'Problems'.'&'.$ylab.'&'. - $Max.'&'.$count.'&'.$data; - } - else { - $r->print("Unable to tie hash to db file"); - } - } + return; } - 1; __END__
P#'.''+ + 'LON-CAPA Statistics'+ + '

Computation Progress

'+ + '
'+ + '
'+ + ''); + popwin.document.close(); + +ENDPOP + + $r->rflush(); +} + +# update progress +sub Update_PrgWin { + my ($totalStudents,$index,$name,$r)=@_; + $r->print(''); + $r->rflush(); +} + +# close Progress Line +sub Close_PrgWin { + my ($r)=@_; + $r->print(''); + $r->rflush(); +} + # ------ Dump the Student's DB file and handling the data for statistics table sub ExtractStudentData { @@ -204,17 +233,12 @@ sub ExtractStudentData { my $tempProblemOrder=100; if($cache->{'ProblemStatisticsMaps'} ne 'All Maps' && $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) { -# $r->print("
sequences=$cache->{'orderedSequences'}"); -# $r->print("
".$cache->{$sequence.':title'}); next; } $tempSequenceOrder++; - #$discrim .= '&'; foreach my $problemID (split(':', $cache->{$sequence.':problems'})) { -# $r->print("
problems=$cache->{$sequence.':problems'}"); my $problem = $cache->{$problemID.':problem'}; -# $r->print("
$problemID === $problem"); my $LatestVersion = $cache->{$name.':version:'.$problem}; # Output dashes for all the parts of this problem if there # is no version information about the current problem. @@ -238,7 +262,6 @@ sub ExtractStudentData { ':parts'})) { $tempProblemOrder++; $partData{'count'}++; -# $r->print("
parts=$cache->{$sequence.':'.$problemID.':parts'}"); $partData{$part.':order'}=$tempProblemOrder; $partData{$part.':tries'}=0; $partData{$part.':code'}='-'; @@ -290,10 +313,6 @@ sub ExtractStudentData { } } -#$Apache::lonxml::debug=1; -#&Apache::lonhomework::showhash(%partData); -#$Apache::lonxml::debug=0; - # Loop through all the parts for the current problem in the # correct order and prepare the output my $partCounter=0; @@ -311,9 +330,7 @@ sub ExtractStudentData { if($partData{'count'} > 1) { $ptr .= "*(part $_)"; } - #if($partCounter > 1) { - $discrim .= '&'; - #} + $discrim .= '&'; my ($pr_no,$dod)=split('&',$ptr); # my $DoDiff=$DoDiff->{$dod}; @@ -377,18 +394,15 @@ sub ExtractStudentData { } } +sub NumericSort { + $a <=> $b; +} - -sub MySort { - my $pos=shift; - if ( $pos > 0 ) { - if ($ENV{'form.order'} eq 'Descending') {$b <=> $a;} - else { $a <=> $b; } - } - else { -# if ($ENV{'form.order'} eq 'Descending') {$b cmp $a;} -# else { $a cmp $b; } - $a cmp $b; +sub OrderedSort { + if ($ENV{'form.order'} eq 'Descending') { + $b <=> $a; + } else { + $a <=> $b; } } @@ -464,25 +478,13 @@ sub BuildStatisticsTable { $p_count++; my $Dummy; ($ResId,$Dummy)=split(/\*/,$Temp); - -###################### $Temp = ''.$cache->{$ResId.':title'}.$Dummy.''; - #$r->print('
rid='.$ResId); - #$r->print('
src='.$cache->{$ResId.':source'}); - #$r->print('
tit='.$cache->{$ResId.':title'}); - - my $res = &Apache::lonnet::declutter($cache->{$ResId.':source'}); - my $urlres=$res; - - $ResId=~/(\d+)\.(\d+)/; - my $Map = &Apache::lonnet::declutter( $cache->{'map_id_'.$1} ); - $urlres=$Map; -####################### - -# $res = ''.$res.''; - #$Map = ''.$res.''; +# my $urlres = $cache->{$sequence.':source'}); +#check with Gerd + #symb of the problem (already decluttered and cleaned) + my $urlres = $cache->{$ResId.':problem'}; #------------------------ Compute the Average of Tries about one problem my $Average = ($StdNo) ? $TotalTries/$StdNo : 0; @@ -490,7 +492,7 @@ sub BuildStatisticsTable { $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___timestamp'}=time; $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___stdno'}=$StdNo; $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___avetries'}=$Average; - + #-------------------------------- Compute percentage of Wrong tries my $Wrong = ( $StdNo ) ? 100 * ( $Incorrect / $StdNo ) : 0; @@ -547,7 +549,6 @@ sub BuildStatisticsTable { $SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'. $DiscNo.'&'.$Prob; -#####{$sequence.'@'.$pOrd} $TempCache{'CacheTable:'.($p_count-1)}=$join; #6666666 @@ -555,10 +556,11 @@ sub BuildStatisticsTable { # print (OUT $out.'@'.$DoD.'&'); #6666666 +#check with Gerd $urlres=~/^(\w+)\/(\w+)/; if ($StdNo) { &Apache::lonnet::put('resevaldata',\%storestats,$1,$2); - } + } #-------------------------------- Row of statistical table &TableRow($cache,$join,$cIdx,($p_count-1),$r,$color, \%TempCache); @@ -567,7 +569,7 @@ sub BuildStatisticsTable { &CloseTable($cache,$r); } ### &Close_PrgWin(); -#666666 +#6666666 # close( OUT ); #666666 return \%TempCache; @@ -575,12 +577,10 @@ sub BuildStatisticsTable { sub CacheStatisticsTable { - my ($state,$cache,$Header,$r,$color)=@_; - my @list = (); - my $Useful; - my $UnUseful; + my ($state,$cache,$headings,$r,$color)=@_; + my @list = (); my %TempCache; - my %myHeader = reverse( %$Header ); + my %myHeader = reverse( %$headings ); my $pos = $myHeader{$state}; if ($pos > 0) {$pos++;} my $p_count = $cache->{'ProblemCount'}; @@ -588,71 +588,60 @@ sub CacheStatisticsTable { for ( my $k=0; $k<$p_count;$k++) { my $key=$cache->{'CacheTable:'.$k}; my @Temp=split(/\&/,$key); - if ( $pos == 0 ) { - ($UnUseful,$Useful)=split(/\>/,$Temp[$pos]); - } - else { - $Useful = $Temp[$pos]; - } - $list[$k]=$Useful.'@'.$key; - $r->print('
'.$list[$k]); + $list[$k]=$Temp[$pos].'+'.$key; } + + if ($pos>0) { + @list = sort OrderedSort (@list); + } else { + @list = sort (@list); + } + my $cIdx=0; - - @list = sort MySort (@list); - - my $nIndex=0; - - return \%TempCache; -} - - -=pod - - if ( $Pos == 0 ) { + if ( $pos == 0 ) { foreach my $sequence (split(':', $cache->{'orderedSequences'})) { if($cache->{'ProblemStatisticsMaps'} ne 'All Maps' && $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) { next; } + if ($cIdx==$p_count) { + return \%TempCache; + } &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, $cache->{$sequence.':source'}, $cache->{$sequence.':title'}, $headings,$r); - my ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/, - $list[$cIdx]); - my ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar); + my ($tar)=split(/\&/,$list[$cIdx]); + $tar=~s/\+//eg; + my ($SqOrd)=split(/\@/,$tar); $sequence+=100; - while ($SqOrd==$sequence && $cIdx<$NoElements) { - my %storestats=(); - my @lpr=split(/\&/,$pr); - for (my $i=1; $i<=$#lpr; $i++) { - my($Pre, $Post) = split(/\@/,$list[$nIndex]); - #$r->print('
'.$Pre.'---'.$Post); - &TableRow($cache,$Post,$i,$nIndex,$color,\%GraphDat); - $nIndex++; + while ($SqOrd==$sequence && $cIdx<$p_count) { + my($Pre, $Post) = split(/\+/,$list[$cIdx]); + &TableRow($cache,$Post,$cIdx,$cIdx,$r,$color,\%TempCache); + $cIdx++; + my ($tar)=split(/\&/,$list[$cIdx]); + $tar=~s/\+//eg; + ($SqOrd)=split(/\@/,$tar); } - &CloseTable($cache); + &CloseTable($cache,$r); } } else { &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, - $cache->{$sequence.':source'}, - $cache->{$sequence.':title'}, + 'Sorted by: ', + $headings->{$pos-1}, $headings,$r); for ( my $nIndex = 0; $nIndex < $p_count; $nIndex++ ) { - my($Pre, $Post) = split(/\@/,$list[$nIndex]); - &TableRow($cache,$Post,$nIndex,$nIndex,$color,\%GraphDat); + my($Pre, $Post) = split(/\+/,$list[$nIndex]); + &TableRow($cache,$Post,$nIndex,$nIndex,$r,$color,\%TempCache); } - &CloseTable($cache); + &CloseTable($cache,$r); } return \%TempCache; } -=cut - sub TableRow { my ($cache,$Str,$Idx,$RealIdx,$r,$color,$GraphDat)=@_; @@ -683,7 +672,6 @@ sub TableRow { } else { $Ptr="\n".'
'.($RealIdx+1).''.$PrOrd.$Temp.''.$Temp.' '.$StdNo.''.$TotalTries.' '.$DiscNo.'