Diff for /loncom/interface/statistics/lonproblemanalysis.pm between versions 1.136 and 1.147

version 1.136, 2009/02/04 13:21:54 version 1.147, 2020/11/10 19:28:32
Line 31  use Apache::lonnet; Line 31  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::loncoursedata();  use Apache::loncoursedata();
   use Apache::lonquickgrades();
 use Apache::lonstatistics;  use Apache::lonstatistics;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonstathelpers();  use Apache::lonstathelpers();
Line 73  sub BuildProblemAnalysisPage { Line 74  sub BuildProblemAnalysisPage {
     #      #
     &Apache::lonstatistics::PrepareClasslist();      &Apache::lonstatistics::PrepareClasslist();
     #      #
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Detailed Problem Analysis'));
       &Apache::lonquickgrades::startGradeScreen($r,'statistics');
   
     $r->print(&CreateInterface());      $r->print(&CreateInterface());
     #      #
     my @Students = @Apache::lonstatistics::Students;      my @Students = @Apache::lonstatistics::Students;
Line 88  sub BuildProblemAnalysisPage { Line 92  sub BuildProblemAnalysisPage {
         &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status');          &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status');
     $r->rflush();      $r->rflush();
     #      #
     my $problem_types = '(option|radiobutton|numerical)';      my $problem_types = &analyzable_types();
     if (exists($env{'form.problemchoice'}) &&       if (exists($env{'form.problemchoice'}) && 
         ! exists($env{'form.SelectAnother'})) {          ! exists($env{'form.SelectAnother'})) {
         foreach my $button (@SubmitButtons) {          foreach my $button (@SubmitButtons) {
Line 114  sub BuildProblemAnalysisPage { Line 118  sub BuildProblemAnalysisPage {
         $r->rflush();          $r->rflush();
         #          #
         # Determine which problem we are to analyze          # Determine which problem we are to analyze
         my $current_problem = &Apache::lonstathelpers::get_target_from_id          my ($navmap,$current_problem) = &get_current_problem(); # need to retrieve $navmap
             ($env{'form.problemchoice'});                                                                  # to support $resource->* calls
         #                                                                  # for src and compTitle (below)
         my ($navmap,$prev,$curr,$next) =   
             &Apache::lonstathelpers::get_prev_curr_next($current_problem,  
                                                         $problem_types,  
                                                         'response',  
                                                         );  
         if (exists($env{'form.PrevProblemAnalysis'}) && defined($prev)) {  
             $current_problem = $prev;  
         } elsif (exists($env{'form.NextProblemAnalysis'}) && defined($next)) {  
             $current_problem = $next;  
         } else {  
             $current_problem = $curr;  
         }  
         #          #
         # Store the current problem choice and send it out in the form          # Store the current problem choice and send it out in the form
         $env{'form.problemchoice'} =           $env{'form.problemchoice'} = 
Line 142  sub BuildProblemAnalysisPage { Line 134  sub BuildProblemAnalysisPage {
             my $resource = $current_problem->{'resource'};              my $resource = $current_problem->{'resource'};
             $r->print('<h1>'.$resource->compTitle.'</h1>');              $r->print('<h1>'.$resource->compTitle.'</h1>');
             $r->print('<h3>'.$resource->src.'</h3>');              $r->print('<h3>'.$resource->src.'</h3>');
             $r->print('<h4>'.&Apache::lonstatistics::section_and_enrollment_description().'</h4>');              $r->print('<p>'.&Apache::lonstatistics::section_and_enrollment_description().'</p>');
             if ($env{'form.show_prob'} eq 'true') {              if ($env{'form.show_prob'} eq 'true') {
                 $r->print('<hr />'                  $r->print('<hr />'
                          .&Apache::lonstathelpers::render_resource($resource)                           .&Apache::lonstathelpers::render_resource($resource)
Line 189  sub BuildProblemAnalysisPage { Line 181  sub BuildProblemAnalysisPage {
     }      }
 }  }
   
   sub analyzable_types {
       return '(option|radiobutton|numerical)';
   }
   
   sub get_current_problem {
       my ($problem_types) = @_;
       my $current_problem = &Apache::lonstathelpers::get_target_from_id
           ($env{'form.problemchoice'});
       my ($navmap,$prev,$curr,$next) =
           &Apache::lonstathelpers::get_prev_curr_next($current_problem,
                                                       $problem_types,
                                                       'response');
       if (exists($env{'form.PrevProblemAnalysis'}) && ($prev ne '')) {
           $current_problem = $prev;
       } elsif (exists($env{'form.NextProblemAnalysis'}) && ($next ne '')) {
           $current_problem = $next;
       } else {
           $current_problem = $curr;
       }
       return ($navmap,$current_problem);
   }
   
 #########################################################  #########################################################
 #########################################################  #########################################################
 ##  ##
Line 396  sub numerical_plot_percent { Line 410  sub numerical_plot_percent {
         if ($max <$_) { $max = $_; last; }          if ($max <$_) { $max = $_; last; }
     }      }
     #      #
     my $title = &mt('Percent Difference');      my %lt = &Apache::lonlocal::texthash(
                    'title'  => 'Percent Difference',
                    'xlabel' => 'Percent Difference from Correct',
                    'ylabel' => 'Percent of Answers');
     my @labels = (1..scalar(@bins)-1);      my @labels = (1..scalar(@bins)-1);
     my $graph = &Apache::loncommon::DrawBarGraph      my $graph = &Apache::loncommon::DrawBarGraph
         ($title,'Percent Difference from Correct','Percent of Answers',          ($lt{'title'},$lt{'xlabel'},$lt{'ylabel'},
          $max,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect,           $max,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect,
          {xskip=>1});           {xskip=>1});
     #      #
Line 469  sub numerical_plot_differences { Line 486  sub numerical_plot_differences {
         if ($max <$_) { $max = $_; last; }          if ($max <$_) { $max = $_; last; }
     }      }
     #      #
     my $title = &mt('Difference between submission and correct');      my %lt = &Apache::lonlocal::texthash(
                    'title'  => 'Difference between submission and correct',
                    'xlabel' => 'Difference from Correct',
                    'ylabel' => 'Percent of Answers');
     my @labels = (1..scalar(@bins)-1);      my @labels = (1..scalar(@bins)-1);
     my $graph = &Apache::loncommon::DrawBarGraph      my $graph = &Apache::loncommon::DrawBarGraph
         ($title,'Difference from Correct','Percent of Answers',          ($lt{'title'},$lt{'xlabel'},$lt{'ylabel'},
          $max,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect,           $max,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect,
          {xskip=>1});           {xskip=>1});
     #      #
Line 626  sub numerical_determine_answers { Line 646  sub numerical_determine_answers {
     my ($r,$resource,$partid,$respid,$students)=@_;      my ($r,$resource,$partid,$respid,$students)=@_;
     my $c = $r->connection();      my $c = $r->connection();
     #      #
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin      my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,scalar(@$students));
         ($r,'Student Answer Compilation Status',  
          'Student Answer Compilation Progress', scalar(@$students),  
          'inline',undef,'Statistics','stats_status');  
     #      #
     # Read in the cache (if it exists) before we start timing things.      # Read in the cache (if it exists) before we start timing things.
     &Apache::lonstathelpers::ensure_proper_cache($resource->{'symb'});      &Apache::lonstathelpers::ensure_proper_cache($resource->{'symb'});
Line 663  sub numerical_determine_answers { Line 680  sub numerical_determine_answers {
         }          }
         $answers{$correct->{$sname.':'.$sdom}{'answer'}}++;          $answers{$correct->{$sname.':'.$sdom}{'answer'}}++;
         &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,          &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
                                                  &mt('last student'));                                                       'last student');
     }      }
     &Apache::lonstathelpers::write_analysis_cache();      &Apache::lonstathelpers::write_analysis_cache();
     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);      &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
Line 857  sub radio_response_analysis { Line 874  sub radio_response_analysis {
             $no_data_text,@extra_data);              $no_data_text,@extra_data);
         if ($env{'form.AnalyzeOver'} eq 'tries') {          if ($env{'form.AnalyzeOver'} eq 'tries') {
             $restriction_function = sub {($_[0]->{'tries'} == $plot_num?1:0)};              $restriction_function = sub {($_[0]->{'tries'} == $plot_num?1:0)};
             $correct_foil_title = 'Attempt '.$plot_num;              $correct_foil_title = &mt('Attempt [_1]',$plot_num);
             $incorrect_foil_title = 'Attempt '.$plot_num;              $incorrect_foil_title = &mt('Attempt [_1]',$plot_num);
             $pre_graph_text =               $pre_graph_text = 
                 'Attempt [_1], [_2] submissions, [_3] correct, [_4] incorrect';                  'Attempt [_1], [_2] submissions, [_3] correct, [_4] incorrect';
             $post_graph_text = '';              $post_graph_text = '';
Line 916  sub radio_response_analysis { Line 933  sub radio_response_analysis {
         # Concept Plot          # Concept Plot
         my $concept_plot = '';          my $concept_plot = '';
         if (scalar(@$concepts) > 1) {          if (scalar(@$concepts) > 1) {
               my $title = &mt('Correct Concepts');
             $concept_plot = &RR_concept_plot($concepts,$foil_choice_data,              $concept_plot = &RR_concept_plot($concepts,$foil_choice_data,
                                              'Correct Concepts');                                               $title);
         }          }
         # % Choosing plot          # % Choosing plot
         my $choice_plot = &RR_create_percent_selected_plot          my $choice_plot = &RR_create_percent_selected_plot
Line 1032  sub RR_concept_plot { Line 1050  sub RR_concept_plot {
     for (my $i=0;$i<=$#correct;$i++) {       for (my $i=0;$i<=$#correct;$i++) { 
         $correct[$i] = sprintf('%0f',$correct[$i]/$total*100);          $correct[$i] = sprintf('%0f',$correct[$i]/$total*100);
     }      }
     my $xlabel = 'concept';      my $xlabel = &mt('concept');
       my $ylabel = &mt('Percent Choosing');
     my $plot=  &Apache::loncommon::DrawBarGraph($title,      my $plot=  &Apache::loncommon::DrawBarGraph($title,
                                                 $xlabel,                                                  $xlabel,
                                                 'Percent Choosing',                                                  $ylabel,
                                                 100,                                                  100,
                                                 ['#33ff00','#ff3300'],                                                  ['#33ff00','#ff3300'],
                                                 undef,                                                  undef,
Line 1101  sub RR_create_percent_selected_plot { Line 1120  sub RR_create_percent_selected_plot {
         @labels = (1 .. scalar(@correct));          @labels = (1 .. scalar(@correct));
     }      }
     #      #
     my $xlabel = 'foil chosen';      my $xlabel = &mt('foil chosen');
       my $ylabel = &mt('Percent Choosing');
     my $plot=  &Apache::loncommon::DrawBarGraph($title,      my $plot=  &Apache::loncommon::DrawBarGraph($title,
                                                 $xlabel,                                                  $xlabel,
                                                 'Percent Choosing',                                                  $ylabel,
                                                 100,                                                  100,
                                                 ['#33ff00','#ff3300'],                                                  ['#33ff00','#ff3300'],
                                                 \@labels,                                                  \@labels,
Line 1165  sub RR_create_stacked_selection_plot { Line 1185  sub RR_create_stacked_selection_plot {
         push(@empty_row,0);          push(@empty_row,0);
     }      }
     #      #
       my $xlabel = &mt('Correct Foil');
       my $ylabel = &mt('foils chosen Incorrectly');
     my $graph = &Apache::loncommon::DrawBarGraph      my $graph = &Apache::loncommon::DrawBarGraph
         ($title,'Correct Foil','foils chosen Incorrectly',          ($title,$xlabel,$ylabel,
          100,$plotcolors,\@labels,\@empty_row,@dataset);           100,$plotcolors,\@labels,\@empty_row,@dataset);
     return ($graph,\%count_per_foil);      return ($graph,\%count_per_foil);
 }  }
Line 1250  sub OptionResponseAnalysis { Line 1272  sub OptionResponseAnalysis {
             $r->print($analysis_html);              $r->print($analysis_html);
             $r->rflush();              $r->rflush();
         } else {          } else {
             $r->print('div class="LC_warning"'              $r->print('<div class="LC_warning">'
                      .&mt('The analysis you have selected is not supported at this time.')                       .&mt('The analysis you have selected is not supported at this time.')
                      .'</div>'                       .'</div>'
             );              );
Line 1362  sub OR_tries_analysis { Line 1384  sub OR_tries_analysis {
                 }                  }
             }              }
             #              #
               my %lt = &Apache::lonlocal::texthash(
                            'title'  => 'Correct Concepts',
                            'xlabel' => 'Concept Number',
                            'ylabel' => 'Percent Correct');
             $concept_graph = &Apache::loncommon::DrawBarGraph              $concept_graph = &Apache::loncommon::DrawBarGraph
                 ('Correct Concepts','Concept Number','Percent Correct',                  ($lt{'title'},$lt{'xlabel'},$lt{'ylabel'},
                  100,$plotcolors,undef,\@concept_plot_data,{xskip=>1});                   100,$plotcolors,undef,\@concept_plot_data,{xskip=>1});
         }          }
         #          #
Line 1401  sub OR_tries_analysis { Line 1427  sub OR_tries_analysis {
             push(@Labels,'');              push(@Labels,'');
         }          }
         #          #
          my %lt = &Apache::lonlocal::texthash(
                       'title'  => 'Correct Statements',
                       'xlabel' => 'Statement',
                       'ylabel' => '% Answered Correct');
         my $correct_graph = &Apache::loncommon::DrawBarGraph          my $correct_graph = &Apache::loncommon::DrawBarGraph
             ('Correct Statements','Statement','% Answered Correct',              ($lt{'title'},$lt{'xlabel'},$lt{'ylabel'},
              100,$plotcolors,\@Labels,$Datasets[0],{xskip=>1});               100,$plotcolors,\@Labels,$Datasets[0],{xskip=>1});
                   
         #          #
Line 1413  sub OR_tries_analysis { Line 1443  sub OR_tries_analysis {
         }          }
         my $count = $response_data{'_total'}->[$try] -           my $count = $response_data{'_total'}->[$try] - 
                                            $response_data{'_correct'}->[$try];                                             $response_data{'_correct'}->[$try];
           %lt = &Apache::lonlocal::texthash(
                     'title'  => 'Incorrect Statements',
                     'xlabel' => 'Statement',
                     'ylabel' => '% Chosen Incorrectly');
         my $incorrect_graph = &Apache::loncommon::DrawBarGraph          my $incorrect_graph = &Apache::loncommon::DrawBarGraph
             ('Incorrect Statements','Statement','% Chosen Incorrectly',              ($lt{'title'},$lt{'xlabel'},$lt{'ylabel'},
              100,$plotcolors,\@Labels,@Datasets,{xskip=>1});               100,$plotcolors,\@Labels,@Datasets,{xskip=>1});
         $analysis_html.=           $analysis_html.= 
             '<tr><td colspan="4" align="center">'.              '<tr><td colspan="4" align="center">'.
Line 1476  sub OR_time_analysis { Line 1510  sub OR_time_analysis {
     if (defined($Concepts)) { $num_concepts = scalar(@$Concepts); }      if (defined($Concepts)) { $num_concepts = scalar(@$Concepts); }
     #      #
     if ($num_concepts < 2) {      if ($num_concepts < 2) {
         $table = '<h3>'.          $table = '<p class="LC_info">'.
             &mt('Not enough data for concept analysis.  '.                   &mt('Not enough data for concept analysis.'.
                 'Performing Foil Analysis').                       ' Performing Foil Analysis instead.').
                 '</h3>'.$table;                   '</p>'.
                    $table;
     }      }
     #      #
     my $num_plots = $env{'form.NumPlots'};      my $num_plots = $env{'form.NumPlots'};
Line 1536  sub OR_time_analysis { Line 1571  sub OR_time_analysis {
         $correct |= 0;          $correct |= 0;
         ##          ##
         $table .= '<tr><td colspan="4" align="center"><font size="+1">'.          $table .= '<tr><td colspan="4" align="center"><font size="+1">'.
             &mt('[_1] submissions from [_2] students, [_3] correct, [_4] incorrect',              &mt('[quant,_1,submission,submissions,No submissions] from [quant,_2,student], [_3] correct, [_4] incorrect',
                 $data_count,$student_count,$correct,$data_count-$correct).                  $data_count,$student_count,$correct,$data_count-$correct).
                 '</font></td></tr>'.$/;                  '</font></td></tr>'.$/;
         my $concept_correct_plot = '';          my $concept_correct_plot = '';
Line 1608  sub OR_Foil_Time_Analysis { Line 1643  sub OR_Foil_Time_Analysis {
     }      }
     #      #
     # Create the plot      # Create the plot
     my $correct_plot = &Apache::loncommon::DrawBarGraph('Correct Statements',      my %lt = &Apache::lonlocal::texthash(
                                                         'Statement Number',                   'title'  => 'Correct Statements',
                                                         'Percent Correct',                   'xlabel' => 'Statement Number',
                    'ylabel' => 'Percent Correct');
       my $correct_plot = &Apache::loncommon::DrawBarGraph($lt{'title'},
                                                           $lt{'xlabel'},
                                                           $lt{'ylabel'},
                                                         100,                                                          100,
                                                         $plotcolors,                                                          $plotcolors,
                                                         undef,                                                          undef,
Line 1619  sub OR_Foil_Time_Analysis { Line 1658  sub OR_Foil_Time_Analysis {
     for (my $j=0; $j< scalar(@{$plotdata[0]});$j++) {      for (my $j=0; $j< scalar(@{$plotdata[0]});$j++) {
         $plotdata[0]->[$j]=0;          $plotdata[0]->[$j]=0;
     }      }
       %lt = &Apache::lonlocal::texthash(
                 'title'  => 'Incorrect Statements',
                 'xlabel' => 'Statement Number',
                 'ylabel' => 'Incorrect Option Choice');
     my $incorrect_plot =       my $incorrect_plot = 
         &Apache::loncommon::DrawBarGraph('Incorrect Statements',          &Apache::loncommon::DrawBarGraph($lt{'title'},
                                          'Statement Number',                                           $lt{'xlabel'},
                                          'Incorrect Option Choice',                                           $lt{'ylabel'},
                                          100,                                           100,
                                          $plotcolors,                                           $plotcolors,
                                          undef,                                           undef,
Line 1651  sub OR_Concept_Time_Analysis { Line 1694  sub OR_Concept_Time_Analysis {
     }      }
     #      #
     # Create the plot      # Create the plot
     return &Apache::loncommon::DrawBarGraph('Correct Concepts',      my %lt = &Apache::lonlocal::texthash(
                                             'Concept Number',                   'title'  => 'Correct Concepts',
                                             'Percent Correct',                   'xlabel' => 'Concept Number',
                    'ylabel' => 'Percent Correct');
       return &Apache::loncommon::DrawBarGraph($lt{'title'},
                                               $lt{'xlabel'},
                                               $lt{'ylabel'},
                                             100,                                              100,
                                             $plotcolors,                                              $plotcolors,
                                             undef,                                              undef,
Line 1875  sub CreateInterface { Line 1922  sub CreateInterface {
     ##      ##
     ## Build the menu      ## Build the menu
     my $Str = '';      my $Str = '';
     $Str .= &Apache::lonhtmlcommon::breadcrumbs('Detailed Problem Analysis');  
     $Str .= '<p>';      $Str .= '<p>';
     $Str .= &Apache::loncommon::start_data_table();      $Str .= &Apache::loncommon::start_data_table();
     $Str .= &Apache::loncommon::start_data_table_header_row();      $Str .= &Apache::loncommon::start_data_table_header_row();
Line 1901  sub CreateInterface { Line 1947  sub CreateInterface {
     #      #
     ##      ##
     ##      ##
     $Str .= '<td align="right" valign="top">';      $Str .= '<td valign="top">';
     ##      ##
     my $showprob_checkbox =       my $showprob_checkbox = 
         '<input type="checkbox" name="show_prob" value="true" ';          '<input type="checkbox" name="show_prob" value="true"';
     if ($env{'form.show_prob'} eq 'true') {      if ($env{'form.show_prob'} eq 'true') {
         $showprob_checkbox .= 'checked="checked" ';          $showprob_checkbox .= ' checked="checked"';
     }      }
     $showprob_checkbox.= ' />';      $showprob_checkbox.= ' />';
     $Str.= '<span class="LC_nobreak"><label>'.      $Str.= '<span class="LC_nobreak"><label>'.
         &mt('Show problem [_1]',$showprob_checkbox).          $showprob_checkbox.' '.&mt('Show problem').
         '</label></span><br />';          '</label></span><br />';
     ##      ##
     my $analyze_selector = '<select name="AnalyzeOver" >';      my $analyze_selector = '<select name="AnalyzeOver">';
     $analyze_selector .= '<option value="tries" ';      $analyze_selector .= '<option value="tries"';
     if (! exists($env{'form.AnalyzeOver'}) ||       if (! exists($env{'form.AnalyzeOver'}) || 
         $env{'form.AnalyzeOver'} eq 'tries'){          $env{'form.AnalyzeOver'} eq 'tries'){
         # Default to tries          # Default to tries
         $analyze_selector .= ' selected="selected" ';          $analyze_selector .= ' selected="selected"';
     }      }
     $analyze_selector .= '>'.&mt('Tries').'</option>';      $analyze_selector .= '>'.&mt('Tries').'</option>';
     $analyze_selector .= '<option value="time" ';      $analyze_selector .= '<option value="time"';
     $analyze_selector .= ' selected ' if ($env{'form.AnalyzeOver'} eq 'time');      $analyze_selector .= ' selected="selected"' if ($env{'form.AnalyzeOver'} eq 'time');
     $analyze_selector .= '>'.&mt('Time').'</option>';      $analyze_selector .= '>'.&mt('Time').'</option>';
     $analyze_selector .= '</select>';      $analyze_selector .= '</select>';
     $Str .= '<span class="LC_nobreak"><label>'.      $Str .= '<span class="LC_nobreak"><label>'.

Removed from v.1.136  
changed lines
  Added in v.1.147


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>