Diff for /loncom/interface/statistics/lonproblemstatistics.pm between versions 1.106 and 1.119

version 1.106, 2006/02/05 19:10:28 version 1.119, 2011/01/17 00:19:41
Line 52  package Apache::lonproblemstatistics; Line 52  package Apache::lonproblemstatistics;
 use strict;  use strict;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonquickgrades();
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 use Apache::loncoursedata;  use Apache::loncoursedata;
 use Apache::lonstatistics;  use Apache::lonstatistics;
Line 60  use Apache::lonlocal; Line 61  use Apache::lonlocal;
 use Spreadsheet::WriteExcel;  use Spreadsheet::WriteExcel;
 use Apache::lonstathelpers();  use Apache::lonstathelpers();
 use Time::HiRes;  use Time::HiRes;
   use LONCAPA;
    
   
 my @StatsArray;  my @StatsArray;
 my %SeqStat;    # keys are symbs, values are hash refs  my %SeqStat;    # keys are symbs, values are hash refs
Line 121  my @Fields = ( Line 124  my @Fields = (
              align  => 'left',               align  => 'left',
              color  => '#FFFFE6',               color  => '#FFFFE6',
              special  => 'link',               special  => 'link',
              sortable => 'yes',                sortable => 'yes',
              selectable => 'no',               selectable => 'no',
              defaultselected => 'yes',               defaultselected => 'yes',
            },             },
            { name   => 'part',              { name   => 'part',
              title  => 'Part',               title  => 'Part',
              align  => 'left',               align  => 'left',
              color  => '#FFFFE6',               color  => '#FFFFE6',
Line 373  my @SeqFields = ( Line 376  my @SeqFields = (
              align  => 'left',               align  => 'left',
              color  => '#FFFFE6',               color  => '#FFFFE6',
              special  => 'no',               special  => 'no',
              sortable => 'no',                sortable => 'no',
              selectable => 'yes',               selectable => 'yes',
              defaultselected => 'no',               defaultselected => 'no',
            },             },
Line 508  my @SeqFields = ( Line 511  my @SeqFields = (
              long_title => 'KR-21 reliability statistic',               long_title => 'KR-21 reliability statistic',
              selectable => 'yes',               selectable => 'yes',
              defaultselected => 'no',               defaultselected => 'no',
            },                        },
 );  );
   
 my %SelectedFields;  my %SelectedFields;
Line 575  sub parse_field_selection { Line 578  sub parse_field_selection {
 }  }
   
 sub field_selection_input {  sub field_selection_input {
     my $Str = '<select name="fieldselections" multiple size="5">'."\n";      my $Str = '<select name="fieldselections" multiple="multiple" size="5">'."\n";
     $Str .= '<option value="all">all</option>'."\n";      $Str .= '<option value="all">all</option>'."\n";
     foreach my $field (@Fields) {      foreach my $field (@Fields) {
         next if ($field->{'selectable'} ne 'yes');          next if ($field->{'selectable'} ne 'yes');
Line 608  sub CreateInterface { Line 611  sub CreateInterface {
     &parse_field_selection();      &parse_field_selection();
     #      #
     my $Str = '';      my $Str = '';
     $Str .= &Apache::lonhtmlcommon::breadcrumbs      $Str .= '<p>';
         (undef,'Overall Problem Statistics','Statistics_Overall_Key');      $Str .= &Apache::loncommon::start_data_table();
     $Str .= '<table cellspacing="5">'."\n";      $Str .= &Apache::loncommon::start_data_table_header_row();
     $Str .= '<tr>';      $Str .= '<th>'.&mt('Sections').'</th>';
     $Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>';      $Str .= '<th>'.&mt('Groups').'</th>';
     $Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>';      $Str .= '<th>'.&mt('Access Status').'</th>';
     $Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b></td>';      $Str .= '<th>'.&mt('Sequences and Folders').'</th>';
     $Str .= '<td align="center"><b>'.&mt('Statistics').'</b></td>';      $Str .= '<th>'.&mt('Statistics').'</th>';
     $Str .= '<td rowspan="2">'.      $Str .= '<th>'.&mt('Plot Graph').'</th>';
         &Apache::lonstathelpers::limit_by_time_form().'</td>';      $Str .= '<th>'.&mt('Time Period').'</th>';
     $Str .= '</tr>'."\n";      $Str .= &Apache::loncommon::end_data_table_header_row();
     #      #
     $Str .= '<tr><td align="center">'."\n";      $Str .= &Apache::loncommon::start_data_table_row();
       $Str .= '<td align="center" valign="top">'."\n";
     $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);      $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);
     $Str .= '</td><td align="center">';      $Str .= '</td><td align="center" valign="top">';
       $Str .= &Apache::lonstatistics::GroupSelect('Group','multiple',5);
       $Str .= '</td><td align="center" valign="top">';
     $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5);      $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5);
     $Str .= '</td><td align="center">';      $Str .= '</td><td align="center" valign="top">';
     #      #
     $Str .= &Apache::lonstatistics::map_select('Maps','multiple,all',5);      $Str .= &Apache::lonstatistics::map_select('Maps','multiple,all',5);
     $Str .= '</td><td>'.&field_selection_input();      $Str .= '</td><td align="center" valign="top">';
     $Str .= '</td></tr>'."\n";      $Str .= &field_selection_input();
     $Str .= '</table>'."\n";      $Str .= '</td><td align="center" valign="top">';
     #      $Str .= &plot_dropdown();
     $Str .= '<p>'.&mt('Status: [_1]',      $Str .= '</td>'."\n";
                          '<input type="text" '.      $Str .= '</td><td align="center" valign="top">';
                          'name="stats_status" size="60" value="" />'      $Str .= &Apache::lonstathelpers::limit_by_time_form();
                          ).      $Str .= '</td>'."\n";
                          '</nobr></p>';      $Str .=  &Apache::loncommon::end_data_table_row();
       $Str .= &Apache::loncommon::end_data_table();
       #
       $Str .= '<p><span class="LC_nobreak">'
              .&mt('Status: [_1]',
                       '<input type="text" name="stats_status"'
                      .' size="60" value="" readonly="readonly" />')
              .'</span></p>';
     #      #
       $Str .= '</p>';
     $Str .= '<input type="submit" name="GenerateStatistics" value="'.      $Str .= '<input type="submit" name="GenerateStatistics" value="'.
         &mt('Generate Statistics').'" />';          &mt('Generate Statistics').'" />';
     $Str .= '&nbsp;'x5;      $Str .= ('&nbsp;'x10);
     $Str .= 'Plot '.&plot_dropdown().('&nbsp;'x10);  
     #      #
     return $Str;      return $Str;
 }  }
Line 674  sub BuildProblemStatisticsPage { Line 687  sub BuildProblemStatisticsPage {
     my %Saveable_Parameters = ('Status' => 'scalar',      my %Saveable_Parameters = ('Status' => 'scalar',
                                'statsoutputmode' => 'scalar',                                 'statsoutputmode' => 'scalar',
                                'Section' => 'array',                                 'Section' => 'array',
                                  'Groups' => 'array',
                                'StudentData' => 'array',                                 'StudentData' => 'array',
                                'Maps' => 'array',                                 'Maps' => 'array',
                                'fieldselections'=> 'array');                                 'fieldselections'=> 'array');
Line 689  sub BuildProblemStatisticsPage { Line 703  sub BuildProblemStatisticsPage {
     undef(%SeqStat);      undef(%SeqStat);
     #      #
     # Finally let the user know we are here      # Finally let the user know we are here
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Overall Problem Statistics',
                                                   'Statistics_Overall_Key'));
       &Apache::lonquickgrades::startGradeScreen($r,'statistics');
   
     my $interface = &CreateInterface($r);      my $interface = &CreateInterface($r);
     $r->print($interface);      $r->print($interface);
     $r->print('<input type="hidden" name="sortby" value="'.$env{'form.sortby'}.      $r->print('<input type="hidden" name="sortby" value="'.$env{'form.sortby'}.
               '" />');                '" />');
     #      #
     my @CacheButtonHTML =       my @CacheButtonHTML =
         &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status');          &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status');
     my $Str;      my $Str;
     foreach my $html (@CacheButtonHTML) {      foreach my $html (@CacheButtonHTML) {
Line 703  sub BuildProblemStatisticsPage { Line 721  sub BuildProblemStatisticsPage {
     #      #
     $r->print($Str);      $r->print($Str);
     if (! exists($env{'form.firstrun'})) {      if (! exists($env{'form.firstrun'})) {
         $r->print('<h3>'.          $r->print('<p class="LC_info"><b>'.
                   &mt('Press "Generate Statistics" when you are ready.').                    &mt('Press "Generate Statistics" when you are ready.').
                   '</h3><p>'.                    '</b></p>'.
                     '<p class="LC_info">'.
                   &mt('It may take some time to update the student data '.                    &mt('It may take some time to update the student data '.
                       'for the first analysis.  Future analysis this session '.                        'for the first analysis. Future analysis this session '.
                       ' will not have this delay.').                        'will not have this delay.').
                   '</p>');                    '</p>');
  &clean_up();   &clean_up();
         return;          return;
Line 719  sub BuildProblemStatisticsPage { Line 738  sub BuildProblemStatisticsPage {
     # it does not slow things down noticably.      # it does not slow things down noticably.
     &Apache::loncoursedata::populate_weight_table();      &Apache::loncoursedata::populate_weight_table();
     #      #
     ($navmap,@sequences) =       ($navmap,@sequences) =
         &Apache::lonstatistics::selected_sequences_with_assessments();          &Apache::lonstatistics::selected_sequences_with_assessments();
     if (! ref($navmap)) {      if (! ref($navmap)) {
         $r->print('<h1>'.&mt('A course-wide error occured.').'</h1>'.          $r->print('<div class="LC_error">'.&mt('A course-wide error occurred.').'</div>'.
                   '<h3>'.$navmap.'</h3>');                    '<h3>'.$navmap.'</h3>');
  &clean_up();   &clean_up();
         return;          return;
Line 732  sub BuildProblemStatisticsPage { Line 751  sub BuildProblemStatisticsPage {
                   &Apache::lonstatistics::section_and_enrollment_description().                    &Apache::lonstatistics::section_and_enrollment_description().
                   '</h4>');                    '</h4>');
         &Excel_output($r);          &Excel_output($r);
     } else {       } else {
         $r->print('<input type="submit" name="Excel" value="'.          $r->print('<input type="submit" name="Excel" value="'.
                   &mt('Produce Excel Output').'" />'.'&nbsp;'x5);                    &mt('Produce Excel Output').'" />'.'&nbsp;'x5);
         $r->rflush();          $r->rflush();
Line 741  sub BuildProblemStatisticsPage { Line 760  sub BuildProblemStatisticsPage {
                   '</h4>');                    '</h4>');
         my $count = 0;          my $count = 0;
         foreach my $seq (@sequences) {          foreach my $seq (@sequences) {
             my @resources =               my @resources =
                 &Apache::lonstathelpers::get_resources($navmap,$seq);                  &Apache::lonstathelpers::get_resources($navmap,$seq);
             $count += scalar(@resources);              $count += scalar(@resources);
         }          }
Line 786  sub output_sequence_statistics { Line 805  sub output_sequence_statistics {
               '<table border="0" cellpadding="3">'."\n".                '<table border="0" cellpadding="3">'."\n".
               '<tr bgcolor="#FFFFE6">');                '<tr bgcolor="#FFFFE6">');
     $r->print(&sequence_html_header());      $r->print(&sequence_html_header());
     foreach my $seq (@sequences) {       foreach my $seq (@sequences) {
         last if ($c->aborted);          last if ($c->aborted);
         &compute_sequence_statistics($seq);          &compute_sequence_statistics($seq);
         $r->print(&sequence_html_output($seq));          $r->print(&sequence_html_output($seq));
Line 1009  sub make_single_stat_plot { Line 1028  sub make_single_stat_plot {
     }      }
     #      #
     # Build up the data sets to plot      # Build up the data sets to plot
     my @Labels;       my @Labels;
     my @Data;      my @Data;
     my $max = 1;      my $max = 1;
     foreach my $data (@StatsArray) {      foreach my $data (@StatsArray) {
Line 1049  sub degrees_plot { Line 1068  sub degrees_plot {
     my $plot = '';      my $plot = '';
     my $ymax = 0;      my $ymax = 0;
     my $ymin = 0;      my $ymin = 0;
     my @Disc; my @Diff; my @Labels;          my @Disc; my @Diff; my @Labels;
     foreach my $data (@StatsArray) {      foreach my $data (@StatsArray) {
         push(@Labels,$data->{'problem_num'});          push(@Labels,$data->{'problem_num'});
         my $disc = $data->{'deg_of_disc'};          my $disc = $data->{'deg_of_disc'};
Line 1139  sub degrees_plot { Line 1158  sub degrees_plot {
     </curve>      </curve>
 </gnuplot>  </gnuplot>
 END  END
     my $plotresult =       my $plotresult =
         '<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/;          '<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/;
     $r->print($plotresult);      $r->print($plotresult);
     return;      return;
Line 1224  sub tries_data_plot { Line 1243  sub tries_data_plot {
     </curve>      </curve>
 </gnuplot>  </gnuplot>
 END  END
     my $plotresult =       my $plotresult =
         '<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/;          '<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/;
     $r->print($plotresult);      $r->print($plotresult);
     return;      return;
Line 1310  sub Excel_output { Line 1329  sub Excel_output {
                         &Apache::lonstatistics::section_and_enrollment_description('plaintext'),                          &Apache::lonstatistics::section_and_enrollment_description('plaintext'),
                         $format->{'h3'});                          $format->{'h3'});
     $cols_output += scalar(&Apache::lonstatistics::get_selected_sections());      $cols_output += scalar(&Apache::lonstatistics::get_selected_sections());
       $cols_output += scalar(&Apache::lonstatistics::get_selected_groups());
     #      #
     # Time restrictions      # Time restrictions
     my $time_string;      my $time_string;
Line 1334  sub Excel_output { Line 1354  sub Excel_output {
     $excel_sheet->write($rows_output,$cols_output++,      $excel_sheet->write($rows_output,$cols_output++,
                         'Compiled on '.localtime(time));                          'Compiled on '.localtime(time));
     #      #
     $rows_output++;       $rows_output++;
     $cols_output=0;      $cols_output=0;
     ##      ##
     ## Sequence Statistics      ## Sequence Statistics
     ##       ##
     &write_headers($excel_sheet,$format,\$rows_output,\$cols_output,      &write_headers($excel_sheet,$format,\$rows_output,\$cols_output,
                    \@SeqFields);                     \@SeqFields);
     foreach my $seq (@sequences) {      foreach my $seq (@sequences) {
Line 1416  sub write_headers { Line 1436  sub write_headers {
     foreach my $field (@{$Fields}) {      foreach my $field (@{$Fields}) {
         next if ($field->{'selected'} ne 'yes');          next if ($field->{'selected'} ne 'yes');
         next if ($field->{'name'} eq 'problem_num');          next if ($field->{'name'} eq 'problem_num');
         # Use english for excel as I am not sure how well excel handles           # Use english for excel as I am not sure how well excel handles
         # other character sets....          # other character sets....
         $excel_sheet->write($$rows_output,$$cols_output,          $excel_sheet->write($$rows_output,$$cols_output,
                             $field->{'title'},                              $field->{'title'},
Line 1440  sub compute_statistics_on_sequence { Line 1460  sub compute_statistics_on_sequence {
     my @Data;      my @Data;
     foreach my $res (&Apache::lonstathelpers::get_resources($navmap,$seq)) {      foreach my $res (&Apache::lonstathelpers::get_resources($navmap,$seq)) {
         foreach my $part (@{$res->parts}) {          foreach my $part (@{$res->parts}) {
             next if ($res->is_survey($part));              next if (($res->is_survey($part)) || ($res->is_anonsurvey($part))) ;
             #              #
             # This is where all the work happens              # This is where all the work happens
             my $data = &get_statistics($seq,$res,$part,scalar(@StatsArray)+1);              my $data = &get_statistics($seq,$res,$part,scalar(@StatsArray)+1);
Line 1529  sub sort_data { Line 1549  sub sort_data {
   
 =item &get_statistics()  =item &get_statistics()
   
 Wrapper routine from the call to loncoursedata::get_problem_statistics.    Wrapper routine from the call to loncoursedata::get_problem_statistics.
 Calls lonstathelpers::get_time_limits() to limit the data set by time  Calls lonstathelpers::get_time_limits() to limit the data set by time
 and &compute_discrimination_factor  and &compute_discrimination_factor
   
 Inputs: $sequence, $resource, $part, $problem_num  Inputs: $sequence, $resource, $part, $problem_num
   
 Returns: Hash reference with statistics data from   Returns: Hash reference with statistics data from
 loncoursedata::get_problem_statistics.  loncoursedata::get_problem_statistics.
   
 =cut  =cut
Line 1551  sub get_statistics { Line 1571  sub get_statistics {
     #      #
     my $data = &Apache::loncoursedata::get_problem_statistics      my $data = &Apache::loncoursedata::get_problem_statistics
                         ([&Apache::lonstatistics::get_selected_sections()],                          ([&Apache::lonstatistics::get_selected_sections()],
                            [&Apache::lonstatistics::get_selected_groups()],
                          $Apache::lonstatistics::enrollment_status,                           $Apache::lonstatistics::enrollment_status,
                          $symb,$part,$courseid,$starttime,$endtime);                           $symb,$part,$courseid,$starttime,$endtime);
     $data->{'symb'}        = $symb;      $data->{'symb'}        = $symb;
Line 1559  sub get_statistics { Line 1580  sub get_statistics {
     $data->{'container'}   = $sequence->compTitle;      $data->{'container'}   = $sequence->compTitle;
     $data->{'title'}       = $resource->compTitle;      $data->{'title'}       = $resource->compTitle;
     $data->{'title.link'}  = $resource->src.'?symb='.      $data->{'title.link'}  = $resource->src.'?symb='.
         &Apache::lonnet::escape($resource->symb);          &escape($resource->symb);
     #      #
     if ($SelectedFields{'deg_of_disc'}) {      if ($SelectedFields{'deg_of_disc'}) {
         $data->{'deg_of_disc'} =           $data->{'deg_of_disc'} =
             &compute_discrimination_factor($resource,$part,$sequence);              &compute_discrimination_factor($resource,$part,$sequence);
     }      }
     #      #
Line 1575  sub get_statistics { Line 1596  sub get_statistics {
         $data->{'course'} = $env{'request.course.id'};          $data->{'course'} = $env{'request.course.id'};
         my $urlres=(&Apache::lonnet::decode_symb($resource->symb))[2];          my $urlres=(&Apache::lonnet::decode_symb($resource->symb))[2];
         $data->{'urlres'}=$urlres;          $data->{'urlres'}=$urlres;
         my %storestats =           my %storestats =
             &LONCAPA::lonmetadata::dynamic_metadata_storage($data);              &LONCAPA::lonmetadata::dynamic_metadata_storage($data);
         my ($dom,$user) = $urlres=~/^(\w+)\/(\w+)/;           my ($dom,$user) = ($urlres=~m{^($LONCAPA::domain_re)/($LONCAPA::username_re)});
         &Apache::lonnet::put('nohist_resevaldata',\%storestats,$dom,$user);          &Apache::lonnet::put('nohist_resevaldata',\%storestats,$dom,$user);
     }      }
     #      #
Line 1585  sub get_statistics { Line 1606  sub get_statistics {
         ($data->{'num_solved'}+0.1);          ($data->{'num_solved'}+0.1);
     #      #
     # Get the due date for research purposes (commented out most of the time)      # Get the due date for research purposes (commented out most of the time)
 #    $data->{'duedate'} =   #    my $duedate = &Apache::lonnet::EXT('resource.'.$part.'.duedate',$symb);;
 #        &Apache::lonnet::EXT('resource.'.$part.'.duedate',$symb);  #    my $opendate = &Apache::lonnet::EXT('resource.'.$part.'.opendate',$symb);
 #    $data->{'opendate'} =   #    my $maxtries = &Apache::lonnet::EXT('resource.'.$part.'.maxtries',$symb);
 #        &Apache::lonnet::EXT('resource.'.$part.'.opendate',$symb);  #    my $hinttries = &Apache::lonnet::EXT('resource.'.$part.'.hinttries',$symb);
 #    $data->{'maxtries'} =       my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight',$symb);
 #        &Apache::lonnet::EXT('resource.'.$part.'.maxtries',$symb);      $data->{'weight'} = $weight;
 #    $data->{'hinttries'} =  #    $data->{'duedate'} = $duedate;
 #        &Apache::lonnet::EXT('resource.'.$part.'.hinttries',$symb);  #    $data->{'opendate'} = $opendate;
     $data->{'weight'} =  #    $data->{'maxtries'} = $maxtries;
         &Apache::lonnet::EXT('resource.'.$part.'.weight',$symb);  #    $data->{'hinttries'} = $hinttries;
 #    $data->{'resptypes'} = join(',',@{$resource->{'partdata'}->{$part}->{'ResponseTypes'}});  #    $data->{'resptypes'} = join(',',@{$resource->{'partdata'}->{$part}->{'ResponseTypes'}});
     return $data;      return $data;
 }  }
Line 1625  sub compute_discrimination_factor { Line 1646  sub compute_discrimination_factor {
     #      #
     # rank      # rank
     my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();      my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();
     my $ranking =       my $ranking =
         &Apache::loncoursedata::rank_students_by_scores_on_resources          &Apache::loncoursedata::rank_students_by_scores_on_resources
         (\@Resources,          (\@Resources,
          [&Apache::lonstatistics::get_selected_sections()],           [&Apache::lonstatistics::get_selected_sections()],
            [&Apache::lonstatistics::get_selected_groups()],
          $Apache::lonstatistics::enrollment_status,undef,           $Apache::lonstatistics::enrollment_status,undef,
          $starttime,$endtime, $symb);           $starttime,$endtime, $symb);
     #      #
     # compute their percent scores on the problems in the sequence,      # compute their percent scores on the problems in the sequence,
     my $number_to_grab = int(scalar(@{$ranking})/4);      my $number_to_grab = int(scalar(@{$ranking})/4);
     my $num_students = scalar(@{$ranking});      my $num_students = scalar(@{$ranking});
     my @BottomSet = map { $_->[&Apache::loncoursedata::RNK_student()];       my @BottomSet = map { $_->[&Apache::loncoursedata::RNK_student()];
                       } @{$ranking}[0..$number_to_grab];                        } @{$ranking}[0..$number_to_grab];
     my @TopSet    =       my @TopSet    =
         map {           map {
             $_->[&Apache::loncoursedata::RNK_student()];               $_->[&Apache::loncoursedata::RNK_student()];
           } @{$ranking}[-$number_to_grab..0];            } @{$ranking}[-$number_to_grab..0];
     if (! @BottomSet || (@BottomSet == 1 && $BottomSet[0] eq '') ||      if (! @BottomSet || (@BottomSet == 1 && $BottomSet[0] eq '') ||
         ! @TopSet    || (@TopSet    == 1 && $TopSet[0]    eq '')) {          ! @TopSet    || (@TopSet    == 1 && $TopSet[0]    eq '')) {
         return 'nan';          return 'nan';
     }      }
     my ($bottom_sum,$bottom_max) =       my ($bottom_sum,$bottom_max) =
         &Apache::loncoursedata::get_sum_of_scores($symb,$part,\@BottomSet,          &Apache::loncoursedata::get_sum_of_scores($symb,$part,\@BottomSet,
                                                   undef,$starttime,$endtime);                                                    undef,$starttime,$endtime);
     my ($top_sum,$top_max) =       my ($top_sum,$top_max) =
         &Apache::loncoursedata::get_sum_of_scores($symb,$part,\@TopSet,          &Apache::loncoursedata::get_sum_of_scores($symb,$part,\@TopSet,
                                                   undef,$starttime,$endtime);                                                    undef,$starttime,$endtime);
     my $deg_of_disc;      my $deg_of_disc;
Line 1671  sub compute_discrimination_factor { Line 1693  sub compute_discrimination_factor {
 ##  ##
 ## K=the number of items in your test  ## K=the number of items in your test
 ## M=the mean score on the test  ## M=the mean score on the test
 ## s=the standard deviation of the scores on your test   ## s=the standard deviation of the scores on your test
 ##  ##
 ## then:  ## then:
 ##   ##
 ## KR-21 rk= [K/(K-1)] * [1- (M*(K-M))/(K*s^2))]  ## KR-21 rk= [K/(K-1)] * [1- (M*(K-M))/(K*s^2))]
 ##  ##
 ###############################################  ###############################################
Line 1691  sub compute_sequence_statistics { Line 1713  sub compute_sequence_statistics {
     my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();      my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();
     #      #
     # First compute statistics based on student scores      # First compute statistics based on student scores
     my ($smin,$smax,$sMean,$sSTD,$scount,$sMAX) =       my ($smin,$smax,$sMean,$sSTD,$scount,$sMAX) =
         &Apache::loncoursedata::score_stats          &Apache::loncoursedata::score_stats
                     ([&Apache::lonstatistics::get_selected_sections()],                      ([&Apache::lonstatistics::get_selected_sections()],
                        [&Apache::lonstatistics::get_selected_groups()],
                      $Apache::lonstatistics::enrollment_status,                       $Apache::lonstatistics::enrollment_status,
                      \@Resources,$starttime,$endtime,undef);                       \@Resources,$starttime,$endtime,undef);
     $SeqStat{$symb}->{'title'}  = $seq->compTitle;      $SeqStat{$symb}->{'title'}  = $seq->compTitle;
Line 1705  sub compute_sequence_statistics { Line 1728  sub compute_sequence_statistics {
     $SeqStat{$symb}->{'max_possible'} = $sMAX;      $SeqStat{$symb}->{'max_possible'} = $sMAX;
     #      #
     # Compute statistics based on the number of correct problems      # Compute statistics based on the number of correct problems
     # 'correct' is taken to mean       # 'correct' is taken to mean
     my ($cmin,$cmax,$cMean,$cSTD,$ccount)=      my ($cmin,$cmax,$cMean,$cSTD,$ccount)=
         &Apache::loncoursedata::count_stats          &Apache::loncoursedata::count_stats
         ([&Apache::lonstatistics::get_selected_sections()],          ([&Apache::lonstatistics::get_selected_sections()],
            [&Apache::lonstatistics::get_selected_groups()],
          $Apache::lonstatistics::enrollment_status,           $Apache::lonstatistics::enrollment_status,
          \@Resources,$starttime,$endtime,undef);           \@Resources,$starttime,$endtime,undef);
     my $K = $part_count;      my $K = $part_count;

Removed from v.1.106  
changed lines
  Added in v.1.119


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