# | '. - "\n".'Problem Title | '. - "\n".'Resouse | '. - "\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.'; + my $totalTries = 0; + my $totalAwarded = 0; + my $tempProblemOrder=0; + my $spent=0; + my $spent_yes=0; + my $TotDiscuss=0; + my $TotalOpend = 0; + my $ProbSolved = 0; + my $ProbTot = 0; + my $TotFirst = 0; + my $TimeTot = 0; + my $Discussed=0; - $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"); + 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'}='-'; + } + # 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; + $Discussed=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'}--; + } + } + } -# ------------------------------------- Find the section of student in a course - -sub usection { - my ($udom,$unam,$courseid,$ActiveFlag)=@_; - $courseid=~s/\_/\//g; - $courseid=~s/^(\w)/\/$1/; - foreach (split(/\&/,&Apache::lonnet::reply('dump:'. - $udom.':'.$unam.':roles', - &Apache::lonnet::homeserver($unam,$udom)))){ - my ($key,$value)=split(/\=/,$_); - $key=&Apache::lonnet::unescape($key); - if ($key=~/^$courseid(?:\/)*(\w+)*\_st$/) { - my $section=$1; - if ($key eq $courseid.'_st') { $section=''; } - my ($dummy,$end,$start)=split(/\_/,&Apache::lonnet::unescape($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'; -} + # 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; + if($_ > 1) { + $ptr .= "*(part $_)"; + $Dis .= '&'; + } -# ------ 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=~/^error\:/) { - 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++; + my ($pr_no,$dod)=split('&',$ptr); + my $DoDiff=$DoDiff{$dod}; +# $r->print('
'. - ' Tries : Total Number of Tries for solving the problem.
'. - ' Max : Maximunm Number of Tries for solving the problem.
'. - ' Avg. : 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 - Avg.)^2)) / (#Stdnts-1)'. - ' where Xi denotes every student\'s tries ]
'. - ' Skew. : Skewness of the students tries.'. - ' [ (sqrt( sum((Xi - Avg.)^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 .= ' |
Disc. | '; + $Ptr .= 'Number of Students had at least one discussion.'; + $Ptr .= ' |
\# | Problem Title | "; + $Str .= 'Resource | Analysis |
---|---|---|---|
'.$number.' | '; + $Str .= ''.$Temp.' | '; + $Str .= ''.$uri.' | '; + $Str .= '
\# | Set Title | "; + $Str .= 'Results | Tries |
---|---|---|---|
'.$sequence.' | '; + $Str .= ''.$cache->{$sequence.':title'}.' | '; + + $codes = ''; + $attempts = ''; + 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'}='-'; + } + + # 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 $code='U'; + + $tries = $cache->{$name.":$Version:$problem". + ":resource.$part.tries"}; + $partData{$part.':tries'}=($tries) ? $tries : 0; + + my $val = $cache->{$name.":$Version:$problem". + ":resource.$part.solved"}; + if ($val eq 'correct_by_student') {$code = 'Y';} + elsif ($val eq 'correct_by_override') {$code = 'y';} + elsif ($val eq 'incorrect_attempted') {$code = 'N';} + elsif ($val eq 'incorrect_by_override'){$code = 'N';} + elsif ($val eq 'excused') {$code = 'x';} + $partData{$part.':code'}=$code; + } + } -sub Title { - $r->print('
Select Map | '."\n"; + $Ptr .= ''; + $Ptr .= &Apache::lonhtmlcommon::MapOptions(\%cache, 'ProblemStatistics'); + $Ptr .= ' |