--- loncom/interface/loncoursedata.pm 2003/03/25 22:29:31 1.61 +++ loncom/interface/loncoursedata.pm 2003/04/09 14:51:29 1.67 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursedata.pm,v 1.61 2003/03/25 22:29:31 matthew Exp $ +# $Id: loncoursedata.pm,v 1.67 2003/04/09 14:51:29 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -104,7 +104,7 @@ sub get_sequence_assessment_data { my $fn=$ENV{'request.course.fn'}; ## ## use navmaps - my $navmap = Apache::lonnavmaps::navmap->new(Apache->request,$fn.".db", + my $navmap = Apache::lonnavmaps::navmap->new($fn.".db", $fn."_parms.db",1,0); if (!defined($navmap)) { return 'Can not open Coursemap'; @@ -506,8 +506,6 @@ sub init_dbs { type => 'TINYTEXT' }, { name => 'timestamp', type => 'INT UNSIGNED'}, - { name => 'weight', - type => 'INT UNSIGNED'}, ], 'PRIMARY KEY' => ['symb_id','student_id','part_id'], 'KEY' => [{ columns=>['student_id'] }, @@ -859,10 +857,9 @@ sub update_student_data { my $symb_id = &get_symb_id($current_symb); # # Load data into the tables - foreach my $parameter (keys(%$param_hash)) { - my $value = $param_hash->{$parameter}; + while (my ($parameter,$value) = each(%$param_hash)) { my $newstring; - if ($parameter !~ /(timestamp|resource\.(.*)\.(solved|tries|awarded|award|awarddetail|previous|weight))/) { + if ($parameter !~ /(timestamp|resource\.(.*)\.(solved|tries|awarded|award|awarddetail|previous))/) { $newstring = "('".join("','", $symb_id,$student_id, $parameter,$value)."'),\n"; @@ -883,11 +880,6 @@ sub update_student_data { my $award = $param_hash->{'resource.'.$part.'.award'}; my $awarddetail = $param_hash->{'resource.'.$part.'.awarddetail'}; my $timestamp = $param_hash->{'timestamp'}; - # use EXT to get the weight - my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight', - $current_symb,$sdom,$sname); - # Give the weight back to the user - $param_hash->{'resource.'.$part.'.weight'}=$weight; # $solved = '' if (! defined($awarded)); $tries = '' if (! defined($tries)); @@ -896,7 +888,7 @@ sub update_student_data { $awarddetail = '' if (! defined($awarddetail)); $newstring = "('".join("','",$symb_id,$student_id,$part_id, $solved,$tries,$awarded,$award, - $awarddetail,$timestamp,$weight)."'),\n"; + $awarddetail,$timestamp)."'),\n"; $store_performance_command .= $newstring; $rows_stored++; } @@ -1039,7 +1031,7 @@ sub get_student_data_from_performance_ca my $dbh = &Apache::lonmysql::get_dbh(); my $request = "SELECT ". "d.symb,c.part,a.solved,a.tries,a.awarded,a.award,a.awarddetail,". - "a.timestamp,a.weight "; + "a.timestamp "; if (defined($student)) { $request .= "FROM $student_table AS b ". "LEFT JOIN $performance_table AS a ON b.student_id=a.student_id ". @@ -1047,7 +1039,7 @@ sub get_student_data_from_performance_ca "LEFT JOIN $symb_table AS d ON d.symb_id = a.symb_id ". "WHERE student='$student'"; if (defined($symb) && $symb ne '') { - $request .= " AND d.symb='".$dbh->quote($symb)."'"; + $request .= " AND d.symb=".$dbh->quote($symb); } } elsif (defined($symb) && $symb ne '') { $request .= "FROM $symb_table as d ". @@ -1068,7 +1060,7 @@ sub get_student_data_from_performance_ca } foreach my $row (@{$sth->fetchall_arrayref}) { $rows_retrieved++; - my ($symb,$part,$solved,$tries,$awarded,$award,$awarddetail,$time,$weight) = + my ($symb,$part,$solved,$tries,$awarded,$award,$awarddetail,$time) = (@$row); my $base = 'resource.'.$part; $studentdata->{$symb}->{$base.'.solved'} = $solved; @@ -1077,7 +1069,9 @@ sub get_student_data_from_performance_ca $studentdata->{$symb}->{$base.'.award'} = $award; $studentdata->{$symb}->{$base.'.awarddetail'} = $awarddetail; $studentdata->{$symb}->{'timestamp'} = $time if (defined($time) && $time ne ''); - $studentdata->{$symb}->{'resource.'.$part.'.weight'}=$weight; + } + if (defined($symb) && $symb ne '') { + $studentdata = $studentdata->{$symb}; } return $studentdata; } @@ -1159,6 +1153,47 @@ the students you are concerned with prio Inputs: $students, $symb, $part, $courseid +=over 4 + +=item $students is an array of hash references. +Each hash must contain at least the 'username' and 'domain' of a student. + +=item $symb is the symb for the problem. + +=item $part is the part id you need statistics for + +=item $courseid is the course id, of course! + +=back + +Outputs: See the code for up to date information. A hash reference is +returned. The hash has the following keys defined: + +=over 4 + +=item num_students The number of students attempting the problem + +=item tries The total number of tries for the students + +=item max_tries The maximum number of tries taken + +=item mean_tries The average number of tries + +=item num_solved The number of students able to solve the problem + +=item num_override The number of students whose answer is 'correct_by_override' + +=item deg_of_diff The degree of difficulty of the problem + +=item std_tries The standard deviation of the number of tries + +=item skew_tries The skew of the number of tries + +=item per_wrong The number of students attempting the problem who were not +able to answer it correctly. + +=back + =cut ################################################ @@ -1172,12 +1207,8 @@ sub get_problem_statistics { my $part_id = &get_part_id($part); my $stats_table = $courseid.'_problem_stats'; # - &Apache::lonnet::logthis('symb id = '.$symb_id); - &Apache::lonnet::logthis('part id = '.$part_id); - my $dbh = &Apache::lonmysql::get_dbh(); return undef if (! defined($dbh)); - &Apache::lonnet::logthis('dbh is defined'); # # A) Number of Students attempting problem # B) Total number of tries of students attempting problem @@ -1195,6 +1226,14 @@ sub get_problem_statistics { 'CREATE TEMPORARY TABLE '.$stats_table. ' SELECT student_id,solved,award,tries FROM '.$performance_table. ' WHERE symb_id='.$symb_id.' AND part_id='.$part_id; + if (defined($students)) { + $request .= ' AND ('. + join(' OR ', map {'student_id='. + &get_student_id($_->{'username'}, + $_->{'domain'}) + } @$students + ).')'; + } # &Apache::lonnet::logthis($request); $dbh->do($request); my ($num,$tries,$mod,$mean,$STD) = &execute_SQL_request @@ -1215,17 +1254,28 @@ sub get_problem_statistics { $solved = 0 if (! defined($solved)); # my $DegOfDiff = 'nan'; - $DegOfDiff = 1-($Solved + $solved)/$tries if ($tries>0); + $DegOfDiff = 1-($Solved)/$tries if ($tries>0); my $SKEW = 'nan'; + my $wrongpercent = 0; if ($num > 0) { ($SKEW) = &execute_SQL_request($dbh,'SELECT SQRT(SUM('. 'POWER(tries - '.$STD.',3)'. '))/'.$num.' FROM '.$stats_table); + $wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10; } # $dbh->do('DROP TABLE '.$stats_table); # May return an error - return ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD,$SKEW); + return { num_students => $num, + tries => $tries, + max_tries => $mod, + mean_tries => $mean, + std_tries => $STD, + skew_tries => $SKEW, + num_solved => $Solved, + num_override => $solved, + per_wrong => $wrongpercent, + deg_of_diff => $DegOfDiff } } sub execute_SQL_request {