--- loncom/interface/statistics/lonproblemstatistics.pm 2002/08/14 16:18:55 1.25 +++ 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.25 2002/08/14 16:18:55 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,7 +53,7 @@ sub BuildProblemStatisticsPage { unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { $r->print('Unable to tie database.'); - return; + return ('ERROR', undef); } # Remove students who don't have the proper section. @@ -80,42 +80,6 @@ sub BuildProblemStatisticsPage { } } - my $Ptr = ''; - $Ptr .= ''; - $Ptr .= ''."\n"; - $Ptr .= ''."\n"; - $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 .= '
Select Sections'; - $Ptr .= ''."\n"; - my @sections = split(':',$cache{'sectionList'}); - $Ptr .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections, - \@sectionsSelected, - 'Statistics'); - $Ptr .= '
'; - if($cache{'DisplayLegend'} eq 'Show Legend') { - $Ptr .= &ProblemStatisticsLegend(); - } - $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 $lastStatus = (defined($cache{'StatisticsLastStatus'})) ? $cache{'StatisticsLastStatus'} : 'Nothing'; @@ -127,7 +91,7 @@ sub BuildProblemStatisticsPage { 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'}; @@ -144,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); @@ -156,7 +120,7 @@ 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->{$_}; @@ -169,14 +133,76 @@ sub BuildProblemStatisticsPage { 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); @@ -184,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'}); @@ -221,7 +253,8 @@ sub BuildGraphicChart { $sendValues); $r->print(''."\n"); - $r->print(''); + $r->print(''); $r->print('
'."\n"); return; @@ -247,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"; @@ -263,15 +297,8 @@ 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->{'StatisticsMaps'} ne 'All Maps' && @@ -279,11 +306,33 @@ sub BuildStatisticsTable { 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'}, @@ -300,12 +349,15 @@ sub BuildStatisticsTable { 0); # 0 is for discussion, need to figure out &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.'&'); @@ -323,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; @@ -387,7 +439,7 @@ sub setbgcolor { } sub ProblemStatisticsButtons { - my ($displayFormat, $displayLegend)=@_; + my ($displayFormat, $displayLegend, $sortProblems)=@_; my $Ptr = ''; $Ptr .= '{'problemList'}); if($sortBy eq "Homework Sets Order") { @@ -614,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); }