--- loncom/interface/lonstatistics.pm 2002/03/06 23:56:13 1.8 +++ loncom/interface/lonstatistics.pm 2002/03/22 23:06:30 1.13 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: lonstatistics.pm,v 1.8 2002/03/06 23:56:13 minaeibi Exp $ +# $Id: lonstatistics.pm,v 1.13 2002/03/22 23:06:30 minaeibi Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,7 +30,7 @@ # 5/05,7/09,7/25/01,8/11,9/13,9/26,10/5,10/9,10/22,10/26 Behrouz Minaei # 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 Behrouz Minaei +# 1/22, 2/1, 2/6, 2/25, 3/2, 3/6, 3/17, 3/21, 3/22 Behrouz Minaei ### package Apache::lonstatistics; @@ -39,6 +39,7 @@ use strict; use Apache::Constants qw(:common :http); use Apache::lonnet(); use Apache::lonhomework; +use Apache::loncommon; use HTML::TokeParser; use GDBM_File; @@ -46,6 +47,7 @@ use GDBM_File; my %hash; my %CachData; my %GraphDat; +my %OpResp; my %maps; my %mapsort; my %section; @@ -78,7 +80,8 @@ my $HWN; my $P_Order; 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"); + 9,"S.D.",10,"Skew.",11,"D.F.1st",12,"D.F.2nd");#,13,"OpResp"); + #------- Processing upperlist and lowerlist according to each problem sub ProcessDisc { @@ -218,7 +221,7 @@ sub StudentReport { my $PartNo = 0; undef %TempHash; foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))){ - if ($_=~/^stores\_(\d+)\_tries$/) { + if ($_=~/^stores\_(\w+)\_tries$/) { my $Part=&Apache::lonnet::metadata($meta,$_.'.part'); if ( $TempHash{"$Part"} eq '' ) { $TempHash{"$Part"} = $Part; @@ -228,6 +231,7 @@ sub StudentReport { $PartNo++; } } + #if ($_=~/^parameter\_(\w+)\_package$/) { } my $Prob = $Map.'___'.$2.'___'. @@ -313,8 +317,6 @@ sub PreStatTable { "_$ENV{'user.domain'}_$cid\_statistics.db"; my $GraphDB = "/home/httpd/perl/tmp/$ENV{'user.name'}". "_$ENV{'user.domain'}_$cid\_graph.db"; - my $CachDisFac = "/home/httpd/perl/tmp/$ENV{'user.name'}". - "_$ENV{'user.domain'}_$cid\_DiscFactor.db"; my $OpSel11=''; my $OpSel12=''; my $OpSel13=''; @@ -371,7 +373,6 @@ sub PreStatTable { if ((-e "$CacheDB")&&($ENV{'form.sort'} ne 'Recalculate Statistics')) { if (tie(%CachData,'GDBM_File',"$CacheDB",&GDBM_READER,0640)) { - tie(%DiscFac,'GDBM_File',$CachDisFac,&GDBM_READER,0640); tie(%GraphDat,'GDBM_File',$GraphDB,&GDBM_WRCREAT,0640); &Cache_Statistics(); } @@ -381,7 +382,6 @@ sub PreStatTable { } else { if (tie(%CachData,'GDBM_File',$CacheDB,&GDBM_WRCREAT,0640)) { - tie(%DiscFac,'GDBM_File',$CachDisFac,&GDBM_WRCREAT,0640); tie(%GraphDat,'GDBM_File',$GraphDB,&GDBM_WRCREAT,0640); foreach (keys %DiscFac) {delete $CachData{$_};} foreach (keys %CachData) {delete $CachData{$_};} @@ -392,11 +392,27 @@ sub PreStatTable { $r->print("Unable to tie hash to db file"); } } + +#33333 +# my $c=0; +# foreach (sort keys %OpResp) { +# $r->print('
'.$c.$_.' ====== '.$OpResp{$_}); +# my $count=$#students+1; +# for (my $n=0;$n<1;$n++){ +# my ($sname,$sdom)=$students[$n]; +# my $Prob=$OpResp{$_}; +##my $userview=&Apache::lonnet::ssi($hash{'src_'.$ResId}); +# $r->print('
'.$Prob.$sname.$sdom.$cid. +# '
'.&Apache::loncommon::get_previous_attempt($Prob,$sname,$sdom,$cid)); +# #$r->print('
'.$Prob.$sname. ' *** '.&Apache::lonnet::ssi($hash{'src_'.$Prob})); +# } +# $c++; +# } + #$r->print('Total instances of the problems : '.($p_count*($#students+1))); untie(%CachData); untie(%GraphDat); - untie(%DiscFac); } @@ -483,8 +499,9 @@ sub ExtractStudentData { my $PartNo = 0; $Dis .= ':'; undef %TempHash; - foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) { - if ($_=~/^stores\_(\d+)\_tries$/) { + + foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) { + if ($_=~/^stores\_(\w+)\_tries$/) { my $Part=&Apache::lonnet::metadata($meta,$_.'.part'); if ( $TempHash{"$Part"} eq '' ) { $TempHash{"$Part"} = $Part; @@ -493,11 +510,13 @@ sub ExtractStudentData { $TempHash{"$Part.PrOrd"} = $PrOrd+$PartNo; $PartNo++; } + my $Part=&Apache::lonnet::metadata($meta,$_.'.part'); } } my $Prob = $Map.'___'.$PrbId.'___'. &Apache::lonnet::declutter( $hash{'src_'.$ResId} ); + $OpResp{$PrOrd}=$Prob; $Code='U'; $Tries = 0; $ParCr = 0; @@ -505,6 +524,11 @@ sub ExtractStudentData { $LatestVersion = $result{"version:$Prob"}; if ( $LatestVersion ) { +#333333333 +#my $userview=&Apache::lonnet::ssi($hash{'src_'.$ResId}); +#$r->print('
'.$userview); +#$r->print('
'.$Prob.$sname.$sdom.$coid.'
'.&get_student_answers($Prob,$sname,$sdom,$coid)); + for ( my $Version=1; $Version<=$LatestVersion; $Version++ ) { my $vkeys = $result{"$Version:keys:$Prob"}; my @keys = split(/\:/,$vkeys); @@ -520,7 +544,6 @@ sub ExtractStudentData { $TempHash{"$Part.ParCr"} = ($ParCr) ? $ParCr : 0; $TotalTries += $TempHash{"$Part.Tries"}; $TotParCr += $TempHash{"$Part.ParCr"}; -#$r->print($Version.'---'.$Prob.'==='.$Time.'
'); my $Val = $result{"$Version:$Prob:resource.$Part.solved"}; if ( $Val eq 'correct_by_student' ) { $Wrongs = $Tries - 1; $Code = 'C'; } @@ -542,11 +565,11 @@ sub ExtractStudentData { {$ProbSolved++;$Yes=1;} # my $ptr = "$hash{'title_'.$ResId}"; - my $ptr = $TempHash{$part.'.PrOrd'}.':'.$ResId; + my $ptr = $TempHash{$part.'.PrOrd'}.'&'.$ResId; if ( $PartNo > 1 ) { $ptr .= "*(part $part)"; - $Dis .= ':'; + $Dis .= '&'; } my $Fac = ($TempHash{"$part.Tries"}) ? ($TempHash{"$part.ParCr"}/$TempHash{"$part.Tries"}) : 0; @@ -558,11 +581,9 @@ sub ExtractStudentData { # $DisF .= '+'.$TempHash{"$part.Time"}; $TimeTot += $TempHash{"$part.Time"}; $Dis .= $TempHash{$part.'.PrOrd'}.'='.$DisF.'+'.$Yes; - - #$r->print('
'.$DisFactor,'###',$DiscFac{$DisFactor}); - $ptr .= ":$TempHash{$part.'.Tries'}". - ":$TempHash{$part.'.Wrongs'}". - ":$TempHash{$part.'.Code'}"; + $ptr .= "&$TempHash{$part.'.Tries'}". + "&$TempHash{$part.'.Wrongs'}". + "&$TempHash{$part.'.Code'}"; push (@list, $ptr); $TotalOpend++; $ProbTot++; @@ -570,7 +591,7 @@ sub ExtractStudentData { } #else { #for(my $n=0; $n<$PartNo; $n++) { - # push (@list, "$hash{'title_'.$ResId}*$ResId:0:0:U"); + # push (@list, "$TempHash{'0'.'.PrOrd'}.':'.$ResId:0:0:U"); # $ProbTot++; #} #} @@ -579,7 +600,6 @@ sub ExtractStudentData { my $DisFac = ( $TotalTries ) ? ($TotParCr/$TotalTries) : 0; my $DisFactor = sprintf( "%.4f", $DisFac ); $DiscFac{$DisFactor}=$Dis; - #$r->print('
'.$DisFactor,'###',$DiscFac{$DisFactor}); #my $time; #if ($ProbSolved){ #$time = int(($TimeTot/$ProbSolved)-10000000); @@ -595,6 +615,7 @@ sub ExtractStudentData { # ------------------------------------------------------------ Build page table sub tracetable { my ($rid,$beenhere)=@_; + my $IsMap=0; $rid=~/(\d+)\.(\d+)/; $maps{&Apache::lonnet::declutter($hash{'map_id_'.$1})}='';#$hash{'title_'.$rid}; #$maps{$HWN}=$hash{'title_'.$rid}; @@ -606,7 +627,9 @@ sub tracetable { $cols[$#cols+1]=0; $P_Order++; $HWN=$P_Order; - $mapsort{$HWN} = $rid.':'; + $mapsort{$HWN} = $rid.':'; + $IsMap=1; + #$maps{&Apache::lonnet::declutter($hash{'src_'.$rid})}= # $hash{'title_'.$rid}; } @@ -621,36 +644,53 @@ sub tracetable { my $meta=$hash{'src_'.$frid}; my $PartNo = 0; + # if ($IsMap==0){ if ($meta) { if ($meta=~/\.(problem|exam|quiz|assess|survey|form)$/) { foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) { - if ($_=~/^stores\_(\d+)\_tries$/) { + if ($_=~/^stores\_(\w+)\_tries$/) { &Apache::lonnet::metadata($meta,$_.'.part'); $P_Order++; $mapsort{$HWN} .= '&'.$P_Order; $PartNo++; - $r->print('
'.$PartNo.'---'.$P_Order); + #$r->print('
'.$PartNo.'---'.$P_Order); } } +# foreach (split(/\,/,&Apache::lonnet::metadata($meta,'packages'))) { +# if ($_=~/^optionresponse\_(\w+)\_(\w+)$/) { +# $r->print('
'.$_.&Apache::lonnet::metadata($meta,$_)); +# $r->print('
'.$_.'...'.$P_Order); +# $OpResp{$P_Order+1}=$frid; +# } +# } } } } + # } } else { $cols[$#cols+1]=($P_Order+1).':'.$rid; my $meta=$hash{'src_'.$rid}; my $PartNo = 0; - if ($meta) { + if ($meta) { if ($meta=~/\.(problem|exam|quiz|assess|survey|form)$/) { - foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) { - if ($_=~/^stores\_(\d+)\_tries$/) { - &Apache::lonnet::metadata($meta,$_.'.part'); + foreach my $Key(split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) { + if ($Key=~/^stores\_(\w+)\_tries$/) { + my $Part=&Apache::lonnet::metadata($meta,$Key.'.part'); $P_Order++; $mapsort{$HWN} .= '&'.$P_Order; $PartNo++; + foreach (split(/\,/,&Apache::lonnet::metadata($meta,'packages'))) { + if ($_=~/^optionresponse\_($Part)\_(\w+)$/) { + #$r->print('
'.$_.'...'.$P_Order.'---'.$Part); + $OpResp{$P_Order+1}=$rid; + } + + } + } } } - } + } } if (defined($hash{'to_'.$rid})) { foreach (split(/\,/,$hash{'to_'.$rid})){ @@ -723,7 +763,7 @@ ENDPOP &CreateTable(1,$Hid); for (my $i=1; $i<=$#lpr; $i++) { my %storestats=(); - my ($PrOrd,$Prob,$Tries,$Wrongs,$Code)=split(/\:/,$list[$nIdx]); + my ($PrOrd,$Prob,$Tries,$Wrongs,$Code)=split(/\&/,$list[$nIdx]); my $Temp = $Prob; my $MxTries = 0; my $TotalTries = 0; @@ -743,7 +783,7 @@ ENDPOP elsif( $Code eq 'I' ) { $Incorrect++; } elsif( $Code eq 'O' ) { $Override++; } elsif( $Code eq 'U' ) { $StdNo--; } - ($PrOrd,$Prob,$Tries,$Wrongs,$Code)=split(/\:/,$list[$nIdx]); + ($PrOrd,$Prob,$Tries,$Wrongs,$Code)=split(/\&/,$list[$nIdx]); } $p_count++; @@ -819,10 +859,10 @@ ENDPOP my $SD = sprintf( "%.1f", $StdDev ); my $DoD = sprintf( "%.2f", $DoDiff ); my $Sk = sprintf( "%.1f", $Skewness ); - my $join = $PrOrd.':'.$Temp.':'.$StdNo.':'. - $TotalTries.':'.$MxTries.':'.$Avg.':'. - $YES.':'.$Override.':'.$Wrng.':'.$DoD.':'. - $SD.':'.$Sk.':'.$_D1.':'.$_D2.':'.$Prob; + my $join = $PrOrd.'&'.$Temp.'&'.$StdNo.'&'. + $TotalTries.'&'.$MxTries.'&'.$Avg.'&'. + $YES.'&'.$Override.'&'.$Wrng.'&'.$DoD.'&'. + $SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'.$Prob; $CachData{($p_count-1)}=$join; $urlres=~/^(\w+)\/(\w+)/; @@ -850,14 +890,14 @@ sub Cache_Statistics { if ($Pos > 0) {$Pos++;} $p_count = 0; foreach my $key( keys %CachData) { - my @Temp=split(/\:/,$CachData{$key}); + my @Temp=split(/\&/,$CachData{$key}); if ( $Pos == 0 ) { ($UnUseful,$Useful)=split(/\>/,$Temp[$Pos]); } else { $Useful = $Temp[$Pos]; } - $list[$p_count]=$Useful.'&'.$CachData{$key}; + $list[$p_count]=$Useful.'@'.$CachData{$key}; $p_count++; } @@ -871,7 +911,8 @@ sub Cache_Statistics { &CreateTable(1,$Hid); my @lpr=split(/\&/,$pr); for (my $i=1; $i<=$#lpr; $i++) { - my($Pre, $Post) = split(/\&/,$list[$nIdx]); + my($Pre, $Post) = split(/\@/,$list[$nIdx]); + #$r->print('
'.$Pre.'---'.$Post); &TableRow($Post,$i,$nIdx); $nIdx++; } @@ -881,7 +922,7 @@ sub Cache_Statistics { else { &CreateTable(0); for ( my $nIdx = 0; $nIdx < $p_count; $nIdx++ ) { - my($Pre, $Post) = split(/\&/,$list[$nIdx]); + my($Pre, $Post) = split(/\@/,$list[$nIdx]); &TableRow($Post,$nIdx,$nIdx); } &CloseTable(); @@ -890,10 +931,11 @@ sub Cache_Statistics { sub TableRow { my ($Str,$Idx,$RealIdx)=@_; - my($PrOrd,$Temp,$StdNo,$TotalTries,$MxTries,$Avg,$YES, - $Override,$Wrng,$DoD,$SD,$Sk,$_D1,$_D2,$Prob)=split(/\:/,$Str); - $r->print( "\n".''. + my($PrOrd,$Temp,$StdNo,$TotalTries,$MxTries,$Avg,$YES,$Override, + $Wrng,$DoD,$SD,$Sk,$_D1,$_D2,$Prob)=split(/\&/,$Str); + my $Ptr = "\n".''. "\n".''.($RealIdx+1).''. + # "\n".''.$PrOrd.$Temp.''. "\n".''.$Temp.''. "\n".' '.$StdNo.''. "\n".''.$TotalTries.''. @@ -906,8 +948,14 @@ sub TableRow { "\n".' '.$SD.''. "\n".' '.$Sk.''. "\n".' '.$_D1.''. - "\n".' '.$_D2.''. - "\n".'' ); + "\n".' '.$_D2.''; +# if( $OpResp{$PrOrd} ) { +# $Ptr.=''.''.''; +# } +# else { +# $Ptr.=' -------- '; +# } + $r->print("\n".$Ptr.'' ); $GraphDat{$RealIdx}=$DoD.':'.$Wrng; } @@ -964,6 +1012,7 @@ sub initial { undef %CachData; undef %GraphDat; undef %DiscFac; + undef %OpResp; undef $CurMap; undef $CurSec; undef $CurStu; @@ -1010,7 +1059,6 @@ sub ClassList { $name=&Apache::lonnet::unescape($name); $students[$thisindex]=$name; my ($sname,$sdom)=split(/\:/,$name); - #my %reply=&Apache::lonnet::idrget($sdom,$sname); #my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname. # ':environment:lastname&generation&firstname&middlename', @@ -1019,7 +1067,6 @@ sub ClassList { if ($ssec==-1) {next;} $ssec=($ssec) ? $ssec : '(none)'; #$ssec=(int($ssec)) ? int($ssec) : $ssec; - #$r->print($sname.'...'.$ssec.'
'); $section{$ssec}=$ssec; if ($CurSec eq 'All Sections' || $ssec eq $CurSec) { $students[$StudNo]=$name; @@ -1036,18 +1083,11 @@ sub ClassList { $r->rflush(); # --------------- Find all assessments and put them into some linear-like order &tracetable($firstres,'&'.$lastres.'&'); - # my $c=0; # foreach (sort keys %mapsort) { # $r->print('
'.$c.')'.$_.' ... '.$mapsort{$_}); # $c++; # } -#foreach(@cols) { -# $c++; -# $r->print('
'.$cols[$c]); -#} -#$r->print('
Count = '.$c); - } # ------------------------------------------------------------- End render page @@ -1092,11 +1132,7 @@ sub Menu { else { &initial(); &ClassList(); - if ( $content eq 'Discrimination' || #'Problem Evaluation' || - $content eq 'Recalculate Discrimintion Factor' ) { - &CreateDiscFac(); - } - elsif ( $content eq 'Student Assessment' || + if ( $content eq 'Student Assessment' || $content eq 'Create Student Report' ) { &StudentOptions(); &StudentReport($CurStu,$StuBox{"$CurStu"});