--- loncom/interface/statistics/lonproblemanalysis.pm 2003/10/14 20:20:40 1.36 +++ loncom/interface/statistics/lonproblemanalysis.pm 2003/10/14 21:58:25 1.37 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # -# $Id: lonproblemanalysis.pm,v 1.36 2003/10/14 20:20:40 matthew Exp $ +# $Id: lonproblemanalysis.pm,v 1.37 2003/10/14 21:58:25 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -35,6 +35,7 @@ use Apache::lonhtmlcommon(); use Apache::loncoursedata(); use Apache::lonstatistics; use Apache::lonlocal; +use HTML::Entities(); sub BuildProblemAnalysisPage { my ($r,$c)=@_; @@ -385,6 +386,7 @@ sub time_analysis { my ($table,$Foils,$Concepts) = &build_foil_index($ORdata); my $num_data = scalar(@$PerformanceData)-1; my $percent = sprintf('%2f',100/$num_plots); + $table .= "\n"; for (my $i=0;$i<$num_plots;$i++) { my $starttime = &Apache::lonhtmlcommon::get_date_from_form ('startdate_'.$i); @@ -409,27 +411,31 @@ sub time_analysis { last if ($PerformanceData->[$j]->[2] > $endtime); } $end_index = $j; - $plottitle = 'Tries plot '.($i+1); + $plottitle = $ENV{'form.plottitle_'.$i}; } ($plothtml,$starttime,$endtime,$data) = &analyze_option_data_by_time($PerformanceData, $begin_index,$end_index, $plottitle, - @$Foils); + @$Concepts); my $startdateform = &Apache::lonhtmlcommon::date_setter ('Statistics','startdate_'.$i,$starttime); my $enddateform = &Apache::lonhtmlcommon::date_setter ('Statistics','enddate_'.$i,$endtime); - $plothtml.= "
\n". - "Start Time: "." ".$startdateform."
\n". - "End Time  : "." ".$enddateform."
\n"; - $table.=$plothtml; + $table.="\n"; } + $table .="
".$plothtml.''. + "Start Time:  ".$startdateform."
". + "End Time  : "." ".$enddateform."
". + 'Plot Title  :'. + '
'. + "
\n"; return $table; } sub analyze_option_data_by_time { - my ($PerformanceData,$begin_index,$end_index,$description,@Foils) = @_; + my ($PerformanceData,$begin_index,$end_index,$description,@Concepts) = @_; my %TimeData; # # Get the start and end times for this segment of the plot @@ -456,26 +462,56 @@ sub analyze_option_data_by_time { # Compute the total and percent correct my @Plotdata1; my @Plotdata2; - foreach my $foilid (@Foils) { - if (! exists($TimeData{$foilid}->{'correct'})) { - $TimeData{$foilid}->{'correct'} = 0; + foreach my $concept (@Concepts) { + my ($correct,$incorrect,$total); + foreach my $foilid (@{$concept->{'foils'}}) { + if (! exists($TimeData{$foilid}->{'correct'})) { + $TimeData{$foilid}->{'correct'} = 0; + } + if (! exists($TimeData{$foilid}->{'incorrect'})) { + $incorrect = 0; + $TimeData{$foilid}->{'incorrect'} = 0; + } + $correct += $TimeData{$foilid}->{'correct'}; + $incorrect += $TimeData{$foilid}->{'incorrect'}; + $total += $TimeData{$foilid}->{'correct'}+ + $TimeData{$foilid}->{'incorrect'}; + $TimeData{$foilid}->{'total'} = $TimeData{$foilid}->{'correct'} + + $TimeData{$foilid}->{'incorrect'}; + my $percent; + if ($TimeData{$foilid}->{'total'} == 0) { + $percent = 0; + } else { + $percent = $TimeData{$foilid}->{'correct'} / + $TimeData{$foilid}->{'total'}; + } + $TimeData{$foilid}->{'percent_corr'} = 100 * $percent; + if ($ENV{'form.AnalyzeAs'} eq 'Foils') { + push (@Plotdata1, $TimeData{$foilid}->{'percent_corr'}); + push (@Plotdata2,100-$TimeData{$foilid}->{'percent_corr'}); + } } - if (! exists($TimeData{$foilid}->{'incorrect'})) { - $TimeData{$foilid}->{'incorrect'} = 0; + if ($ENV{'form.AnalyzeAs'} ne 'Foils') { + if ($total == 0) { + push (@Plotdata1,0); + push (@Plotdata2,100); + } else { + push (@Plotdata1,100 * $correct / $total); + push (@Plotdata2,100 * (1-$correct / $total)); + } } - $TimeData{$foilid}->{'total'} = $TimeData{$foilid}->{'correct'} + - $TimeData{$foilid}->{'incorrect'}; - $TimeData{$foilid}->{'percent_corr'} = 100 * - $TimeData{$foilid}->{'correct'} / - $TimeData{$foilid}->{'total'}; - push (@Plotdata1, $TimeData{$foilid}->{'percent_corr'}); - push (@Plotdata2,100-$TimeData{$foilid}->{'percent_corr'}); } # # Create the plot + my $xlabel; + if ($ENV{'form.AnalyzeAs'} eq 'Foils') { + $xlabel = 'Foil Number'; + } else { + $xlabel = 'Concept Number'; + } my $graphlink = &Apache::loncommon::DrawGraph ($description,#'Time Interval Analysis', - 'Foil Number', + $xlabel, 'Percent Correct / Incorrect', 100, \@Plotdata1,\@Plotdata2); @@ -592,7 +628,6 @@ sub OptionResponseProblemSelector { next if ($seq->{'num_assess'}<1); my $seq_str = ''; foreach my $res (@{$seq->{'contents'}}) { -# &Apache::lonnet::logthis('checking '.$res->{'title'}); next if ($res->{'type'} ne 'assessment'); foreach my $part (@{$res->{'parts'}}) { my $partdata = $res->{'partdata'}->{$part}; @@ -657,18 +692,10 @@ sub get_resource_from_symb { sub get_problem_data { my ($url) = @_; -# my $Answ=&Apache::lonnet::ssi($URI,('grade_target' => 'analyze', -# 'grade_username' => $sname, -# 'grade_domain' => $sdom, -# 'grade_courseid' => $cid, -# 'grade_symb' => $symb)); my $Answ=&Apache::lonnet::ssi($url,('grade_target' => 'analyze')); (my $garbage,$Answ)=split(/_HASH_REF__/,$Answ,2); my %Answer; %Answer=&Apache::lonnet::str2hash($Answ); -# &Apache::lonnet::logthis('keys of %Answer = '.join(', ',(keys(%Answer)))); -# &Apache::lonnet::logthis('$Answer{parts} = '. -# join(', ',@{$Answer{'parts'}})); my %Partdata; foreach my $part (@{$Answer{'parts'}}) { while (my($key,$value) = each(%Answer)) { @@ -677,7 +704,6 @@ sub get_problem_data { if (ref($value) eq 'ARRAY') { if ($key eq 'options') { $Partdata{$part}->{'Options'}=$value; - &Apache::lonnet::logthis('Options = '.join(', ',@$value)); } elsif ($key eq 'concepts') { $Partdata{$part}->{'Concepts'}=$value; } elsif ($key =~ /^concept\.(.*)$/) { @@ -687,8 +713,6 @@ sub get_problem_data { $concept; } } - # &Apache::lonnet::logthis($part.' '.$key.' (array) = '. - # join(', ',@$value)); } else { $value =~ s/^\s*//g; $value =~ s/\s*$//g; @@ -700,30 +724,9 @@ sub get_problem_data { my $foil = $1; $Partdata{$part}->{'Foils'}->{$foil}->{'value'}=$value; } - # &Apache::lonnet::logthis($part.' '.$key.' = '.$value); } } } - -# 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); -# foreach my $concept (@{$Answer{"$parts.concepts"}}) { -# foreach my $foil (@{$Answer{"$parts.concept.$concept"}}) { -# $foil_to_concept{$foil} = $concept; -# #$ConceptData{$foil} = $Answer{"$parts.foil.value.$foil"}; -# } -# } -# return $symb; return %Partdata; }