Changeset 1047


Ignore:
Timestamp:
Apr 27, 2009, 3:24:16 PM (14 years ago)
Author:
Jari Häkkinen
Message:

Fixes #206. Missing values in reference now works. Each probe with no welldefined value in the reference are ignored.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • plugins/base2/net.sf.basedb.normalizers/trunk/src/c++/bin/qQN.cc

    r1045 r1047  
    9999  }
    100100
    101   std::vector<double> target(m.rows());
     101  std::vector<double> target;
    102102  ( assay.present() ? create_target_and_fix_nans(target,m,assay.value()) :
    103103                      create_target_and_fix_nans(target,m) );
     
    131131  std::string line;
    132132  size_t column=0;
    133   std::vector<size_t> yes(m.rows(),0);
    134   for (size_t row=0; row<m.rows(); ++row)
    135     t[row]=0;
     133  std::vector<size_t> column_contribs(m.rows(),0);
     134  std::vector<double> temp_target(m.rows(),0.0);
    136135  while (getline(is, line)) {
    137136    size_t found=line.find("yes");
     
    139138      for (size_t row=0; row<m.rows(); ++row)
    140139        if (m(row,column).weight()) { // weight either 0 or 1
    141           t[row]+=m(row,column).data();
    142           ++yes[row];
     140          temp_target[row]+=m(row,column).data();
     141          ++column_contribs[row];
    143142        }
    144143        else
     
    149148      throw std::runtime_error("Too many annotation columns wrt data matrix");
    150149  }
    151   for (size_t row=0; row<m.rows(); ++row) {
    152     if (!yes[row])
    153       throw std::runtime_error("At least one row with no valid reference");
    154     t[row]/=yes[row];
    155   }
     150  t.reserve(m.rows());
     151  for (size_t row=0; row<m.rows(); ++row)
     152    if (column_contribs[row])
     153      t.push_back(temp_target[row]/=column_contribs[row]);
     154  if (!t.size())
     155    throw std::runtime_error("Not a well defined reference, aborting");
    156156}
    157157
     
    159159void create_target_and_fix_nans(std::vector<double>& t, MatrixWeighted& m)
    160160{
     161  std::vector<double> temp_target(m.rows(),0.0);
     162  t.reserve(m.rows());
    161163  for (size_t row=0; row<m.rows(); ++row) {
    162     t[row]=0;
    163164    size_t column_contribs=0;
    164165    for (size_t column=0; column<m.columns(); ++column)
    165166      if (m(row,column).weight()) { // weight either 0 or 1
    166         t[row]+=m(row,column).data();
     167        temp_target[row]+=m(row,column).data();
    167168        ++column_contribs;
    168169      }
    169170      else
    170171        m(row,column).data()=0;
    171     if (!column_contribs)
    172       throw std::runtime_error("At least one row with no valid reference");
    173     t[row]/=column_contribs;
     172    if (column_contribs)
     173      t.push_back(temp_target[row]/=column_contribs);
    174174  }
     175  if (!t.size())
     176    throw std::runtime_error("Not a well defined reference, aborting");
    175177}
    176178
Note: See TracChangeset for help on using the changeset viewer.