--- loncom/interface/lonstatistics.pm 2002/05/31 13:47:01 1.25
+++ loncom/interface/lonstatistics.pm 2002/07/17 12:53:00 1.27
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# (Publication Handler
#
-# $Id: lonstatistics.pm,v 1.25 2002/05/31 13:47:01 minaeibi Exp $
+# $Id: lonstatistics.pm,v 1.27 2002/07/17 12:53:00 stredwic Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -42,6 +42,7 @@ use Apache::Constants qw(:common :http);
use Apache::lonnet();
use Apache::lonhomework;
use Apache::loncommon;
+use Apache::loncoursedata;
use HTML::TokeParser;
use GDBM_File;
@@ -49,48 +50,19 @@ use GDBM_File;
my %hash;
my %CachData;
my %GraphDat;
-my %OpResp;
-my %maps;
my %mapsort;
-my %section;
-my %StuBox;
-my %DiscFac;
-my %DisUp;
-my %DisLow;
-my $UpCnt;
-my $CurMap;
-my $CurSec;
-my $CurStu;
-my @cols;
-my @list;
-my @students;
-my $p_count;
my $Pos;
my $r;
-my $OpSel1;
-my $OpSel2;
-my $OpSel3;
-my $OpSel4;
my $GData;
-my $cid;
-my $firstres;
-my $lastres;
-my $DiscFlag;
-my $HWN;
-my $P_Order;
my %color;
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 = ();
-
sub Activity {
- my $file="/home/minaeibi/minaei";
- my $userid='billskat';
+ my $file="/home/minaeibi/activity.log";
+ my $userid='adamsde1';
$r->print("
Using $file");
$r->rflush();
open(FILEID, "<$file");
@@ -106,21 +78,16 @@ sub Activity {
if ($who ne $userid) { next; }
if (!$resource) { next; }
my $res=&Apache::lonnet::unescape($resource);
- #if (($key=~/\.(\w+)\.(\w+)\.submission$/)) {
- #if ($meta=~/\.(problem|exam|quiz|assess|survey|form)$/) {
- # foreach my $Key(split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) {
- # if ($Key=~/^stores\_(\w+)\_tries$/) {
-
- # if (($res =~ /^\/res\/adm/)) {
+ if (($res =~ /\.(problem|htm|html)/)) {
$Count++;
- $r->print("
$Count) $date: $who --> $res");
- if ($post) {
- $Count++;
- $r->print("
$Count) Sent data ".join(':',
- &Apache::lonnet::unescape(@posts)).'');
- }
+ $r->print("
$Count) ".localtime($date).": $who --> $res");
+# if ($post) {
+# $Count++;
+# $r->print("
$Count) Sent data ".join(':',
+# &Apache::lonnet::unescape(@posts)).'');
+# }
$r->rflush();
- # }
+ }
## push (@allaccess,unescape($access));
#print $machine;
}
@@ -138,26 +105,29 @@ sub Activity {
# }
}
-
+#---- Analyze Web Page ---------------------------------------------------
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 ($uri,$part,$problem,$student,$courseID)=@_;
+ my ($username,$userdomain)=split(/\:/,$student);
- (my $garbage,$Answ)=split(/_HASH_REF__/,$Answ,2);
+ # Render the student's view of the problem. $Answ is the problem
+ # Stringafied
+ my $Answ=&Apache::lonnet::ssi($uri,('grade_target' => 'analyze',
+ 'grade_username' => $username,
+ 'grade_domain' => $userdomain,
+ 'grade_courseid' => $courseID,
+ 'grade_symb' => $problem));
+# my $Answ=&Apache::lonnet::ssi($uri,('grade_target' => 'analyze'));
+
+# (undef,$Answ)=split(/_HASH_REF__/,$Answ,2);
%Answer=();
%Answer=&Apache::lonnet::str2hash($Answ);
+# foreach (sort(keys(%Answer))) {
+# $r->print($_.' '.$Answer{$_}.'
');
+# }
+
my $parts='';
foreach my $elm (@{$Answer{"parts"}}) {
$parts.="$elm,";
@@ -176,69 +146,72 @@ sub InitAnalysis {
#$ConceptData{$foil} = $Answer{"$parts.foil.value.$foil"};
}
}
- return $symb;
-}
+ return;
+}
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);
- $ConceptData{"Int.0"}=$opn;
- for (my $i=1;$i<$Int;$i++) {
- $ConceptData{"Int.$i"}=$opn+$i*$add;
+ my ($part,$symb)=@_;
+ my $interval=$ConceptData{"Interval"};
+ my $due = &Apache::lonnet::EXT('resource.'.$part.'.duedate',$symb)+1;
+ my $open = &Apache::lonnet::EXT('resource.'.$part.'.opendate',$symb);
+ my $add=int(($due-$open)/$interval);
+ $ConceptData{'Interval.0'}=$open;
+ for (my $i=1;$i<$interval;$i++) {
+ $ConceptData{'Interval.'.$i}=$open+$i*$add;
}
- $ConceptData{"Int.$Int"}=$due;
- for (my $i=0;$i<$Int;$i++) {
+ $ConceptData{'Interval.'.$interval}=$due;
+ for (my $i=0;$i<$interval;$i++) {
for (my $n=0; $n<=$#Concepts; $n++ ) {
my $tmp=$Concepts[$n];
- $ConceptData{"$tmp.$i.true"}=0;
- $ConceptData{"$tmp.$i.false"}=0;
+ $ConceptData{$tmp.'.'.$i.'.true'}=0;
+ $ConceptData{$tmp.'.'.$i.'.false'}=0;
}
}
}
-
sub ShowOpGraph {
- my ($InpStr, $Int_No)=@_;
- my ($rid,$part)=split(/\:/,substr($InpStr,8));
- $ConceptData{"Interval"}=$Int_No;
+ my ($cache, $students, $courseID)=@_;
+ my $uri = $cache->{'AnalyzeURI'};
+ my $part = $cache->{'AnalyzePart'};
+ my $problem = $cache->{'AnalyzeProblem'};
+ my $title = $cache->{'AnalyzeProblem'};
+ my $interval = $cache->{'Interval'};
+ $ConceptData{"Interval"} = $interval;
+
#Initialize the option response true answers
- my $symb=&InitAnalysis($rid,$students[0]);
+ &InitAnalysis($uri, $part, $problem, $students->[0],$courseID);
+
#compute the intervals
- &Interval($rid,$part,$symb);
- my $URI = $hash{'src_'.$rid};
- my $Src = $hash{'title_'.$rid};
- $Src =~ s/\ /"_"/eg;
- $r->print('
'.$URI.'');
+ &Interval($part,$problem);
+
+ $title =~ s/\ /"_"/eg;
+ $r->print('
'.$uri.'');
$r->rflush();
#Java script Progress window
&Create_PrgWin();
- &Update_PrgWin("Starting to analyze problem");
- for (my $index=0;$index<=$#students;$index++) {
- &Update_PrgWin($index);
- &OpStatus($rid,$students[$index]);
+ &Update_PrgWin("Starting to analyze problem",0,0,'');
+ for(my $index=0; $index<(scalar @$students); $index++) {
+ &Update_PrgWin(scalar @$students, $index+1, $students->[$index]);
+ &OpStatus($problem, $students->[$index], $courseID);
}
&Close_PrgWin();
$r->print('
');
- for (my $k=0; $k<$Int_No; $k++ ) {
- &DrawGraph($k,$Src);
+ for(my $k=0; $k<$interval; $k++ ) {
+ &DrawGraph($k,$title);
}
- for (my $k=0; $k<$Int_No; $k++ ) {
+ for(my $k=0; $k<$interval; $k++ ) {
&DrawTable($k);
}
#$Apache::lonxml::debug=1;
#&Apache::lonhomework::showhash(%ConceptData);
#$Apache::lonxml::debug=0;
- my $Answ=&Apache::lonnet::ssi($URI);
+ my $Answ=&Apache::lonnet::ssi($uri);
$r->print("
Here you can see the Problem:
$Answ");
}
-
sub DrawTable {
my $k=shift;
my $Max=0;
@@ -293,85 +266,43 @@ sub DrawTable {
sub DrawGraph {
- my ($k,$Src)=@_;
+ my ($currentInterval,$title)=@_;
my $Max=0;
my @data1;
my @data2;
# Adjust Data and find the Max
- for (my $n=0; $n<=$#Concepts; $n++ ) {
+ for(my $n=0; $n<=$#Concepts; $n++ ) {
my $tmp=$Concepts[$n];
- $data1[$n]=$ConceptData{"$tmp.$k.true"};
- $data2[$n]=$ConceptData{"$tmp.$k.false"};
+ $data1[$n]=$ConceptData{$tmp.'.'.$currentInterval.'.true'};
+ $data2[$n]=$ConceptData{$tmp.'.'.$currentInterval.'.false'};
my $Sum=$data1[$n]+$data2[$n];
- if ( $Max<$Sum ) {$Max=$Sum;}
+ if($Max < $Sum) { $Max = $Sum; }
}
- for (my $n=0; $n<=$#Concepts; $n++ ) {
- if ($data1[$n]+$data2[$n]<$Max) {
+ for(my $n=0; $n<=$#Concepts; $n++) {
+ if($data1[$n]+$data2[$n]<$Max) {
$data2[$n]+=$Max-($data1[$n]+$data2[$n]);
}
}
- my $P_No = $#data1+1;
+ my $P_No = scalar @data1;
- if ( $Max > 1 ) {
+ if($Max > 1) {
$Max += (10 - $Max % 10);
$Max = int($Max);
- } else { $Max = 1; }
+ } else {
+ $Max = 1;
+ }
- my $Titr=($ConceptData{'Interval'}>1) ? $Src.'_interval_'.($k+1) : $Src;
+ my $Titr=($ConceptData{'Interval'}>1) ?
+ $title.'_interval_'.($currentInterval+1) : $title;
# $GData=$Titr.'&Concepts'.'&'.'Answers'.'&'.$Max.'&'.$P_No.'&'.$data1.'&'.$data2;
- $GData="$Titr&Concepts&Answers&$Max&$P_No&".
- (join(',',@data1)).'&'.(join(',',@data2));
+ $GData = $Titr.'&Concepts&Answers&'.$Max.'&'.$P_No.'&';
+ $GData .= (join(',',@data1)).'&'.(join(',',@data2));
$r->print('');
}
-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 );
-
- #the table of option response problems
- $r->print('
Option Response Problems in this course:
');
- my $Str = "\n".'
# | '. - "\n".'Problem Title | '. - "\n".'Resource | '. - "\n".'Address | '. - "\n".'
---|---|---|---|
$P_No | ". - "\n"."".$Temp." | ". - "\n"."".$hash{'src_'.$rid}." | ". - "\n"."".''.' | '. - "\n"."
# | '. - "\n".'Set Title | '. - "\n".'Results | '. - "\n".'Tries | '. - "\n".'
---|---|---|---|
$SetNo | ". - "\n"."$Set | ". - "\n"."$PtrCod | ". - "\n"."$PtrTry | ". - "\n"."
P# | '."\n"; - for ( my $nIdx=0; $nIdx < $ColNo; $nIdx++ ) { - $Result .= ''.''.' | '."\n"; + my $Result = "\n".'
---|
P# | '."\n"; + for(my $nIndex=0; $nIndex < (scalar (keys %$headings)); $nIndex++) { + $Result .= ''.''.' | '."\n"; } $Result .= "\n".'
---|
'. - ' #Stdnts: Total Number of Students opened the problem.'; - - $r->print($Ptr); - - $r->print('Output CSV format: print(' checked'); } - $r->print('>'); - - $r->rflush(); - - if ((-e "$CacheDB")&&($ENV{'form.sort'} ne 'Recalculate Statistics')) { - if (tie(%CachData,'GDBM_File',"$CacheDB",&GDBM_READER,0640)) { - tie(%GraphDat,'GDBM_File',$GraphDB,&GDBM_WRCREAT,0640); - &Cache_Statistics(); - } - else { - $r->print("Unable to tie hash to db file"); - } - } - else { - if (tie(%CachData,'GDBM_File',$CacheDB,&GDBM_WRCREAT,0640)) { - tie(%GraphDat,'GDBM_File',$GraphDB,&GDBM_WRCREAT,0640); - foreach (keys %DiscFac) {delete $CachData{$_};} - foreach (keys %CachData) {delete $CachData{$_};} - $DiscFlag=0; - &Build_Statistics(); - } - else { - $r->print("Unable to tie hash to db file"); +# ------ Dump the Student's DB file and handling the data for statistics table +sub ExtractStudentData { + my ($cache,$name)=@_; + my %discriminantFactor; + my @list=(); + + my $totalTries = 0; + my $totalAwarded = 0; + my $tempProblemOrder=0; + foreach my $sequence (split(':', $cache->{'orderedSequences'})) { + if($cache->{'ProblemStatisticsMap'} ne 'All Maps' && + $cache->{'ProblemStatisticsMap'} ne $cache->{$sequence.':title'}) { + next; } - } - -# $r->print('Total instances of the problems : '.($p_count*($#students+1))); - untie(%CachData); - untie(%GraphDat); -} + my $Dis = ''; + foreach my $problemID (split(':', $cache->{$sequence.':problems'})) { + my $problem = $cache->{$problemID.':problem'}; + my $LatestVersion = $cache->{$name.':version:'.$problem}; + + # Output dashes for all the parts of this problem if there + # is no version information about the current problem. + #if(!$LatestVersion) { + # foreach my $part (split(/\:/,$cache->{$sequence.':'. + # $problemID. + # ':parts'})) { + # $codes .= "-,"; + # $attempts .= "0,"; + # } + # next; + #} + + my %partData=undef; + # Initialize part data, display skips correctly + # Skip refers to when a student made no submissions on that + # part/problem. + foreach my $part (split(/\:/,$cache->{$sequence.':'. + $problemID. + ':parts'})) { + $partData{$part.':tries'}=0; + $partData{$part.':code'}='-'; + } -# ------------------------------------- Find the section of student in a course - -sub usection { - my ($udom,$unam,$courseid,$ActiveFlag)=@_; - $courseid=~s/\_/\//g; - $courseid=~s/^(\w)/\/$1/; - - my %result=&Apache::lonnet::dump('roles',$udom,$unam); - my ($checkForResult)=keys(%result); - if ($checkForResult=~/^(con_lost|error|no_such_host)/i) { - return -1; - } - foreach my $key (keys (%result)) { - my $value=$result{$key}; - if ($key=~/^$courseid(?:\/)*(\w+)*\_st$/) { - my $section=$1; - if ($key eq $courseid.'_st') { $section=''; } - my ($dummy,$end,$start)=split(/\_/,$value); - if ( $ActiveFlag ne 'Any' ) { - my $now=time; - my $notactive=0; - if ($start) { - if ($now<$start) { $notactive=1; } - } - if ($end) { - if ($now>$end) { $notactive=1; } - } - if ((($ActiveFlag eq 'Expired') && $notactive == 1) || - (($ActiveFlag eq 'Active') && $notactive == 0 ) ) { - return $section; - } - else { return '-1'; } - } - return $section; - } - } - return '-1'; -} + # Looping through all the versions of each part, starting with the + # oldest version. Basically, it gets the most recent + # set of grade data for each part. + for(my $Version=1; $Version<=$LatestVersion; $Version++) { + foreach my $part (split(/\:/,$cache->{$sequence.':'. + $problemID. + ':parts'})) { + + if(!defined($cache->{$name.":$Version:$problem". + ":resource.$part.solved"})) { + # No grade for this submission, so skip + next; + } + + my $tries=0; + my $time=0; + my $awarded=0; + my $code='U'; + + $awarded = $cache->{$name. + "$Version:$problem:resource.". + "$part.awarded"}; + $partData{$part.':awarded'} = ($awarded) ? $awarded : 0; + $totalAwarded += $awarded; + + $tries = $cache->{$name.":$Version:$problem". + ":resource.$part.tries"}; + $partData{$part.':tries'} = ($tries) ? $tries : 0; + $partData{$part.':wrong'} = $partData{$part.':tries'}; + $totalTries += $tries; + + my $val = $cache->{$name.":$Version:$problem". + ":resource.$part.solved"}; + if ($val eq 'correct_by_student') {$code = 'C';} + elsif ($val eq 'correct_by_override') {$code = 'O';} + elsif ($val eq 'incorrect_attempted') {$code = 'I';} + elsif ($val eq 'incorrect_by_override'){$code = 'I';} + elsif ($val eq 'excused') {$code = 'x';} + $partData{$part.':code'}=$code; + + if($partData{$part.':wrong'} ne 0 && + ($code eq 'C' || $code eq 'O')) { + $partData{$part.':wrong'}--; + } + } + } + # Loop through all the parts for the current problem in the + # correct order and prepare the output + foreach (split(/\:/,$cache->{$sequence.':'.$problemID. + ':parts'})) { + my $Yes = 0; + if($partData{$_.':code'} eq 'C' || + $partData{$_.':code'} eq 'O') { + $Yes=1; + } + #my $ptr = "$hash{'title_'.$ResId}"; + my $ptr = $tempProblemOrder.'&'.$problemID; -# ------ Dump the Student's DB file and handling the data for statistics table -sub ExtractStudentData { - my $student=shift; - my ($sname,$sdom) = split( /\:/, $student ); - my %result = &Apache::lonnet::dump($cid,$sdom,$sname); - my $ResId; - my $PrOrd; - my $Dis = ''; - my $Code; - my $Tries; - my $ParCr; - my $TotalTries = 0; - my $TotalOpend = 0; - my $ProbSolved = 0; - my $ProbTot = 0; - my $TimeTot = 0; - my $TotParCr = 0; - my $Wrongs; - my %TempHash; - my $Version; - my $LatestVersion; - my $SecLimit; - my $MapLimit; - my ($temp)=keys(%result); - unless ($temp=~/^(con_lost|error|no_such_host)/i) { - foreach my $CurCol(@cols) { - ($PrOrd,$ResId)=split(/\:/,$CurCol); - if ( !$CurCol ) { next; } - $ResId=~/(\d+)\.(\d+)/; - my $MapId=$1; - my $PrbId=$2; - 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; } - } - my $meta=$hash{'src_'.$ResId}; - my $PartNo = 0; - $Dis .= ':'; - undef %TempHash; - - 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; - $TempHash{$PartNo}=$Part; - $TempHash{"$Part.Code"} = 'U'; - $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($URI); - $Code='U'; - $Tries = 0; - $ParCr = 0; - $Wrongs = 0; - $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; - $Tries = $result{"$Version:$Prob:resource.$Part.tries"}; - $ParCr = $result{"$Version:$Prob:resource.$Part.awarded"}; - my $Time = $result{"$Version:$Prob:timestamp"}; - $TempHash{"$Part.Time"} = ($Time) ? $Time : 0; - $TempHash{"$Part.Tries"} = ($Tries) ? $Tries : 0; - $TempHash{"$Part.ParCr"} = ($ParCr) ? $ParCr : 0; - $TotalTries += $TempHash{"$Part.Tries"}; - $TotParCr += $TempHash{"$Part.ParCr"}; - my $Val = $result{"$Version:$Prob:resource.$Part.solved"}; - if ( $Val eq 'correct_by_student' ) - { $Wrongs = $Tries - 1; $Code = 'C'; } - elsif ( $Val eq 'correct_by_override' ) - { $Wrongs = $Tries - 1; $Code = 'O'; } - elsif ( $Val eq 'incorrect_attempted' || - $Val eq 'incorrect_by_override' ) - { $Wrongs = $Tries; $Code = 'I'; } - $TempHash{"$Part.Code"} = $Code; - $TempHash{"$Part.Wrongs"} = $Wrongs; - } - } - } - for ( my $n = 0; $n < $PartNo; $n++ ) { - my $part = $TempHash{$n}; - my $Yes = 0; - if ( $TempHash{$part.'.Code'} eq 'C' || - $TempHash{$part.'.Code'} eq 'O' ) - {$ProbSolved++;$Yes=1;} - - # my $ptr = "$hash{'title_'.$ResId}"; - my $ptr = $TempHash{$part.'.PrOrd'}.'&'.$ResId; - - if ( $PartNo > 1 ) { - $ptr .= "*(part $part)"; - $Dis .= '&'; - } - my $Fac = ($TempHash{"$part.Tries"}) ? - ($TempHash{"$part.ParCr"}/$TempHash{"$part.Tries"}) : 0; - my $DisF; - if ( $Fac > 0 && $Fac < 1 ) { - $DisF = sprintf( "%.4f", $Fac ); - } - else {$DisF = $Fac;} -# $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'}"; - push (@list, $ptr); - $TotalOpend++; - $ProbTot++; - } + if($_ > 1) { + $ptr .= "*(part $_)"; + $Dis .= '&'; + } + my $Fac = ($partData{$_.':Tries'}) ? + ($partData{$_.':awarded'}/$partData{$_.':tries'}) : 0; + my $DisF; + if($Fac > 0 && $Fac < 1) { + $DisF = sprintf( "%.4f", $Fac ); + } else { + $DisF = $Fac; + } + $Dis .= $tempProblemOrder.'='.$DisF.'+'.$Yes; + $ptr .= '&'.$partData{$_.'.Tries'}. + '&'.$partData{$_.'.Wrongs'}. + '&'.$partData{$_.'.Code'}; + push (@list, $ptr); + $tempProblemOrder++; } - #else { - #for(my $n=0; $n<$PartNo; $n++) { - # push (@list, "$TempHash{'0'.'.PrOrd'}.':'.$ResId:0:0:U"); - # $ProbTot++; - #} - #} } - if ( $TotalTries ) { - my $DisFac = ( $TotalTries ) ? ($TotParCr/$TotalTries) : 0; + if($totalTries) { + my $DisFac = ($totalAwarded/$totalTries); my $DisFactor = sprintf( "%.4f", $DisFac ); - $DiscFac{$DisFactor}=$Dis; - #my $time; - #if ($ProbSolved){ - #$time = int(($TimeTot/$ProbSolved)-10000000); - #} - #$DiscFac{($DisFactor.':'.$sname.':'.$ProbTot.':'.$TotalOpend.':'. - # $TotalTries.':'.$ProbSolved.':'.$time)}=$Dis; + $discriminantFactor{$DisFactor}=$Dis; } } - #$r->print($sname.' PrCr= '.$TotParCr.' Slvd= '.$ProbSolved.' Tries='.$TotalTries.'
'. - ' Tries : Total Number of Tries for solving the problem.
'. - ' Mod : Maximunm Number of Tries for solving the problem.
'. - ' Mean : Average Number of the tries. [ Tries / #Stdnts ]
'. - ' #YES : Number of students solved the problem correctly.
'. - ' #yes : Number of students solved the problem by override.
'. - ' %Wrng : Percentage of students tried to solve the problem but'. - ' still incorrect. [ 100*((#Stdnts-(#YES+#yes))/#Stdnts) ]
'. -# ' DoDiff : Degree of Difficulty of the problem. [ Tries/(#YES+#yes+0.1) ]
'. Kashy formula - ' DoDiff : Degree of Difficulty of the problem. [ 1 - ((#YES+#yes) / Tries) ]
'. #Gerd formula - ' S.D. : Standard Deviation of the tries.'. - '[ sqrt(sum((Xi - Mean)^2)) / (#Stdnts-1)'. - ' where Xi denotes every student\'s tries ]
'. - ' Skew. : Skewness of the students tries.'. - ' [ (sqrt( sum((Xi - Mean)^3) / #Stdnts)) / (S.D.^3) ]
'. - ' Dis.F. : Discrimination Factor: A Standard for '. - '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'. - '
'; + $Ptr .= '#Stdnts: | '; + $Ptr .= 'Total Number of Students opened the problem.'; + $Ptr .= ' |
'; + $Ptr .= 'Tries: | '; + $Ptr .= 'Total Number of Tries for solving the problem.'; + $Ptr .= ' |
'; + $Ptr .= 'Mod: | '; + $Ptr .= 'Maximunm Number of Tries for solving the problem.'; + $Ptr .= ' |
'; + $Ptr .= 'Mean: | '; + $Ptr .= 'Average Number of the tries. [ Tries / #Stdnts ]'; + $Ptr .= ' |
'; + $Ptr .= '#YES: | '; + $Ptr .= 'Number of students solved the problem correctly.'; + $Ptr .= ' |
'; + $Ptr .= '#yes: | '; + $Ptr .= 'Number of students solved the problem by override.'; + $Ptr .= ' |
'; + $Ptr .= '%Wrng: | '; + $Ptr .= 'Percentage of students tried to solve the problem '; + $Ptr .= 'but still incorrect. [ 100*((#Stdnts-(#YES+#yes))/#Stdnts) ]'; + $Ptr .= ' |
';
+# Kashy formula
+# ' DoDiff : Degree of Difficulty of the problem. '. +# '[ Tries/(#YES+#yes+0.1) ] '. + #Gerd formula + $Ptr .= 'DoDiff: | ';
+ $Ptr .= 'Degree of Difficulty of the problem. '; + $Ptr .= '[ 1 - ((#YES+#yes) / Tries) ]'; + $Ptr .= ' |
'; + $Ptr .= 'S.D.: | '; + $Ptr .= 'Standard Deviation of the tries. '; + $Ptr .= '[ sqrt(sum((Xi - Mean)^2)) / (#Stdnts-1) '; + $Ptr .= 'where Xi denotes every student\'s tries ]'; + $Ptr .= ' |
'; + $Ptr .= 'Skew.: | '; + $Ptr .= 'Skewness of the students tries.'; + $Ptr .= '[(sqrt( sum((Xi - Mean)^3) / #Stdnts)) / (S.D.^3)]'; + $Ptr .= ' |
'; + $Ptr .= 'Dis.F.: | '; + $Ptr .= 'Discrimination Factor: A Standard for evaluating the ';
+ $Ptr .= 'problem according to a Criterion '; + $Ptr .= '[Applied Criterion in %27 Upper Students - '; + $Ptr .= 'Applied the same Criterion in %27 Lower Students] '; + $Ptr .= '1st Criterion for Sorting the Students: '; + $Ptr .= 'Sum of Partial Credit Awarded / Total Number of Tries '; + $Ptr .= '2nd Criterion for Sorting the Students: '; + $Ptr .= 'Total number of Correct Answers / Total Number of Tries'; + $Ptr .= ' |
\# | Problem Title | "; + $Str .= 'Resource | Analysis |
---|---|---|---|
'.$number.' | '; + $Str .= ''.$Temp.' | '; + $Str .= ''.$uri.' | '; + $Str .= '