--- loncom/interface/statistics/lonproblemstatistics.pm 2002/07/26 21:50:12 1.3 +++ loncom/interface/statistics/lonproblemstatistics.pm 2002/07/27 20:48:36 1.4 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: lonproblemstatistics.pm,v 1.3 2002/07/26 21:50:12 minaeibi Exp $ +# $Id: lonproblemstatistics.pm,v 1.4 2002/07/27 20:48:36 minaeibi Exp $ # # Copyright Michigan State University Board of Trustees # @@ -43,7 +43,6 @@ use Apache::lonhtmlcommon; use Apache::loncoursedata; use GDBM_File; -#my %mapsort; sub BuildProblemStatisticsPage { my ($cacheDB, $students, $courseID, $c, $r,%color)=@_; @@ -106,288 +105,10 @@ sub BuildProblemStatisticsPage { return $Ptr; } -sub BuildDiffGraph { - my ($r)=@_; - - my $graphData = &GetGraphData('DiffGraph', $r); - return ''; -} - -sub BuildWrongGraph { - my ($r)=@_; - - my $graphData = &GetGraphData('WrongGraph', $r); - return ''; -} - -#---- Activity log ------------------------------------------------------- - -sub LoadDoDiffFile { - my $file="/home/minaeibi/183d.txt"; - open(FILEID, "<$file"); - my $line=; - my %DoDiff=(); - my @Act=split('&',$line); - -# $r->print('
'.$#Act); - for(my $n=0;$n<=$#Act;$n++){ - my ($res,$Degree)=split('@',$Act[$n]); - $DoDiff{$res}=$Degree; - } - - return \%DoDiff; -} - -sub LoadClassFile { - my $file="/home/minaeibi/class.txt"; - open(FILEID, "<$file"); - my $line; - my %Grade=(); - while ($line=) { - my ($id,$ex1,$ex2,$ex3,$ex4,$hw,$final,$grade)=split(' ',$line); - $Grade{$id}=$grade; - } - return \%Grade; -} - -#------- Classification -sub Classify { - my ($DiscFac, $students)=@_; - my ($fileGrade) = &LoadClassFile(); - my $Count=0; - my @List=(); - my @LS=(); - my @LF=(); - my @LM=(); - my $cf=0; - my $cs=0; - my $cm=0; - foreach (keys(%$DiscFac)){ - my @l=split(/\:/,$_); - if (!($students->{$l[1]})) {next;} - my $Grade=$fileGrade->{$students->{$l[1]}}; - if( $Grade > 3 ) { - $cs++; - push(@LS,("$l[6],$l[5],$l[4],$l[7],$l[8],$l[9],Successful")); - } elsif ( $Grade > 2 ) { - $cm++; - push(@LM,("$l[6],$l[5],$l[4],$l[7],$l[8],$l[9],Average")); - } else { - $cf++; - push(@LF,("$l[6],$l[5],$l[4],$l[7],$l[8],$l[9],Failed")); - } - } - my $Str = ''; - for(my $n=0;$n<$cs;$n++){$Str .= '
'.$LS[$n];} - for(my $n=0;$n<$cm;$n++){$Str .= '
'.$LM[$n];} - for(my $n=0;$n<$cf;$n++){$Str .= '
'.$LF[$n];} - - return $Str; -} - -sub ProcAct { - # return; - my ($Act,$Submit)=@_; - my @Act=split(/\@/,$Act); - @Act = sort(@Act); - - ##$r->print('
'.$#Act); - ##for(my $n=0;$n<=$#Act;$n++){ -## $r->print('
n='.$n.')'.$Act[$n]); -## } - -# my $Beg=$Act[0]; - my $Dif=$Submit-$Act[0]; - $Dif = ($Dif>0) ? ($Dif/3600) : 0; - -# $r->print('
Access Number = '.$#Act.'
Submit Time='.$Submit.'
First Access='.$Act[0].'
Last Access='.$Act[$#Act].'
Submit - First = '.$Dif.''); - - -#time spent for solving the problem -# $r->print('
Def'.($Act[$#Act-1]-$Act[0])); - - return $Dif; -} - -sub LoadActivityLog { -# my $CacheDB = "/home/minaeibi/act183.log.cache"; - my $CacheDB = "/home/httpd/perl/tmp/act183.log.cache"; - - my %Activity; - if (-e "$CacheDB") { - if (tie(%Activity,'GDBM_File',"$CacheDB",&GDBM_READER,0640)) { - return; - } - else { -# $r->print("Unable to tie log Cache hash to db file"); - } - } - else { - if (tie(%Activity,'GDBM_File',$CacheDB,&GDBM_WRCREAT,0640)) { - foreach (keys %Activity) {delete $Activity{$_};} - &Build_log(\%Activity); - } - else { -# $r->print("Unable to tie log Build hash to db file"); - } - } - return \%Activity; -} - -sub Build_log { - my ($Activity)=@_; - my $file="/home/minaeibi/act183.log"; - open(FILEID, "<$file"); - my $line; - my $count=0; - while ($line=) { - my ($time,$machine,$what)=split(':',$line); - $what=&Apache::lonnet::unescape($what); - my @accesses=split('&',$what); - - foreach my $access (@accesses) { - - $count++; - - my ($date,$resource,$who,$domain,$post,@posts)=split(':',$access); - if (!$resource) { next; } - my $res=&Apache::lonnet::unescape($resource); - if (($res =~ /\.problem/)) { - $Activity->{$who.':'.$res}.=$date.'@'; - #$r->print('
'.$time.':'.$who.'---'.$res); - &Update_PrgInit($count); - - } - } - } - -# my $c=1; -# foreach (sort keys %Activity) { -# $r->print('
'.$c.')'.$_.' ... '.$Activity{$_}); -# $c++; -# } - -} - -sub Activity { - my $file="/home/minaeibi/activity.log"; - my $userid='adamsde1'; -# $r->print("
Using $file"); -# $r->rflush(); - open(FILEID, "<$file"); - my $line; - my @allaccess; - my $Count=0; - while ($line=) { - my ($time,$machine,$what)=split(':',$line); - $what=&Apache::lonnet::unescape($what); - my @accesses=split('&',$what); - foreach my $access (@accesses) { - my ($date,$resource,$who,$domain,$post,@posts)=split(':',$access); - #if ($who ne $userid) { next; } - if (!$resource) { next; } - my $res=&Apache::lonnet::unescape($resource); - if (($res =~ /\.(sequence|problem|htm|html|page)/)) { - $Count++; -###888 $r->print("
$Count) ".localtime($date).": $who --> $res"); -# if ($post) { -# $Count++; -# $r->print("
$Count) Sent data ".join(':', -# &Apache::lonnet::unescape(@posts)).''); -# } -###888 $r->rflush(); - } - #push (@allaccess,unescape($access)); - #print $machine; - } - } -# @allaccess=sort(@allaccess); -# $Count=0; -# foreach my $access (@allaccess) { -# my ($date,$resource,$who,$domain,$post,@posts)=split(':',$access); -# $Count++; -# $r->print("
$Count) $date: $who --> $resource"); -# $r->rflush(); -# if ($post) { -# $r->print("
Sent data ".join(':',unescape(@posts)).''); -# } -# } -} - -#---- END Activity log --------------------------------------------------- #---- Problem Statistics Web Page --------------------------------------- -#------- Processing upperlist and lowerlist according to each problem -sub ProcessDiscriminant { - my ($List) = @_; - my @sortedList = sort (@$List); - my $Count = scalar @sortedList; - my $Problem; - my @Dis; - my $Slvd=0; - my $tmp; - my $Sum1=0; - my $Sum2=0; - my $nIndex=0; - my $nStudent=0; - my %Proc=undef; - while ($nIndex<$Count) { - ($Problem,$tmp)=split(/\=/,$sortedList[$nIndex]); - @Dis=split(/\+/,$tmp); - my $Temp = $Problem; - do { - $nIndex++; - $nStudent++; - $Sum1 += $Dis[0]; - $Sum2 += $Dis[1]; - ($Problem,$tmp)=split(/\=/,$sortedList[$nIndex]); - @Dis=split(/\+/,$tmp); - } while ( $Problem eq $Temp && $nIndex < $Count ); -# $Proc{$Temp}=($Sum1/$nStudent).':'.$nStudent; - $Proc{$Temp}=($Sum1/$nStudent).':'.($Sum2/$nStudent); -# $r->print("$nIndex) $Temp --> ($nStudent) $Proc{$Temp}
"); - $Sum1=0; - $Sum2=0; - $nStudent=0; - } - - return %Proc; -} -#------- Creating Discimination factor -sub Discriminant { - my ($discriminantFactor)=@_; - my @discriminantKeys=keys(%$discriminantFactor); - my $Count = scalar @discriminantKeys; - - my $UpCnt = int(0.27*$Count); - my $low=0; - my $up=$Count-$UpCnt; - my @UpList=(); - my @LowList=(); - - $Count=0; - foreach my $key (sort(@discriminantKeys)) { - $Count++; - if($low < $UpCnt || $Count > $up) { - $low++; - my $str=$discriminantFactor->{$key}; - foreach(split(/\:/,$str)){ - if($_) { - if($low<$UpCnt) { push(@LowList,$_); } - else { push(@UpList,$_); } - } - } - } - } - my %DisUp = &ProcessDiscriminant(\@UpList); - my %DisLow = &ProcessDiscriminant(\@LowList); - - return (\%DisUp, \%DisLow); -} - - sub NumericSort { $a <=> $b; } @@ -451,8 +172,8 @@ $Apache::lonxml::debug=0; foreach my $sequence (split(':', $cache->{'orderedSequences'})) { # if($cache->{'ProblemStatisticsMap'} ne 'All Maps' && # $cache->{'ProblemStatisticsMap'} ne $cache->{$sequence.':title'}) { - $r->print("
$name --- $sequence"); - $r->print("
".$cache->{$sequence.':title'}); +# $r->print("
$name --- $sequence"); +# $r->print("
".$cache->{$sequence.':title'}); # next; # } @@ -535,6 +256,8 @@ $Apache::lonxml::debug=0; # correct order and prepare the output foreach (split(/\:/,$cache->{$sequence.':'.$problemID. ':parts'})) { + #$r->print("
".$cache->{$sequence.':title'}); + my $Yes = 0; if($partData{$_.':code'} eq 'C' || $partData{$_.':code'} eq 'O') { @@ -1024,12 +747,98 @@ sub ProblemStatisticsLegend { return $Ptr; } +#------- Processing upperlist and lowerlist according to each problem +sub ProcessDiscriminant { + my ($List) = @_; + my @sortedList = sort (@$List); + my $Count = scalar @sortedList; + my $Problem; + my @Dis; + my $Slvd=0; + my $tmp; + my $Sum1=0; + my $Sum2=0; + my $nIndex=0; + my $nStudent=0; + my %Proc=undef; + while ($nIndex<$Count) { + ($Problem,$tmp)=split(/\=/,$sortedList[$nIndex]); + @Dis=split(/\+/,$tmp); + my $Temp = $Problem; + do { + $nIndex++; + $nStudent++; + $Sum1 += $Dis[0]; + $Sum2 += $Dis[1]; + ($Problem,$tmp)=split(/\=/,$sortedList[$nIndex]); + @Dis=split(/\+/,$tmp); + } while ( $Problem eq $Temp && $nIndex < $Count ); +# $Proc{$Temp}=($Sum1/$nStudent).':'.$nStudent; + $Proc{$Temp}=($Sum1/$nStudent).':'.($Sum2/$nStudent); +# $r->print("$nIndex) $Temp --> ($nStudent) $Proc{$Temp}
"); + $Sum1=0; + $Sum2=0; + $nStudent=0; + } + + return %Proc; +} + +#------- Creating Discimination factor +sub Discriminant { + my ($discriminantFactor)=@_; + my @discriminantKeys=keys(%$discriminantFactor); + my $Count = scalar @discriminantKeys; + + my $UpCnt = int(0.27*$Count); + my $low=0; + my $up=$Count-$UpCnt; + my @UpList=(); + my @LowList=(); + + $Count=0; + foreach my $key (sort(@discriminantKeys)) { + $Count++; + if($low < $UpCnt || $Count > $up) { + $low++; + my $str=$discriminantFactor->{$key}; + foreach(split(/\:/,$str)){ + if($_) { + if($low<$UpCnt) { push(@LowList,$_); } + else { push(@UpList,$_); } + } + } + } + } + my %DisUp = &ProcessDiscriminant(\@UpList); + my %DisLow = &ProcessDiscriminant(\@LowList); + + return (\%DisUp, \%DisLow); +} + + + #---- END Problem Statistics Web Page ---------------------------------------- #---- Problem Statistics Graph Web Page -------------------------------------- # ------------------------------------------- Prepare data for Graphical chart +sub BuildDiffGraph { + my ($r)=@_; + + my $graphData = &GetGraphData('DiffGraph', $r); + return ''; +} + +sub BuildWrongGraph { + my ($r)=@_; + + my $graphData = &GetGraphData('WrongGraph', $r); + return ''; +} + + sub GetGraphData { my ($ylab,$r,%GraphDat)=@_; my $Col; @@ -1073,5 +882,7 @@ sub GetGraphData { } } } + + 1; __END__