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; }
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); } };