--- loncom/interface/statistics/lonproblemstatistics.pm 2002/08/14 13:13:37 1.24 +++ loncom/interface/statistics/lonproblemstatistics.pm 2002/08/14 17:45:19 1.26 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: lonproblemstatistics.pm,v 1.24 2002/08/14 13:13:37 stredwic Exp $ +# $Id: lonproblemstatistics.pm,v 1.26 2002/08/14 17:45:19 stredwic Exp $ # # Copyright Michigan State University Board of Trustees # @@ -45,7 +45,7 @@ use GDBM_File; my $jr; -sub BuildProblemStatisticsPage { +sub InitializeProblemStatistics { my ($cacheDB, $students, $courseID, $c, $r)=@_; my %cache; @@ -53,45 +53,45 @@ sub BuildProblemStatisticsPage { unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { $r->print('Unable to tie database.'); - return; + return ('ERROR', undef); } - my $Ptr = ''; - $Ptr .= ''; - $Ptr .= ''."\n"; - $Ptr .= ''."\n"; - $Ptr .= ''."\n"; - $Ptr .= ''."\n"; - $Ptr .= &ProblemStatisticsButtons($cache{'DisplayFormat'}, - $cache{'DisplayLegend'}); - $Ptr .= '
Select Map'; - $Ptr .= &Apache::lonhtmlcommon::MapOptions(\%cache, 'ProblemStatistics', - 'Statistics'); - $Ptr .= '
Sorting Type:'."\n"; - $Ptr .= &Apache::lonhtmlcommon::AscendOrderOptions( - $cache{'ProblemStatisticsAscend'}, - 'ProblemStatistics', - 'Statistics'); - $Ptr .= '
'; - if($cache{'DisplayLegend'} eq 'Show Legend') { - $Ptr .= &ProblemStatisticsLegend(); + # Remove students who don't have the proper section. + my @sectionsSelected = split(':',$cache{'sectionsSelected'}); + for(my $studentIndex=((scalar @$students)-1); $studentIndex>=0; + $studentIndex--) { + my $value = $cache{$students->[$studentIndex].':section'}; + my $found = 0; + foreach (@sectionsSelected) { + if($_ eq 'none') { + if($value eq '' || !defined($value) || $value eq ' ') { + $found = 1; + last; + } + } else { + if($value eq $_) { + $found = 1; + last; + } + } + } + if($found == 0) { + splice(@$students, $studentIndex, 1); + } } - $r->print($Ptr); - $r->rflush(); - - my @Header = ("Homework Sets Order","#Stdnts","Tries","Mod", - "Mean","#YES","#yes","%Wrng","DoDiff", - "S.D.","Skew.","D.F.1st","D.F.2nd","Disc."); - my $color=&setbgcolor(0); # my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID); -# my ($upper, $lower) = &Discriminant(\%discriminant,$r); - if(!defined($cache{'StatisticsCached'})) { + my $lastStatus = (defined($cache{'StatisticsLastStatus'})) ? + $cache{'StatisticsLastStatus'} : 'Nothing'; + my $whichStudents = join(':::',sort(@$students)); + if(!defined($cache{'StatisticsCached'}) || + $lastStatus ne $cache{'Status'} || + $whichStudents ne $cache{'StatisticsWhichStudents'}) { if(defined($cache{'StatisticsCached'})) { untie(%cache); unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT(),0640)) { $r->print('Unable to tie database.'); - return; + return ('ERROR', undef); } my @statkeys = split(':::', $cache{'StatisticsKeys'}); delete $cache{'StatisticsKeys'}; @@ -108,11 +108,11 @@ sub BuildProblemStatisticsPage { 'true', $courseID, $r, $c); - if($c->aborted()) { return; } + if($c->aborted()) { return ('ERROR', undef); } unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { $r->print('Unable to tie database.'); - return; + return ('ERROR', undef); } my ($problemData) = &ExtractStudentData(\%cache, $students); &CalculateStatistics($problemData, \%cache); @@ -120,24 +120,89 @@ sub BuildProblemStatisticsPage { unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT(),0640)) { $r->print('Unable to tie database.'); - return; + return ('ERROR', undef); } foreach(keys(%$problemData)) { $cache{$_} = $problemData->{$_}; } $cache{'StatisticsKeys'} = join(':::', keys(%$problemData)); $cache{'StatisticsCached'} = 'true'; + $cache{'StatisticsLastStatus'} = $cache{'Status'}; + $cache{'StatisticsWhichStudents'} = $whichStudents; untie(%cache); unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { $r->print('Unable to tie database.'); - return; + return ('ERROR', undef); } } + my $orderedProblems = &SortProblems(\%cache, $cache{'ProblemStatisticsSort'}, + $cache{'SortProblems'}, $cache{'ProblemStatisticsAscend'}); - &BuildStatisticsTable(\%cache, $cache{'DisplayFormat'}, $orderedProblems, + return ('OK', $orderedProblems); +} + +sub BuildProblemStatisticsPage { + my ($cacheDB, $students, $courseID, $c, $r)=@_; + + my @Header = ("Homework Sets Order","#Stdnts","Tries","Mod", + "Mean","#YES","#yes","%Wrng","DoDiff", + "S.D.","Skew.","D.F.1st","D.F.2nd","Disc."); + my $color=&setbgcolor(0); + my %cache; + + unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { + $r->print('Unable to tie database.'); + return; + } + my $Ptr = ''; + $Ptr .= ''; + $Ptr .= ''."\n"; + $Ptr .= ''."\n"; + $Ptr .= ''."\n"; + $Ptr .= ''."\n"; + $Ptr .= ''."\n"; + $Ptr .= ''."\n"; + $Ptr .= &ProblemStatisticsButtons($cache{'DisplayFormat'}, + $cache{'DisplayLegend'}, + $cache{'SortProblems'}); + $Ptr .= '
Select Map'; + $Ptr .= &Apache::lonhtmlcommon::MapOptions(\%cache, 'ProblemStatistics', + 'Statistics'); + $Ptr .= '
Sorting Type:'."\n"; + $Ptr .= &Apache::lonhtmlcommon::AscendOrderOptions( + $cache{'ProblemStatisticsAscend'}, + 'ProblemStatistics', + 'Statistics'); + $Ptr .= '
Select Sections'; + $Ptr .= ''."\n"; + my @sections = split(':',$cache{'sectionList'}); + my @sectionsSelected = split(':',$cache{'sectionsSelected'}); + $Ptr .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections, + \@sectionsSelected, + 'Statistics'); + $Ptr .= '
'; + if($cache{'DisplayLegend'} eq 'Show Legend') { + $Ptr .= &ProblemStatisticsLegend(); + } + $r->print($Ptr); + $r->rflush(); + untie(%cache); + + my ($result, $orderedProblems) = + &InitializeProblemStatistics($cacheDB, $students, $courseID, $c, $r); + if($result ne 'OK') { + return; + } + + unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { + $r->print('Unable to tie database.'); + return; + } + &BuildStatisticsTable(\%cache, $cache{'DisplayFormat'}, + $cache{'SortProblems'}, $orderedProblems, \@Header, $r, $color); untie(%cache); @@ -145,12 +210,18 @@ sub BuildProblemStatisticsPage { } sub BuildGraphicChart { - my ($graph,$cacheDB,$courseDescription,$r)=@_; + my ($graph,$cacheDB,$courseDescription,$students,$courseID,$r,$c)=@_; my %cache; my $max = 0; + my ($result, undef) = + &InitializeProblemStatistics($cacheDB, $students, $courseID, $c, $r); + if($result ne 'OK') { + return; + } + unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { - return 'Unable to tie database.'; + return 'Unable to tie database.'; } my @problems = split(':::', $cache{'problemList'}); @@ -170,7 +241,6 @@ sub BuildGraphicChart { untie(%cache); my $sendValues = join(',', @values); -# my $sendCount = $#values; my $sendCount = scalar(@values); my $title = ''; @@ -183,7 +253,8 @@ sub BuildGraphicChart { $sendValues); $r->print(''."\n"); - $r->print(''); + $r->print(''); $r->print('
'."\n"); return; @@ -209,7 +280,8 @@ sub CreateProblemStatisticsTableHeading } sub BuildStatisticsTable { - my ($cache,$displayFormat,$orderedProblems,$headings,$r,$color)=@_; + my ($cache,$displayFormat,$sortProblems,$orderedProblems,$headings, + $r,$color)=@_; #6666666 # my $file="/home/httpd/perl/tmp/183d.txt"; @@ -225,27 +297,42 @@ sub BuildStatisticsTable { ##777777 ## $Str .= &Classify($discriminantFactor, $students); - if($displayFormat ne 'Display CSV Format') { - $r->print('
'."\n"); - $r->print(''."\n"); - $r->print(&CreateProblemStatisticsTableHeading($headings, $r)); - } else { - $r->print('
'); - } - my $count = 1; + my $currentSequence = -1; foreach(@$orderedProblems) { my ($sequence,$problem,$part)=split(':', $_); - if($cache->{'ProblemStatisticsMaps'} ne 'All Maps' && - $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) { + if($cache->{'StatisticsMaps'} ne 'All Maps' && + $cache->{'StatisticsMaps'} ne $cache->{$sequence.':title'}) { next; } + if($currentSequence == -1 || + ($sortProblems eq 'Sort Within Sequence' && + $currentSequence != $sequence)) { + if($displayFormat ne 'Display CSV Format') { + if($currentSequence ne -1) { + $r->print('
'); + $r->print('

'); + } + if($sortProblems eq 'Sort Within Sequence') { + $r->print(''.$cache->{$sequence.':title'}.''); + } + $r->print('
'."\n"); + $r->print(''."\n"); + $r->print(&CreateProblemStatisticsTableHeading($headings, $r)); + } else { + if($sortProblems eq 'Sort Within Sequence') { + $r->print('"'.$cache->{$sequence.':title'}.'"'); + } + $r->print('
'); + } + $currentSequence = $sequence; + } + my $ref = ''.$cache->{$problem.':title'}.''; -# my $ref = $cache->{$problem.':title'}; my $title = $cache->{$problem.':title'}; - my $source = 'source'; + my $source = $cache->{$problem.':source'}; my $tableData = join('&', $ref, $title, $source, $cache->{$_.':studentCount'}, $cache->{$_.':totalTries'}, @@ -261,25 +348,21 @@ sub BuildStatisticsTable { sprintf("%.2f", $cache->{$_.':discriminationFactor2'}), 0); # 0 is for discussion, need to figure out -#6666666 -# $r->print('
'.$out.'&'.$DoD); -# print (OUT $out.'@'.$DoD.'&'); -#6666666 - -#check with Gerd -# $urlres=~/^(\w+)\/(\w+)/; -# if ($StdNo) { -# &Apache::lonnet::put('nohist_resevaldata',\%storestats, -# $1,$2); -# } -#-------------------------------- Row of statistical table &TableRow($displayFormat,$tableData,$count,$r,$color); + $count++; } - if($cache->{'DisplayFormat'} ne 'Display CSV Format') { + if($displayFormat ne 'Display CSV Format') { $r->print('
'."\n"); + $r->print('
'); + } else { + $r->print('
'); } - $r->print(''); +#6666666 +# $r->print('
'.$out.'&'.$DoD); +# print (OUT $out.'@'.$DoD.'&'); +#6666666 + #6666666 # close( OUT ); #666666 @@ -292,43 +375,43 @@ sub TableRow { $Wrng,$DoD,$SD,$Sk,$_D1,$_D2,$DiscNo,$Prob)=split(/\&/,$Str); my $Ptr; if($displayFormat eq 'Display CSV Format') { - $Ptr="\n".'
'. - "\n".'"'.$RealIdx.'",'. - "\n".'"'.$title.'",'. - "\n".'"'.$source.'",'. - "\n".'"'.$StdNo.'",'. - "\n".'"'.$TotalTries.'",'. - "\n".'"'.$MxTries.'",'. - "\n".'"'.$Avg.'",'. - "\n".'"'.$YES.'",'. - "\n".'"'.$Override.'",'. - "\n".'"'.$Wrng.'",'. - "\n".'"'.$DoD.'",'. - "\n".'"'.$SD.'",'. - "\n".'"'.$Sk.'",'. - "\n".'"'.$_D1.'",'. - "\n".'"'.$_D2.'"'. - "\n".'"'.$DiscNo.'"'; + $Ptr='"'.$RealIdx.'",'."\n". + '"'.$title.'",'."\n". + '"'.$source.'",'."\n". + '"'.$StdNo.'",'."\n". + '"'.$TotalTries.'",'."\n". + '"'.$MxTries.'",'."\n". + '"'.$Avg.'",'."\n". + '"'.$YES.'",'."\n". + '"'.$Override.'",'."\n". + '"'.$Wrng.'",'."\n". + '"'.$DoD.'",'."\n". + '"'.$SD.'",'."\n". + '"'.$Sk.'",'."\n". + '"'.$_D1.'",'."\n". + '"'.$_D2.'"'."\n". + '"'.$DiscNo.'"'."\n". + "
\n"; $r->print("\n".$Ptr); } else { - $Ptr="\n".''. - "\n".''.$RealIdx.''. - "\n".''.$ref.''. - "\n".' '.$StdNo.''. - "\n".''.$TotalTries.''. - "\n".''.$MxTries.''. - "\n".''.$Avg.''. - "\n".' '.$YES.''. - "\n".' '.$Override.''. - "\n".' '.$Wrng.''. - "\n".' '.$DoD.''. - "\n".' '.$SD.''. - "\n".' '.$Sk.''. - "\n".' '.$_D1.''. - "\n".' '.$_D2.''. - "\n".' '.$DiscNo.''; - $r->print("\n".$Ptr.'' ); + $Ptr=''."\n". + ''.$RealIdx.''."\n". + ''.$ref.''."\n". + ' '.$StdNo.''."\n". + ''.$TotalTries.''."\n". + ''.$MxTries.''."\n". + ''.$Avg.''."\n". + ' '.$YES.''."\n". + ' '.$Override.''."\n". + ' '.$Wrng.''."\n". + ' '.$DoD.''."\n". + ' '.$SD.''."\n". + ' '.$Sk.''."\n". + ' '.$_D1.''."\n". + ' '.$_D2.''."\n". + ' '.$DiscNo.''."\n"; + $r->print($Ptr.''."\n"); } return; @@ -356,7 +439,7 @@ sub setbgcolor { } sub ProblemStatisticsButtons { - my ($displayFormat, $displayLegend)=@_; + my ($displayFormat, $displayLegend, $sortProblems)=@_; my $Ptr = ''; $Ptr .= '{'problemList'}); if($sortBy eq "Homework Sets Order") { @@ -583,9 +673,24 @@ sub SortProblems { elsif($sortBy eq "Disc.") { $data = ''; } else { return \@problems; } - my @orderedProblems = - sort { $problemData->{$a.$data} <=> $problemData->{$b.$data} } - @problems; + my %temp; + foreach(@problems) { + my ($sequence) = split(':', $_); + $temp{$_} = $sequence; + } + + my @orderedProblems; + if($sortProblems eq "Sort Within Sequence") { + @orderedProblems = + sort { $temp{$a} cmp $temp{$b} || + $problemData->{$a.$data} <=> $problemData->{$b.$data} } + @problems; + } else { + @orderedProblems = + sort { $problemData->{$a.$data} <=> $problemData->{$b.$data} } + @problems; + } + if($ascend eq 'Descending') { @orderedProblems = reverse(@orderedProblems); } @@ -647,13 +752,13 @@ sub CalculateStatistics { foreach my $name (@upper1) { $upper1Sum += $cache->{"$name:$problem:$part:awarded"}; } - $upper1Sum /= (scalar(@upper1)) ? (scalar(@upper1)) : 0; + $upper1Sum = (scalar(@upper1)) ? ($upper1Sum/(scalar(@upper1))) : 0; my $lower1Sum=0; foreach my $name (@lower1) { $lower1Sum += $cache->{"$name:$problem:$part:awarded"}; } - $lower1Sum /= (scalar(@lower1)) ? (scalar(@lower1)) : 0; + $lower1Sum = (scalar(@lower1)) ? ($lower1Sum/(scalar(@lower1))) : 0; $data->{$_.':discriminationFactor1'} = $upper1Sum - $lower1Sum; @@ -665,13 +770,13 @@ sub CalculateStatistics { foreach my $name (@upper2) { $upper2Sum += $cache->{"$name:$problem:$part:awarded"}; } - $upper2Sum /= (scalar(@upper2)) ? (scalar(@upper2)) : 0; + $upper2Sum = (scalar(@upper2)) ? ($upper2Sum/(scalar(@upper2))) : 0; my $lower2Sum=0; foreach my $name (@lower2) { $lower2Sum += $cache->{"$name:$problem:$part:awarded"}; } - $lower2Sum /= (scalar(@lower2)) ? (scalar(@lower2)) : 0; + $lower2Sum = (scalar(@lower2)) ? ($lower2Sum/(scalar(@lower2))) : 0; $data->{$_.':discriminationFactor2'} = $upper2Sum - $lower2Sum; }