--- loncom/interface/statistics/lonproblemstatistics.pm 2002/07/25 19:29:23 1.2
+++ loncom/interface/statistics/lonproblemstatistics.pm 2002/08/06 02:01:05 1.14
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# (Publication Handler
#
-# $Id: lonproblemstatistics.pm,v 1.2 2002/07/25 19:29:23 minaeibi Exp $
+# $Id: lonproblemstatistics.pm,v 1.14 2002/08/06 02:01:05 minaeibi Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -31,7 +31,7 @@
# 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,7/25 Behrouz Minaei
+# 5/12,5/14,5/15,5/19,5/26,7/16,7/25,7/29,8/5 Behrouz Minaei
#
###
@@ -43,10 +43,9 @@ use Apache::lonhtmlcommon;
use Apache::loncoursedata;
use GDBM_File;
-my %mapsort;
sub BuildProblemStatisticsPage {
- my ($cacheDB, $students, $courseID, $c, $r,%color)=@_;
+ my ($cacheDB, $students, $courseID, $c, $r)=@_;
my %cache;
#my %DoDiff;
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) {
@@ -57,16 +56,27 @@ sub BuildProblemStatisticsPage {
$Ptr .= '
';
$Ptr .= 'Select Map | '."\n";
$Ptr .= '';
- $Ptr .= &Apache::lonhtmlcommon::MapOptions(\%cache, 'ProblemStatistics');
+ $Ptr .= &Apache::lonhtmlcommon::MapOptions(\%cache, 'ProblemStatistics',
+ 'Statistics');
+ $Ptr .= ' |
'."\n";
+ $Ptr .= 'Sorting Type: | '."\n";
+ $Ptr .= ''."\n";
+ $Ptr .= &Apache::lonhtmlcommon::AscendOrderOptions(
+ $cache{'ProblemStatisticsAscend'},
+ 'ProblemStatistics',
+ 'Statistics');
$Ptr .= ' |
'."\n";
- $Ptr .= &AscendOrderOptions($cache{'Ascend'});
$Ptr .= &ProblemStatisticsButtons($cache{'DisplayFormat'});
$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());
@@ -75,323 +85,67 @@ sub BuildProblemStatisticsPage {
$courseData, $_);
untie(%cache);
}
+ $count++;
}
- if($c->aborted()) { return $Ptr; }
+ &Close_PrgWin($r);
+ if($c->aborted()) { return; }
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) {
return 'Unable to tie database.';
}
- my $discriminantFactor;
- my @list=();
- my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID);
- my $index=0;
- foreach (@$students) {
- #&Apache::lonstatistics::Update_PrgWin(++$index,$r);
- $discriminantFactor = &ExtractStudentData(\%cache, $_, \@list,\%Discuss);
- }
- #&Apache::lonstatistics::Close_PrgWin($r);
- return $Ptr;
- my ($upper, $lower) = &Discriminant($discriminantFactor);
my %Header = (0,"Homework Sets Order",1,"#Stdnts",2,"Tries",3,"Mod",
4,"Mean",5,"#YES",6,"#yes",7,"%Wrng",8,"DoDiff",
9,"S.D.",10,"Skew.",11,"D.F.1st",12,"D.F.2nd", 13, "Disc.");
+ my $color=&setbgcolor(0);
- my %GraphDat= &BuildStatisticsTable(\%cache, $discriminantFactor, \@list,
- \%Header, $students, $r, \%color);
-
- untie(%cache);
-
- 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;
- }
+ my $state=$ENV{'form.ProblemStatisticsHeading'};
- 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 $state=&Apache::lonstatistics::CheckFormElement(\%cache,
+# 'ProblemStatisticsHeading',
+# 'ProblemStatisticsHeading',
+# 'Homework Sets Order');
+# $r->print("
state=".$state);
+
+ my $TempCache;
+
+ if ($state) {
+ $TempCache=&CacheStatisticsTable($state,\%cache,\%Header,
+ $r,$color);
+ } else {
+ my %discriminant=();
+ my @list=();
+ my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID);
+ 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,
+ $r, $color);
}
- 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]));
+ untie(%cache);
- return $Dif;
-}
+ foreach (keys %$TempCache) {
+ last if ($c->aborted());
+ if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT,0640)) {
+ $cache{$_}=$TempCache->{$_};
-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");
+ untie(%cache);
}
}
- 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)).'');
-# }
-# }
+ if($c->aborted()) { return; }
+ untie(%cache);
}
-#---- 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;
-}
-
-
sub CreateProblemStatisticsTableHeading {
my ($displayFormat,$sequenceSource,$sequenceTitle,$headings,$r)=@_;
if($displayFormat eq 'Display CSV Format') {
@@ -399,10 +153,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".'