version 1.3, 2002/07/26 21:50:12
|
version 1.5, 2002/07/29 21:23:22
|
Line 43 use Apache::lonhtmlcommon;
|
Line 43 use Apache::lonhtmlcommon;
|
use Apache::loncoursedata; |
use Apache::loncoursedata; |
use GDBM_File; |
use GDBM_File; |
|
|
#my %mapsort; |
|
|
|
sub BuildProblemStatisticsPage { |
sub BuildProblemStatisticsPage { |
my ($cacheDB, $students, $courseID, $c, $r,%color)=@_; |
my ($cacheDB, $students, $courseID, $c, $r)=@_; |
my %cache; |
my %cache; |
#my %DoDiff; |
#my %DoDiff; |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { |
Line 62 sub BuildProblemStatisticsPage {
|
Line 61 sub BuildProblemStatisticsPage {
|
$Ptr .= &AscendOrderOptions($cache{'Ascend'}); |
$Ptr .= &AscendOrderOptions($cache{'Ascend'}); |
$Ptr .= &ProblemStatisticsButtons($cache{'DisplayFormat'}); |
$Ptr .= &ProblemStatisticsButtons($cache{'DisplayFormat'}); |
$Ptr .= '</table>'; |
$Ptr .= '</table>'; |
|
|
$Ptr .= &ProblemStatisticsLegend(); |
$Ptr .= &ProblemStatisticsLegend(); |
|
$r->print($Ptr); |
|
|
untie(%cache); |
untie(%cache); |
foreach (@$students) { |
foreach (@$students) { |
Line 76 sub BuildProblemStatisticsPage {
|
Line 75 sub BuildProblemStatisticsPage {
|
untie(%cache); |
untie(%cache); |
} |
} |
} |
} |
if($c->aborted()) { return $Ptr; } |
if($c->aborted()) { return; } |
|
|
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { |
return '<html><body>Unable to tie database.</body></html>'; |
return '<html><body>Unable to tie database.</body></html>'; |
Line 92 sub BuildProblemStatisticsPage {
|
Line 91 sub BuildProblemStatisticsPage {
|
\%Discuss, $r); |
\%Discuss, $r); |
} |
} |
#&Apache::lonstatistics::Close_PrgWin($r); |
#&Apache::lonstatistics::Close_PrgWin($r); |
|
|
my ($upper, $lower) = &Discriminant($discriminantFactor); |
my ($upper, $lower) = &Discriminant($discriminantFactor); |
my %Header = (0,"Homework Sets Order",1,"#Stdnts",2,"Tries",3,"Mod", |
my %Header = (0,"Homework Sets Order",1,"#Stdnts",2,"Tries",3,"Mod", |
4,"Mean",5,"#YES",6,"#yes",7,"%Wrng",8,"DoDiff", |
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."); |
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, |
my %GraphDat= &BuildStatisticsTable(\%cache, $discriminantFactor, \@list, |
\%Header, $students, $r, \%color); |
\%Header, $students, $r, $color); |
|
|
untie(%cache); |
untie(%cache); |
|
|
return $Ptr; |
|
} |
|
|
|
sub BuildDiffGraph { |
|
my ($r)=@_; |
|
|
|
my $graphData = &GetGraphData('DiffGraph', $r); |
|
return '<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />'; |
|
} |
|
|
|
sub BuildWrongGraph { |
|
my ($r)=@_; |
|
|
|
my $graphData = &GetGraphData('WrongGraph', $r); |
|
return '<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />'; |
|
} |
|
|
|
#---- Activity log ------------------------------------------------------- |
|
|
|
sub LoadDoDiffFile { |
|
my $file="/home/minaeibi/183d.txt"; |
|
open(FILEID, "<$file"); |
|
my $line=<FILEID>; |
|
my %DoDiff=(); |
|
my @Act=split('&',$line); |
|
|
|
# $r->print('<br>'.$#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=<FILEID>) { |
|
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 .= '<br>'.$LS[$n];} |
|
for(my $n=0;$n<$cm;$n++){$Str .= '<br>'.$LM[$n];} |
|
for(my $n=0;$n<$cf;$n++){$Str .= '<br>'.$LF[$n];} |
|
|
|
return $Str; |
|
} |
|
|
|
sub ProcAct { |
|
# return; |
|
my ($Act,$Submit)=@_; |
|
my @Act=split(/\@/,$Act); |
|
@Act = sort(@Act); |
|
|
|
##$r->print('<br>'.$#Act); |
|
##for(my $n=0;$n<=$#Act;$n++){ |
|
## $r->print('<br>n='.$n.')'.$Act[$n]); |
|
## } |
|
|
|
# my $Beg=$Act[0]; |
|
my $Dif=$Submit-$Act[0]; |
|
$Dif = ($Dif>0) ? ($Dif/3600) : 0; |
|
|
|
# $r->print('<br>Access Number = '.$#Act.'<br>Submit Time='.$Submit.'<br>First Access='.$Act[0].'<br>Last Access='.$Act[$#Act].'<br> Submit - First = <b>'.$Dif.'</b>'); |
|
|
|
|
|
#time spent for solving the problem |
|
# $r->print('<br>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=<FILEID>) { |
|
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('<br>'.$time.':'.$who.'---'.$res); |
|
&Update_PrgInit($count); |
|
|
|
} |
|
} |
|
} |
|
|
|
# my $c=1; |
|
# foreach (sort keys %Activity) { |
|
# $r->print('<br>'.$c.')'.$_.' ... '.$Activity{$_}); |
|
# $c++; |
|
# } |
|
|
|
} |
|
|
|
sub Activity { |
|
my $file="/home/minaeibi/activity.log"; |
|
my $userid='adamsde1'; |
|
# $r->print("<br>Using $file"); |
|
# $r->rflush(); |
|
open(FILEID, "<$file"); |
|
my $line; |
|
my @allaccess; |
|
my $Count=0; |
|
while ($line=<FILEID>) { |
|
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("<br>$Count) ".localtime($date).": $who --> $res"); |
|
# if ($post) { |
|
# $Count++; |
|
# $r->print("<br><b>$Count) Sent data ".join(':', |
|
# &Apache::lonnet::unescape(@posts)).'</b>'); |
|
# } |
|
###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("<br>$Count) $date: $who --> $resource"); |
|
# $r->rflush(); |
|
# if ($post) { |
|
# $r->print("<br><b>Sent data ".join(':',unescape(@posts)).'</b>'); |
|
# } |
|
# } |
|
} |
} |
|
|
#---- END Activity log --------------------------------------------------- |
|
|
|
#---- Problem Statistics Web Page --------------------------------------- |
#---- 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} <br>"); |
|
$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 { |
sub NumericSort { |
$a <=> $b; |
$a <=> $b; |
} |
} |
Line 433 sub ExtractStudentData {
|
Line 151 sub ExtractStudentData {
|
|
|
my $totalTries = 0; |
my $totalTries = 0; |
my $totalAwarded = 0; |
my $totalAwarded = 0; |
my $tempProblemOrder=0; |
|
my $spent=0; |
my $spent=0; |
my $spent_yes=0; |
my $spent_yes=0; |
my $TotDiscuss=0; |
my $TotDiscuss=0; |
Line 443 sub ExtractStudentData {
|
Line 160 sub ExtractStudentData {
|
my $TotFirst = 0; |
my $TotFirst = 0; |
my $TimeTot = 0; |
my $TimeTot = 0; |
my $Discussed=0; |
my $Discussed=0; |
|
my $tempSequenceOrder=100; |
|
|
$Apache::lonxml::debug=1; |
#$Apache::lonxml::debug=1; |
#&Apache::lonhomework::showhash(%$cache); |
#&Apache::lonhomework::showhash(%$cache); |
$Apache::lonxml::debug=0; |
#$Apache::lonxml::debug=0; |
|
|
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
|
my $tempProblemOrder=100; |
|
$tempSequenceOrder++; |
# if($cache->{'ProblemStatisticsMap'} ne 'All Maps' && |
# if($cache->{'ProblemStatisticsMap'} ne 'All Maps' && |
# $cache->{'ProblemStatisticsMap'} ne $cache->{$sequence.':title'}) { |
# $cache->{'ProblemStatisticsMap'} ne $cache->{$sequence.':title'}) { |
$r->print("<br>$name --- $sequence"); |
# $r->print("<br>sequences=$cache->{'orderedSequences'}"); |
$r->print("<br>".$cache->{$sequence.':title'}); |
# $r->print("<br>".$cache->{$sequence.':title'}); |
# next; |
# next; |
# } |
# } |
|
|
my $Dis = ''; |
my $Dis = ''; |
foreach my $problemID (split(':', $cache->{$sequence.':problems'})) { |
foreach my $problemID (split(':', $cache->{$sequence.':problems'})) { |
|
# $r->print("<br>problems=$cache->{$sequence.':problems'}"); |
my $problem = $cache->{$problemID.':problem'}; |
my $problem = $cache->{$problemID.':problem'}; |
$r->print("<br>$problemID === $problem"); |
# $r->print("<br>$problemID === $problem"); |
my $LatestVersion = $cache->{$name.':version:'.$problem}; |
my $LatestVersion = $cache->{$name.':version:'.$problem}; |
# Output dashes for all the parts of this problem if there |
# Output dashes for all the parts of this problem if there |
# is no version information about the current problem. |
# is no version information about the current problem. |
Line 480 $Apache::lonxml::debug=0;
|
Line 201 $Apache::lonxml::debug=0;
|
foreach my $part (split(/\:/,$cache->{$sequence.':'. |
foreach my $part (split(/\:/,$cache->{$sequence.':'. |
$problemID. |
$problemID. |
':parts'})) { |
':parts'})) { |
|
$tempProblemOrder++; |
|
# $r->print("<br>parts=$cache->{$sequence.':'.$problemID.':parts'}"); |
|
$partData{$part.':order'}=$tempProblemOrder; |
$partData{$part.':tries'}=0; |
$partData{$part.':tries'}=0; |
$partData{$part.':code'}='-'; |
$partData{$part.':code'}='-'; |
} |
} |
Line 502 $Apache::lonxml::debug=0;
|
Line 226 $Apache::lonxml::debug=0;
|
my $time=0; |
my $time=0; |
my $awarded=0; |
my $awarded=0; |
$Discussed=0; |
$Discussed=0; |
my $code='U'; |
my $code='-'; |
|
|
$awarded = $cache->{$name. |
$awarded = $cache->{$name. |
"$Version:$problem:resource.". |
"$Version:$problem:resource.". |
Line 531 $Apache::lonxml::debug=0;
|
Line 255 $Apache::lonxml::debug=0;
|
} |
} |
} |
} |
|
|
|
#$Apache::lonxml::debug=1; |
|
#&Apache::lonhomework::showhash(%partData); |
|
#$Apache::lonxml::debug=0; |
|
|
# Loop through all the parts for the current problem in the |
# Loop through all the parts for the current problem in the |
# correct order and prepare the output |
# correct order and prepare the output |
foreach (split(/\:/,$cache->{$sequence.':'.$problemID. |
foreach (split(/\:/,$cache->{$sequence.':'.$problemID. |
':parts'})) { |
':parts'})) { |
|
#$r->print("<br>".$cache->{$sequence.':title'}); |
|
|
my $Yes = 0; |
my $Yes = 0; |
if($partData{$_.':code'} eq 'C' || |
if($partData{$_.':code'} eq 'C' || |
$partData{$_.':code'} eq 'O') { |
$partData{$_.':code'} eq 'O') { |
$Yes=1; |
$Yes=1; |
} |
} |
my $ptr = $tempProblemOrder.'&'.$problemID; |
my $pOrder=$partData{$_.':order'}; |
|
my $ptr = $tempSequenceOrder.':'.$pOrder.':'.$problemID; |
|
|
if($_ > 1) { |
if($_ > 1) { |
$ptr .= "*(part $_)"; |
$ptr .= "*(part $_)"; |
Line 551 $Apache::lonxml::debug=0;
|
Line 282 $Apache::lonxml::debug=0;
|
# my $DoDiff=$DoDiff->{$dod}; |
# my $DoDiff=$DoDiff->{$dod}; |
# $r->print('<br>'.$name.'---'.$ptr.'==='.$DoDiff); |
# $r->print('<br>'.$name.'---'.$ptr.'==='.$DoDiff); |
|
|
my $Fac = ($partData{$_.':Tries'}) ? |
my $Fac = ($partData{$_.':tries'}) ? |
($partData{$_.':awarded'}/$partData{$_.':tries'}) : 0; |
($partData{$_.':awarded'}/$partData{$_.':tries'}) : 0; |
my $DisF; |
my $DisF; |
if($Fac > 0 && $Fac < 1) { |
if($Fac > 0 && $Fac < 1) { |
Line 566 $Apache::lonxml::debug=0;
|
Line 297 $Apache::lonxml::debug=0;
|
} |
} |
my $time = $cache->{"$name:$LatestVersion:$problem:timestamp"}; |
my $time = $cache->{"$name:$LatestVersion:$problem:timestamp"}; |
$Dis .= $tempProblemOrder.'='.$DisF.'+'.$Yes; |
$Dis .= $tempProblemOrder.'='.$DisF.'+'.$Yes; |
$ptr .= '&'.$partData{$_.'.tries'}. |
$ptr .= '&'.$partData{$_.':tries'}. |
'&'.$partData{$_.'.wrongs'}. |
'&'.$partData{$_.':wrong'}. |
'&'.$partData{$_.'.code'}; |
'&'.$partData{$_.':code'}; |
push (@$list, $ptr."&$Discussed"); |
push (@$list, $ptr."&$Discussed"); |
$r->print('<br>'.$name.'---'.$ptr); |
# $r->print('<br>'.$_.$name.'---'.$ptr); |
|
|
#### if ($DoDiff>0.85) { |
#### if ($DoDiff>0.85) { |
|
|
$TimeTot += $time; |
$TimeTot += $time; |
|
|
if ($Yes==1 && $partData{$_.'.Tries'}==1) { |
if ($Yes==1 && $partData{$_.':tries'}==1) { |
$TotFirst++; |
$TotFirst++; |
} |
} |
# my $Acts= $Activity->{$name.':'.$problem}; |
# my $Acts= $Activity->{$name.':'.$problem}; |
Line 628 sub MySort {
|
Line 359 sub MySort {
|
|
|
|
|
sub BuildStatisticsTable { |
sub BuildStatisticsTable { |
my ($cache,$discriminantFactor,$list,$headings,$students,$r,%color)=@_; |
my ($cache,$discriminantFactor,$list,$headings,$students,$r,$color)=@_; |
|
|
|
my $NoElements = scalar @$list; |
|
my @List=sort(@$list); |
|
|
|
# for (my $c=0;$c<$NoElements;$c++) { |
|
## $r->print('<br>'.$c.')'.$List[$c]); |
|
# $r->print("<br>$List[$c]"); |
|
# } |
|
|
#6666666 |
#6666666 |
# my $file="/home/httpd/perl/tmp/183d.txt"; |
# my $file="/home/httpd/perl/tmp/183d.txt"; |
Line 641 sub BuildStatisticsTable {
|
Line 380 sub BuildStatisticsTable {
|
## 'Loading Discussion...";</script>'); |
## 'Loading Discussion...";</script>'); |
## my ($doDiffFile) = &LoadDoDiffFile(); |
## my ($doDiffFile) = &LoadDoDiffFile(); |
|
|
|
##777777 |
|
## $Str .= &Classify($discriminantFactor, $students); |
|
|
my $p_count = 0; |
my $p_count = 0; |
my $nIndex = 0; |
|
my $dummy; |
my $dummy; |
my $p_val; |
my $p_val; |
my $ResId; |
my $ResId; |
my %GraphDat; |
my %GraphDat; |
my $NoElements = scalar @$list; |
my $cIdx=0; |
|
|
|
|
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
|
|
&CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, |
&CreateProblemStatisticsTableHeading(1,$cache->{$sequence.':source'}, |
$cache->{$sequence.':source'}, |
$cache->{$sequence.':title'}, |
$cache->{$sequence.':title'}, |
|
$headings,$r); |
$headings,$r); |
|
|
foreach my $problemID (split(':', $cache->{$sequence.':problems'})) { |
my ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/, |
my $problem = $cache->{$problemID.':problem'}; |
$List[$cIdx]); |
$r->print("<br>$problem"); |
|
|
|
} |
|
} |
|
} |
|
=pod |
|
##777777 |
|
## $Str .= &Classify($discriminantFactor, $students); |
|
|
|
|
|
my ($Hid,$pr)=split(/\:/,$mapsort{$_}); |
my ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar); |
my @lpr=split(/\&/,$pr); |
$sequence+=100; |
for (my $i=1; $i<=$#lpr; $i++) { |
while ($SqOrd==$sequence && $cIdx<$NoElements) { |
my %storestats=(); |
my %storestats=(); |
my ($PrOrd,$Prob,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,$list->[$nIndex]); |
my $pOrd=$PrOrd; |
my $Temp = $Prob; |
my $Temp = $Prob; |
my $MxTries = 0; |
my $MxTries = 0; |
my $TotalTries = 0; |
my $TotalTries = 0; |
Line 683 sub BuildStatisticsTable {
|
Line 413 sub BuildStatisticsTable {
|
my $StdNo = 0; |
my $StdNo = 0; |
my $DiscNo=0; |
my $DiscNo=0; |
my @StdLst; |
my @StdLst; |
while ( $PrOrd == $lpr[$i] ) |
while ($pOrd==$PrOrd && $cIdx<$NoElements) |
{ |
{ |
$nIndex++; |
$cIdx++; |
$StdNo++; |
$StdNo++; |
$StdLst[ $StdNo ] = $Tries; |
$StdLst[ $StdNo ] = $Tries; |
$TotalTries += $Tries; |
$TotalTries += $Tries; |
Line 693 sub BuildStatisticsTable {
|
Line 423 sub BuildStatisticsTable {
|
if ( $Code eq 'C' ){ $YES++; } |
if ( $Code eq 'C' ){ $YES++; } |
elsif( $Code eq 'I' ) { $Incorrect++; } |
elsif( $Code eq 'I' ) { $Incorrect++; } |
elsif( $Code eq 'O' ) { $Override++; } |
elsif( $Code eq 'O' ) { $Override++; } |
elsif( $Code eq 'U' ) { $StdNo--; } |
elsif( $Code eq '-' ) { $StdNo--; } |
($PrOrd,$Prob,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,$list->[$nIndex]); |
($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/, |
} |
$List[$cIdx]); |
|
($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar); |
|
|
|
#$r->print("<br>$cIdx ... $SqOrd, $PrOrd, $Tries, $Wrongs, $Code, $Disc"); |
|
#$r->rflush(); |
|
|
|
} |
|
|
|
#$r->print("<br>$cIdx ... $SqOrd , $Temp , $TotalTries"); |
|
#$r->rflush(); |
|
|
$p_count++; |
$p_count++; |
my $Dummy; |
my $Dummy; |
($ResId,$Dummy)=split(/\*/,$Temp); |
($ResId,$Dummy)=split(/\*/,$Temp); |
|
|
$Temp = '<a href="'.$cache->{'src_'.$ResId}. |
###################### |
'" target="_blank">'.$cache->{'title_'.$ResId}.$Dummy.'</a>'; |
$Temp = '<a href="'.$cache->{$ResId.':source'}. |
|
'" target="_blank">'.$cache->{$ResId.':title'}.$Dummy.'</a>'; |
|
|
my $res = &Apache::lonnet::declutter($cache->{'src_'.$ResId}); |
my $res = &Apache::lonnet::declutter($cache->{'src_'.$ResId}); |
my $urlres=$res; |
my $urlres=$res; |
Line 710 sub BuildStatisticsTable {
|
Line 450 sub BuildStatisticsTable {
|
$ResId=~/(\d+)\.(\d+)/; |
$ResId=~/(\d+)\.(\d+)/; |
my $Map = &Apache::lonnet::declutter( $cache->{'map_id_'.$1} ); |
my $Map = &Apache::lonnet::declutter( $cache->{'map_id_'.$1} ); |
$urlres=$Map; |
$urlres=$Map; |
|
####################### |
$res = '<a href="'.$cache->{'src_'.$ResId}.'">'.$res.'</a>'; |
|
|
# $res = '<a href="'.$cache->{'src_'.$ResId}.'">'.$res.'</a>'; |
#$Map = '<a href="'.$Map.'">'.$res.'</a>'; |
#$Map = '<a href="'.$Map.'">'.$res.'</a>'; |
|
|
#------------------------ Compute the Average of Tries about one problem |
#------------------------ Compute the Average of Tries about one problem |
my $Average = ($StdNo) ? $TotalTries/$StdNo : 0; |
my $Average = ($StdNo) ? $TotalTries/$StdNo : 0; |
|
|
$storestats{$ENV{'request.course.id'}.'___'.$urlres.'___timestamp'}=time; |
$storestats{$ENV{'request.course.id'}.'___'.$urlres.'___timestamp'}=time; |
$storestats{$ENV{'request.course.id'}.'___'.$urlres.'___stdno'}=$StdNo; |
$storestats{$ENV{'request.course.id'}.'___'.$urlres.'___stdno'}=$StdNo; |
$storestats{$ENV{'request.course.id'}.'___'.$urlres.'___avetries'}=$Average; |
$storestats{$ENV{'request.course.id'}.'___'.$urlres.'___avetries'}=$Average; |
|
|
Line 770 sub BuildStatisticsTable {
|
Line 511 sub BuildStatisticsTable {
|
my $SD = sprintf( "%.1f", $StdDev ); |
my $SD = sprintf( "%.1f", $StdDev ); |
my $DoD = sprintf( "%.2f", $DoDiff ); |
my $DoD = sprintf( "%.2f", $DoDiff ); |
my $Sk = sprintf( "%.1f", $Skewness ); |
my $Sk = sprintf( "%.1f", $Skewness ); |
my $join = $lpr[$i].'&'.$Temp.'&'.$StdNo.'&'. |
my $join = $Prob.'&'.$Temp.'&'.$StdNo.'&'. |
$TotalTries.'&'.$MxTries.'&'.$Avg.'&'. |
$TotalTries.'&'.$MxTries.'&'.$Avg.'&'. |
$YES.'&'.$Override.'&'.$Wrng.'&'.$DoD.'&'. |
$YES.'&'.$Override.'&'.$Wrng.'&'.$DoD.'&'. |
$SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'. |
$SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'. |
Line 787 sub BuildStatisticsTable {
|
Line 528 sub BuildStatisticsTable {
|
&Apache::lonnet::put('resevaldata',\%storestats,$1,$2); |
&Apache::lonnet::put('resevaldata',\%storestats,$1,$2); |
} |
} |
#-------------------------------- Row of statistical table |
#-------------------------------- Row of statistical table |
&TableRow($cache,$join,$i,($p_count-1),$r,\%color,\%GraphDat); |
&TableRow($cache,$join,$cIdx,($p_count-1),$r,$color,\%GraphDat); |
} |
} |
&CloseTable($cache,$r); |
&CloseTable($cache,$r); |
} |
} |
&Close_PrgWin(); |
### &Close_PrgWin(); |
#666666 |
#666666 |
# close( OUT ); |
# close( OUT ); |
#666666 |
#666666 |
} |
} |
=cut |
|
|
|
=pod |
=pod |
sub Cache_Statistics { |
sub Cache_Statistics { |
Line 833 sub Cache_Statistics {
|
Line 573 sub Cache_Statistics {
|
for (my $i=1; $i<=$#lpr; $i++) { |
for (my $i=1; $i<=$#lpr; $i++) { |
my($Pre, $Post) = split(/\@/,$list[$nIndex]); |
my($Pre, $Post) = split(/\@/,$list[$nIndex]); |
#$r->print('<br>'.$Pre.'---'.$Post); |
#$r->print('<br>'.$Pre.'---'.$Post); |
&TableRow($cache,$Post,$i,$nIndex,\%color,\%GraphDat); |
&TableRow($cache,$Post,$i,$nIndex,$color,\%GraphDat); |
$nIndex++; |
$nIndex++; |
} |
} |
&CloseTable($cache); |
&CloseTable($cache); |
Line 843 sub Cache_Statistics {
|
Line 583 sub Cache_Statistics {
|
&CreateProblemStatisticsTableHeading($cache,0); |
&CreateProblemStatisticsTableHeading($cache,0); |
for ( my $nIndex = 0; $nIndex < $p_count; $nIndex++ ) { |
for ( my $nIndex = 0; $nIndex < $p_count; $nIndex++ ) { |
my($Pre, $Post) = split(/\@/,$list[$nIndex]); |
my($Pre, $Post) = split(/\@/,$list[$nIndex]); |
&TableRow($cache,$Post,$nIndex,$nIndex,\%color,\%GraphDat); |
&TableRow($cache,$Post,$nIndex,$nIndex,$color,\%GraphDat); |
} |
} |
&CloseTable($cache); |
&CloseTable($cache); |
} |
} |
Line 854 sub TableRow {
|
Line 594 sub TableRow {
|
my ($cache,$Str,$Idx,$RealIdx,$r,$color,$GraphDat)=@_; |
my ($cache,$Str,$Idx,$RealIdx,$r,$color,$GraphDat)=@_; |
my($PrOrd,$Temp,$StdNo,$TotalTries,$MxTries,$Avg,$YES,$Override, |
my($PrOrd,$Temp,$StdNo,$TotalTries,$MxTries,$Avg,$YES,$Override, |
$Wrng,$DoD,$SD,$Sk,$_D1,$_D2,$DiscNo,$Prob)=split(/\&/,$Str); |
$Wrng,$DoD,$SD,$Sk,$_D1,$_D2,$DiscNo,$Prob)=split(/\&/,$Str); |
|
# $r->print('<br>'.$Str); |
if ($ENV{'form.showcsv'}) { |
if ($ENV{'form.showcsv'}) { |
my ($ResId,$Dummy)=split(/\*/,$Prob); |
my ($ResId,$Dummy)=split(/\*/,$Prob); |
my $Ptr = "\n".'<br>'. |
my $Ptr = "\n".'<br>'. |
Line 896 sub TableRow {
|
Line 637 sub TableRow {
|
"\n".'<td bgcolor='.$color->{"yellow"}.'> '.$DiscNo.'</td>'; |
"\n".'<td bgcolor='.$color->{"yellow"}.'> '.$DiscNo.'</td>'; |
$r->print("\n".$Ptr.'</tr>' ); |
$r->print("\n".$Ptr.'</tr>' ); |
} |
} |
$GraphDat->{$RealIdx}=$DoD.':'.$Wrng; |
# $GraphDat->{$RealIdx}=$DoD.':'.$Wrng; |
|
} |
|
|
|
|
|
# For loading the colored table for display or un-colored for print |
|
sub setbgcolor { |
|
my $PrintTable=shift; |
|
my %color; |
|
if ($PrintTable){ |
|
$color{"gb"}="#FFFFFF"; |
|
$color{"red"}="#FFFFFF"; |
|
$color{"yellow"}="#FFFFFF"; |
|
$color{"green"}="#FFFFFF"; |
|
$color{"purple"}="#FFFFFF"; |
|
} else { |
|
$color{"gb"}="#DDFFFF"; |
|
$color{"red"}="#FFDDDD"; |
|
$color{"yellow"}="#EEFFCC"; |
|
$color{"green"}="#DDFFDD"; |
|
$color{"purple"}="#FFDDFF"; |
|
} |
|
|
|
return \%color; |
} |
} |
|
|
|
|
sub StatusOptions { |
sub StatusOptions { |
my ($cache)=@_; |
my ($cache)=@_; |
|
|
Line 1024 sub ProblemStatisticsLegend {
|
Line 788 sub ProblemStatisticsLegend {
|
return $Ptr; |
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} <br>"); |
|
$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 ---------------------------------------- |
#---- END Problem Statistics Web Page ---------------------------------------- |
|
|
#---- Problem Statistics Graph Web Page -------------------------------------- |
#---- Problem Statistics Graph Web Page -------------------------------------- |
|
|
# ------------------------------------------- Prepare data for Graphical chart |
# ------------------------------------------- Prepare data for Graphical chart |
|
|
|
sub BuildDiffGraph { |
|
my ($r)=@_; |
|
|
|
my $graphData = &GetGraphData('DiffGraph', $r); |
|
return '<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />'; |
|
} |
|
|
|
sub BuildWrongGraph { |
|
my ($r)=@_; |
|
|
|
my $graphData = &GetGraphData('WrongGraph', $r); |
|
return '<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />'; |
|
} |
|
|
|
|
sub GetGraphData { |
sub GetGraphData { |
my ($ylab,$r,%GraphDat)=@_; |
my ($ylab,$r,%GraphDat)=@_; |
my $Col; |
my $Col; |
Line 1073 sub GetGraphData {
|
Line 923 sub GetGraphData {
|
} |
} |
} |
} |
} |
} |
|
|
|
|
1; |
1; |
__END__ |
__END__ |