--- loncom/interface/lonstatistics.pm 2002/03/17 01:30:00 1.11
+++ loncom/interface/lonstatistics.pm 2002/05/13 15:01:54 1.16
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# (Publication Handler
#
-# $Id: lonstatistics.pm,v 1.11 2002/03/17 01:30:00 minaeibi Exp $
+# $Id: lonstatistics.pm,v 1.16 2002/05/13 15:01:54 minaeibi Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -27,18 +27,20 @@
#
# (Navigate problems for statistical reports
# YEAR=2001
-# 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
+# 5/5,7/9,7/25/1,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, 3/17 Behrouz Minaei
+# 1/22,2/1,2/6,2/25,3/2,3/6,3/17,3/21,3/22,3/26,4/7,5/6,5/12 Behrouz Minaei
+#
###
package Apache::lonstatistics;
-use strict;
+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 +48,7 @@ use GDBM_File;
my %hash;
my %CachData;
my %GraphDat;
+my %OpResp;
my %maps;
my %mapsort;
my %section;
@@ -65,8 +68,6 @@ my $Pos;
my $r;
my $OpSel1;
my $OpSel2;
-my $OpSelDis1;
-my $OpSelDis2;
my $OpSel3;
my $OpSel4;
my $GData;
@@ -76,38 +77,335 @@ my $lastres;
my $DiscFlag;
my $HWN;
my $P_Order;
+my %foil_to_concept;
+my @Concepts;
+my %ConceptData;
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");
+my %Answer = ();
+my @shown;
+sub InitAnalysis {
+ my ($rid, $student)=@_;
+ my ($uname,$udom)=split(/\:/,$student);
+ $rid=~/(\d+)\.(\d+)/;
+ my $symb=&Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'.
+ &Apache::lonnet::declutter($hash{'src_'.$rid});
+ my $URI = $hash{'src_'.$rid};
+ my $Answ=&Apache::lonnet::ssi($URI,('grade_target' => 'analyze',
+ 'grade_username' => $uname,
+ 'grade_domain' => $udom,
+ 'grade_courseid' => $cid,
+ 'grade_symb' => $symb));
+# my $Answ=&Apache::lonnet::ssi($URI,('grade_target' => 'analyze'));
+
+ (my $garbage,$Answ)=split(/_HASH_REF__/,$Answ,2);
+ %Answer=();
+ %Answer=&Apache::lonnet::str2hash($Answ);
+
+ my $parts='';
+ foreach my $elm (@{$Answer{"parts"}}) {
+ $parts.="$elm,";
+ }
+ chop($parts);
+ my $conc='';
+ foreach my $elm (@{$Answer{"$parts.concepts"}}) {
+ $conc.="$elm@";
+ }
+ chop($conc);
+
+ @Concepts=split(/\@/,$conc);
+ my $show='';
+ foreach my $elm (@{$Answer{"$parts.shown"}}) {
+ $show.="$elm@";
+ }
+ chop($show);
+ @shown=split(/\@/,$show);
+# $r->print(" shown:".$show);
+# $r->rflush();
+
+ foreach my $concept (@{$Answer{"$parts.concepts"}}) {
+ foreach my $foil (@{$Answer{"$parts.concept.$concept"}}) {
+ $foil_to_concept{$foil} = $concept;
+ }
+ }
+ return $symb;
+}
-sub get_student_answers {
- my ($symb,$username,$domain,$courseid) = @_;
- my ($map,$id,$feedurl) = split(/___/,$symb);
- my (%old,%moreenv);
- my @elements=('symb','courseid','domain','username');
- foreach my $element (@elements) {
- $old{$element}=$ENV{'form.grade_'.$element};
- $moreenv{'form.grade_'.$element}=eval '$'.$element #'
- }
- $moreenv{'form.grade_target'}='answer';
- &Apache::lonnet::appenv(%moreenv);
- my $userview=&Apache::lonnet::ssi('/res/'.$feedurl);
- &Apache::lonnet::delenv('form.grade_');
- foreach my $element (@elements) {
- $ENV{'form.grade_'.$element}=$old{$element};
- }
- $userview=~s/\
]*\>//gi;
- $userview=~s/\<\/body\>//gi;
- $userview=~s/\//gi;
- $userview=~s/\<\/html\>//gi;
- $userview=~s/\//gi;
- $userview=~s/\<\/head\>//gi;
- $userview=~s/action\s*\=/would_be_action\=/gi;
- return $userview;
+
+sub Interval {
+ my ($rid,$part,$symb)=@_;
+ my $Int=$ConceptData{"Interval"};
+ my $due = &Apache::lonnet::EXT('resource.$part.duedate',$symb)+1;
+ my $opn = &Apache::lonnet::EXT('resource.$part.opendate',$symb);
+ my $add=int(($due-$opn)/$Int);
+#$r->print(" $opn, to $due add=$add int=$Int");
+#$r->rflush();
+ $ConceptData{"Int.0"}=$opn;
+ for (my $i=1;$i<$Int;$i++) {
+ $ConceptData{"Int.$i"}=$opn+$i*$add;
+ }
+ $ConceptData{"Int.$Int"}=$due;
+ for (my $i=0;$i<$Int;$i++) {
+ for (my $n=0; $n<=$#Concepts; $n++ ) {
+ my $tmp=$Concepts[$n];
+ $ConceptData{"$tmp.$i.true"}=0;
+ $ConceptData{"$tmp.$i.false"}=0;
+ }
+ }
}
+sub ShowOpGraph {
+
+ my ($InpStr, $Int_No)=@_;
+
+ $r->print(<
+
+ function display(name) {
+ document.forms.displayform.elements.dis.value=name;
+ window.status=name;
+ }
+ function cleardisplay() {
+ document.forms.displayform.elements.dis.value='';
+ window.status='No Concept in particular';
+ }
+
+
+ENDPOP
+
+ my ($rid,$part)=split(/\:/,substr($InpStr,8));
+ $ConceptData{"Interval"}=$Int_No;
+ my $symb=&InitAnalysis($rid,$students[0]);
+ &Interval($rid,$part,$symb);
+ my $URI = $hash{'src_'.$rid};
+ my $Src = $hash{'title_'.$rid};
+ $Src =~ s/\ /"_"/eg;
+ $r->print(' '.$URI.'');
+ for (my $n=1; $n<=$#Concepts+1; $n++ ) {
+ my $tmp=$Concepts[$n-1];
+ $tmp =~ s/" less than "/eg;
+ $r->print(" Concept $n:$tmp");
+ }
+ $r->rflush();
+
+ &Create_PrgWin();
+ &Update_PrgWin("Starting to analyze problem");
+ for (my $index=0;$index<=$#students;$index++) {
+ &Update_PrgWin($index);
+ &OpStatus($rid,$students[$index]);
+ }
+ &Close_PrgWin();
+
+#$Apache::lonxml::debug=1;
+#&Apache::lonhomework::showhash(%ConceptData);
+#$Apache::lonxml::debug=0;
+
+ for (my $k=0; $k<$Int_No; $k++ ) {
+ my $data1='';
+ my $data2='';
+ &DrawGraph(&AdjustData($k).'+'.$Src.'+'.($k+1));
+ }
+ my $Answ=&Apache::lonnet::ssi($URI);
+ $r->print(" Here you can see the Problem: $Answ");
+}
+
+sub AdjustData {
+ my $k=shift;
+ my $Max=0;
+ my @data1;
+ my @data2;
+ for (my $n=0; $n<=$#Concepts; $n++ ) {
+ my $tmp=$Concepts[$n];
+ $data1[$n]=$ConceptData{"$tmp.$k.true"};
+ $data2[$n]=$ConceptData{"$tmp.$k.false"};
+ my $Sum=$data1[$n]+$data2[$n];
+ if ( $Max<$Sum ) {$Max=$Sum;}
+ }
+ for (my $n=0; $n<=$#Concepts; $n++ ) {
+ if ($data1[$n]+$data2[$n]<$Max) {
+ $data2[$n]+=$Max-($data1[$n]+$data2[$n]);
+ }
+ }
+ return join(',',@data1).'+'.
+ join(',',@data2).'+'.
+ $Max.'+'.($#data1+1);
+}
+
+
+sub DrawGraph {
+ my $data=shift;
+ my($data1,$data2,$Max,$P_No,$Src,$k)=split(/\+/,$data);
+
+ my $Str="\n".'
'.
+ "\n".'
'.
+ "\n".'
Correct Answers
'.
+ "\n".'
Wrong Answers
'.
+ "\n".'
From
'.
+ "\n".'
To
'.
+ "\n".'
'.
+ "\n"."
".
+ "\n"."
$data1
".
+ "\n"."
$data2
".
+ "\n"."
".localtime($ConceptData{'Int.'.($k-1)})."
".
+ "\n"."
".localtime($ConceptData{'Int.'.$k}-1)."
".
+ "\n"."
";
+ $r->print($Str);
+
+# $r->print(' Correct Answers: '.$data1.
+# ' Wrong Answers: '.$data2);
+# $r->print(' From: '.localtime($ConceptData{'Int.'.($k-1)}).
+# ' To: '.localtime($ConceptData{"Int.$k"}));
+
+# if ( $Max > 1 ) {
+# $Max += (10 - $Max % 10);
+# $Max = int($Max);
+# }
+# else { $Max = 1; }
+
+ my $Titr=($ConceptData{'Interval'}>1) ? $Src.'_interval_'.$k : $Src;
+ $GData=$Titr.'&'.'Answers'.'&'.$Max.'&'.$P_No.'&'.$data1.'&'.$data2;
+ if($ConceptData{'Interval'}>1){
+ $r->print(' ');
+ return;
+ }
+ $r->print(' Move your mouse over a bar to find out the concept');
+ my $ptr='';
+ $ptr.="\n".'';
+ $ptr.="\n".'
'.
+ "\n".'
';
+ $r->print(' '.$ptr.' ');
+}
+
+
+sub AnalyzeProblem {
+# -------------------------------- Selecting the number of intervals
+ my $OpSel='';
+ my $CurInt = $ENV{'form.interval'};
+ if ($CurInt eq '') {$CurMap = '1';}
+ my $Ptr = 'Select number of intervals'."\n".
+ ''."\n";
+ $r->print( $Ptr );
+
+ $r->print(' Option Response Problems in this course:
');
+ my $Str = "\n".'
'.
+ "\n".'
'.
+ "\n".'
#
'.
+ "\n".'
Problem Title
'.
+ "\n".'
Resouse
'.
+ "\n".'
Address
'.
+ "\n".'
';
+
+ my $P_No=1;
+ foreach (sort keys %OpResp) {
+ my ($rid,$part)=split(/\:/,$OpResp{$_});
+ my $Temp = ''.$hash{'title_'.$rid}.'';
+ $Str .= "\n"."
".
+ "\n"."
$P_No
".
+ "\n"."
".$Temp."
".
+ "\n"."
".$hash{'src_'.$rid}."
".
+ "\n"."
".''.'
'.
+ "\n"."
";
+ $P_No++;
+ }
+ $Str .= "\n".'
';
+ $Str .= "\n".'';
+ $r->print($Str);
+ $r->rflush();
+}
+
+
+sub Decide {
+ my ($type,$foil,$time)=@_;
+ my $k=0;
+ while ($time>$ConceptData{'Int.'.($k+1)} &&
+ $k<$ConceptData{'Interval'}) {$k++;}
+ $ConceptData{"$foil_to_concept{$foil}.$k.$type"}++;
+}
+
+
+sub OpStatus {
+ my ($rid,$student)=@_;
+ my ($uname,$udom)=split(/\:/,$student);
+ my $code='U';
+ $rid=~/(\d+)\.(\d+)/;
+ my $symb=&Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'.
+ &Apache::lonnet::declutter($hash{'src_'.$rid});
+ my %reshash=&Apache::lonnet::restore($symb,$cid,$udom,$uname);
+ my @True = ();
+ my @False = ();
+ my $flag=0;
+ @shown=();
+ if ($reshash{'version'}) {
+ for (my $version=1;$version<=$reshash{'version'};$version++) {
+ my $time=$reshash{"$version:timestamp"};
+ foreach (sort(split(/\:/,$reshash{$version.':keys'}))) {
+ if (($_=~/\.(\w+)\.(\w+)\.submission$/)) {
+ my $Id1 = $1;
+ my $Id2 = $2;
+ my $Resp = $reshash{$_};
+ my %submission=&Apache::lonnet::str2hash($Resp);
+ foreach (keys %submission) {
+ my $Ansr = $Answer{"$Id1.$Id2.foil.value.$_"};
+ #$r->print(" shown: ".join(',',@shown)." size=$#shown");
+ if ($submission{$_}) {
+ #if($#shown==-1){
+ #my @str=split(/\&/,$Resp);
+ #my $garb;
+ #for(my $j=0;$j<=$#str;$j++){
+ # ($shown[$j],$garb)=split(/\=/,$str[$j]);
+ #}
+ ##$r->print(" shown: ".join(',',@shown)." size=$#shown");
+ #}
+ if ($submission{$_} eq $Ansr) {
+ &Decide("true",$_,$time );
+ }
+ else {&Decide("false",$_,$time );}
+ }
+ #else {
+ # if ($#shown==-1 && $flag==0) {
+ # $flag++;
+ # &InitAnalysis($rid,$student);
+ # }
+ # my @erl=split(/\:/,$_);
+ # for (my $i=0;$i<=$#shown; $i++){
+ # my $Ans=$Answer{"$Id1.$Id2.foil.value.$shown[$i]"};
+ # if ($erl[$i] eq $Ans) {
+ # &Decide("true",$shown[$i],$time);
+ # }
+ # else {&Decide("false",$shown[$i],$time);}
+ # }
+ #}
+ }
+ }
+ }
+ }
+ }
+}
+
#------- Processing upperlist and lowerlist according to each problem
sub ProcessDisc {
@@ -138,7 +436,7 @@ sub ProcessDisc {
} while ( $Prb eq $Temp && $nIdx < $Count );
# $Proc{$Temp}=($Sum1/$nStud).':'.$nStud;
$Proc{$Temp}=($Sum1/$nStud).':'.($Sum2/$nStud);
-# $r->print("$nIdx) $Temp --> ($nStud) $Proc{$Temp} ");
+# $r->print("$nIdx) $Temp --> ($nStud) $Proc{$Temp} ");
$Sum1=0;
$Sum2=0;
$nStud=0;
@@ -184,17 +482,13 @@ sub NumericSort {
# ------ Create different Student Report
sub StudentReport {
-
my ($sname,$sdom)=@_;
-
if ( $sname eq 'All Students' ) {
$r->print( '
WARNING:
Please select a student
' );
return;
}
- my $shome=&Apache::lonnet::homeserver($sname,$sdom);
- my $reply=&Apache::lonnet::reply('dump:'.$sdom.':'.$sname.':'.$cid,$shome );
- my %result = ();
+ my %result = &Apache::lonnet::dump($cid,$sdom,$sname);
my $ResId;
my $PrOrd;
my $Code;
@@ -215,11 +509,8 @@ sub StudentReport {
"\n".'
Results
'.
"\n".'
Tries
'.
"\n".'';
- unless ($reply=~/^error\:/) {
- foreach (split(/\&/,$reply)){
- my ($name,$value)=split(/\=/,&Apache::lonnet::unescape($_));
- $result{$name}=$value;
- }
+ my ($temp)=keys(%result);
+ unless ($temp=~/^error\:/) {
foreach my $CurCol (@cols) {
if (!$CurCol){
my $Set=&Apache::lonnet::declutter($hash{'map_id_'.$1});
@@ -247,7 +538,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;
@@ -387,10 +678,10 @@ sub PreStatTable {
'evaluating the problem according to a Criterion '.
' [Applied Criterion in %27 Upper Students - '.
'Applied the same Criterion in %27 Lower Students] '.
- ' 1st Criterion for Sorting the Students: '.
- 'Sum of Partial Credit Awarded / Total Number of Tries '.
- ' 2nd Criterion for Sorting the Students: '.
- 'Total number of Correct Answers / Total Number of Tries'.
+ ' 1st Criterion for Sorting the Students: '.
+ 'Sum of Partial Credit Awarded / Total Number of Tries '.
+ ' 2nd Criterion for Sorting the Students: '.
+ 'Total number of Correct Answers / Total Number of Tries'.
'';
$r->print($Ptr);
@@ -417,8 +708,8 @@ sub PreStatTable {
$r->print("Unable to tie hash to db file");
}
}
- #$r->print('Total instances of the problems : '.($p_count*($#students+1)));
+# $r->print('Total instances of the problems : '.($p_count*($#students+1)));
untie(%CachData);
untie(%GraphDat);
}
@@ -462,13 +753,10 @@ sub usection {
# ------ Dump the Student's DB file and handling the data for statistics table
-
sub ExtractStudentData {
- my ($student,$coid)=@_;
+ my $student=shift;
my ($sname,$sdom) = split( /\:/, $student );
- my $shome=&Apache::lonnet::homeserver( $sname,$sdom );
- my $reply=&Apache::lonnet::reply('dump:'.$sdom.':'.$sname.':'.$coid,$shome );
- my %result = ();
+ my %result = &Apache::lonnet::dump($cid,$sdom,$sname);
my $ResId;
my $PrOrd;
my $Dis = '';
@@ -483,22 +771,20 @@ sub ExtractStudentData {
my $TotParCr = 0;
my $Wrongs;
my %TempHash;
- my $Version;
+ my $Version;
my $LatestVersion;
my $SecLimit;
my $MapLimit;
- unless ($reply=~/^error\:/) {
- foreach (split(/\&/,$reply)) {
- my ($name,$value)=split(/\=/,&Apache::lonnet::unescape($_));
- $result{$name}=$value;
- }
+ my ($temp)=keys(%result);
+ unless ($temp=~/^error\:/) {
foreach my $CurCol(@cols) {
($PrOrd,$ResId)=split(/\:/,$CurCol);
if ( !$CurCol ) { next; }
$ResId=~/(\d+)\.(\d+)/;
my $MapId=$1;
my $PrbId=$2;
- my $Map = &Apache::lonnet::declutter( $hash{'map_id_'.$MapId} );
+ my $MapOrg = $hash{'map_id_'.$MapId};
+ my $Map = &Apache::lonnet::declutter($MapOrg);
if ( $CurMap ne 'All Maps' ) {
my ( $ResMap, $NameMap ) = split(/\=/,$CurMap);
if ( $Map ne $ResMap ) { next; }
@@ -507,8 +793,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;
@@ -517,22 +804,22 @@ sub ExtractStudentData {
$TempHash{"$Part.PrOrd"} = $PrOrd+$PartNo;
$PartNo++;
}
+ #my $Part=&Apache::lonnet::metadata($meta,$_.'.part');
}
}
-
+ &Apache::lonnet::declutter( $hash{'src_'.$ResId} );
+ my $URI = $hash{'src_'.$ResId};
my $Prob = $Map.'___'.$PrbId.'___'.
- &Apache::lonnet::declutter( $hash{'src_'.$ResId} );
+ &Apache::lonnet::declutter($URI);
$Code='U';
$Tries = 0;
$ParCr = 0;
$Wrongs = 0;
- $LatestVersion = $result{"version:$Prob"};
-
+ $LatestVersion = $result{"version:$Prob"};
if ( $LatestVersion ) {
for ( my $Version=1; $Version<=$LatestVersion; $Version++ ) {
my $vkeys = $result{"$Version:keys:$Prob"};
my @keys = split(/\:/,$vkeys);
-
foreach my $Key (@keys) {
if (($Key=~/\.(\w+)\.solved$/) && ($Key!~/^\d+\:/)) {
my $Part = $1;
@@ -565,11 +852,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;
@@ -578,12 +865,12 @@ sub ExtractStudentData {
$DisF = sprintf( "%.4f", $Fac );
}
else {$DisF = $Fac;}
-# $DisF .= '+'.$TempHash{"$part.Time"};
+# $DisF .= '+'.$TempHash{"$part.Time"};33333333
$TimeTot += $TempHash{"$part.Time"};
$Dis .= $TempHash{$part.'.PrOrd'}.'='.$DisF.'+'.$Yes;
- $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++;
@@ -615,6 +902,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};
@@ -626,7 +914,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};
}
@@ -641,36 +931,53 @@ sub tracetable {
my $meta=$hash{'src_'.$frid};
my $PartNo = 0;
+ my $Part;
+ # if ($IsMap==0){
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');
+ if ($_=~/^stores\_(\w+)\_tries$/) {
+ $Part=&Apache::lonnet::metadata($meta,$_.'.part');
$P_Order++;
$mapsort{$HWN} .= '&'.$P_Order;
$PartNo++;
#$r->print(' '.$PartNo.'---'.$P_Order);
}
+ foreach my $K(split(/\,/,&Apache::lonnet::metadata($meta,'packages'))) {
+ if ($K=~/^optionresponse\_($Part)\_(\w+)$/) {
+ #$r->print(' '.$_.'...'.$P_Order.'---'.$Part);
+ $OpResp{$P_Order}="$frid:$Part";
+ }
+ }
}
}
}
}
+ # }
} 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}="$rid:$Part";;
+ }
+
+ }
+
}
}
}
- }
+ }
}
if (defined($hash{'to_'.$rid})) {
foreach (split(/\,/,$hash{'to_'.$rid})){
@@ -691,7 +998,8 @@ sub MySort {
}
}
-sub Build_Statistics {
+sub Create_PrgWin {
+#----------- Create progress
$r->print(<
popwin=open('','popwin','width=400,height=100');
@@ -706,16 +1014,30 @@ sub Build_Statistics {
ENDPOP
$r->rflush();
-# ---------------------------- Gathering the Data of students' tries
- my $index;
- for ($index=0;$index<=$#students;$index++) {
+}
+
+
+sub Update_PrgWin {
#----------- update progress
- $r->print('');
- $r->rflush();
+ my $index = shift;
+ $r->print('');
+ $r->rflush();
+}
+
+sub Close_PrgWin {
+#--------------------- close Progress Line
+ $r->print('');
+ $r->rflush();
+}
- &ExtractStudentData($students[$index],$cid);
+sub Build_Statistics {
+ &Create_PrgWin();
+# ---------------------------- Gathering the Data of students' tries
+ for (my $index=0;$index<=$#students;$index++) {
+ &Update_PrgWin($index);
+ &ExtractStudentData($students[$index]);
}
# -------------------- sorting the Data
@@ -743,7 +1065,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;
@@ -763,7 +1085,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++;
@@ -772,7 +1094,7 @@ ENDPOP
$Temp = ''.$hash{'title_'.$ResId}.$Dummy.'';
-
+
my $res = &Apache::lonnet::declutter($hash{'src_'.$ResId});
my $urlres=$res;
@@ -822,7 +1144,7 @@ ENDPOP
$Skewness += $Dif*$Dif*$Dif;
}
$Skewness /= $StdNo;
- $Skewness /= $StdDev*$StdDev*$StdDev;
+ $Skewness /= $StdDev*$StdDev*$StdDev;
}
#--------------------- Compute the Discrimination Factors
@@ -839,10 +1161,11 @@ 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 = $lpr[$i].'&'.$Temp.'&'.$StdNo.'&'.
+ $TotalTries.'&'.$MxTries.'&'.$Avg.'&'.
+ $YES.'&'.$Override.'&'.$Wrng.'&'.$DoD.'&'.
+ $SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'.
+ $Prob;
$CachData{($p_count-1)}=$join;
$urlres=~/^(\w+)\/(\w+)/;
@@ -856,9 +1179,7 @@ ENDPOP
}
&CloseTable();
}
-#--------------------- close Progress Line
- $r->print('');
- $r->rflush();
+ &Close_PrgWin();
}
sub Cache_Statistics {
@@ -870,14 +1191,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++;
}
@@ -891,7 +1212,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++;
}
@@ -901,7 +1223,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();
@@ -910,10 +1232,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".'