Пример #1
0
void PhaseEstimator::NormalizeBasecallerRead(DPTreephaser& treephaser, BasecallerRead& read, int start_flow, int end_flow)
{
    switch (norm_method_) {
        case 0:
            treephaser.Normalize(read, start_flow, end_flow);
            break;
        case 1:
            treephaser.WindowedNormalize(read, (end_flow / windowSize_), windowSize_);
            break;
        case 2:
            treephaser.PIDNormalize(read, start_flow, end_flow);
            break;
        case 3: // Variable per-read normalization based on the number of negative valued zero-mers
            if (read.penalty_residual.at(0) >  maxfrac_negative_flows_)
              treephaser.WindowedNormalize(read, (end_flow / windowSize_), windowSize_);
            else
              treephaser.Normalize(read, start_flow, end_flow);
            break;
        case 4: // "off" do not do anything
            break;
        default:
            cerr << "PhaseEstimator: Unknown normalization method " << norm_method_ << endl;
            exit(EXIT_FAILURE);
    }
};
Пример #2
0
float PhaseEstimator::EvaluateParameters(vector<BasecallerRead *>& useful_reads, DPTreephaser& treephaser, const float *parameters, const bool usePIDNorm)
{
  float try_cf = parameters[0];
  float try_ie = parameters[1];
  float try_dr = parameters[2];
  if (try_cf < 0 or try_ie < 0 or try_dr < 0 or try_cf > 0.04 or try_ie > 0.04 or try_dr > 0.01)
    return 1e10;

  treephaser.SetModelParameters(try_cf, try_ie, try_dr);

  float metric = 0;
  for (vector<BasecallerRead *>::iterator read = useful_reads.begin(); read != useful_reads.end(); ++read) {

    treephaser.Simulate(**read, 120);
    float normalizer = (usePIDNorm ? treephaser.PIDNormalize(**read, 8, 100) : treephaser.Normalize(**read, 20, 100));

    for (unsigned int flow = 20; flow < 100 and flow < (*read)->raw_measurements.size(); flow++) {
      if ((*read)->raw_measurements[flow] > 1.2)
        continue;
      float delta = (*read)->raw_measurements[flow] - (*read)->prediction[flow] * normalizer;
      metric += delta * delta;
    }
  }

  return isnan(metric) ? 1e10 : metric;
}