void somatic_indel_caller:: get_somatic_indel(const strelka_options& opt, const strelka_deriv_options& dopt, const double indel_error_prob, const double ref_error_prob, const indel_key& ik, const indel_data& normal_id, const indel_data& tumor_id, const bool is_use_alt_indel, somatic_indel_call& sindel) const { // for now, lhood calculation of tumor and normal are independent: // get likelihood of each genotype static const bool is_normal_het_bias(false); static const bool is_tumor_het_bias(true); static const double normal_het_bias(0.0); static const double tumor_het_bias(0.4); double normal_lhood[STAR_DIINDEL::SIZE]; double tumor_lhood[STAR_DIINDEL::SIZE]; static const unsigned n_tier(2); result_set tier_rs[n_tier]; for (unsigned i(0); i<n_tier; ++i) { const bool is_include_tier2(i==1); if (is_include_tier2) { if (not opt.is_tier2()) continue; if (tier_rs[0].sindel_qphred==0) { tier_rs[1].sindel_qphred=0; continue; } } indel_digt_caller::get_indel_digt_lhood(opt,dopt,indel_error_prob,ref_error_prob,ik,normal_id, is_normal_het_bias,normal_het_bias, is_include_tier2,is_use_alt_indel, normal_lhood); indel_digt_caller::get_indel_digt_lhood(opt,dopt,indel_error_prob,ref_error_prob,ik,tumor_id, is_tumor_het_bias,tumor_het_bias, is_include_tier2,is_use_alt_indel, tumor_lhood); calculate_result_set(opt,normal_lnprior(), _ln_som_match,_ln_som_mismatch, normal_lhood,tumor_lhood,tier_rs[i]); } sindel.tier=0; if (opt.is_tier2()) { if (tier_rs[0].sindel_qphred > tier_rs[1].sindel_qphred) { sindel.tier=1; } } sindel.rs=tier_rs[sindel.tier]; sindel.is_indel=(sindel.rs.sindel_qphred != 0); }
void somatic_snv_caller_strand_grid:: position_somatic_snv_call(const extended_pos_info& normal_epi, const extended_pos_info& tumor_epi, const extended_pos_info* normal_epi_t2_ptr, const extended_pos_info* tumor_epi_t2_ptr, somatic_snv_genotype_grid& sgt) const { static const bool is_always_test(false); { const snp_pos_info& normal_pi(normal_epi.pi); const snp_pos_info& tumor_pi(tumor_epi.pi); if(normal_pi.ref_base=='N') return; sgt.ref_gt=base_to_id(normal_pi.ref_base); // check that a non-reference call meeting quality criteria even // exists: if(not is_always_test) { if(is_spi_allref(normal_pi,sgt.ref_gt) and is_spi_allref(tumor_pi,sgt.ref_gt)) return; } } // strawman model treats normal and tumor as independent, so // calculate separate lhoods: blt_float_t normal_lhood[DIGT_SGRID::SIZE]; blt_float_t tumor_lhood[DIGT_SGRID::SIZE]; const bool is_tier2(NULL != normal_epi_t2_ptr); static const unsigned n_tier(2); result_set tier_rs[n_tier]; for(unsigned i(0); i<n_tier; ++i) { const bool is_include_tier2(i==1); if(is_include_tier2) { if(! is_tier2) continue; if(tier_rs[0].snv_qphred==0) { tier_rs[1].snv_qphred=0; continue; } } // get likelihood of each genotype // static const bool is_normal_het_bias(false); static const blt_float_t normal_het_bias(0.0); static const bool is_tumor_het_bias(false); static const blt_float_t tumor_het_bias(0.0); const extended_pos_info& nepi(is_include_tier2 ? *normal_epi_t2_ptr : normal_epi ); const extended_pos_info& tepi(is_include_tier2 ? *tumor_epi_t2_ptr : tumor_epi ); get_diploid_gt_lhood_spi(_opt,nepi.pi,is_normal_het_bias,normal_het_bias,normal_lhood); get_diploid_gt_lhood_spi(_opt,tepi.pi,is_tumor_het_bias,tumor_het_bias,tumor_lhood); get_diploid_het_grid_lhood_spi(nepi.pi,normal_lhood+DIGT::SIZE); get_diploid_het_grid_lhood_spi(tepi.pi,tumor_lhood+DIGT::SIZE); get_diploid_strand_grid_lhood_spi(nepi.pi,sgt.ref_gt,normal_lhood+DIGT_SGRID::PRESTRAND_SIZE); get_diploid_strand_grid_lhood_spi(tepi.pi,sgt.ref_gt,tumor_lhood+DIGT_SGRID::PRESTRAND_SIZE); // genomic site results: calculate_result_set_grid(normal_lhood, tumor_lhood, get_prior_set(sgt.ref_gt), _ln_som_match,_ln_som_mismatch, sgt.ref_gt, tier_rs[i]); #if 0 #ifdef ENABLE_POLY // polymorphic site results: assert(0); // still needs to be adapted for 2-tier system: calculate_result_set(normal_lhood,tumor_lhood, lnprior_polymorphic(sgt.ref_gt),sgt.ref_gt,sgt.poly); #else sgt.poly.snv_qphred = 0; #endif #endif #ifdef SOMATIC_DEBUG if((i==0) && (tier_rs[i].snv_qphred > 0)) { const somatic_snv_caller_strand_grid::prior_set& pset(get_prior_set(sgt.ref_gt)); const blt_float_t lnmatch(_ln_som_match); const blt_float_t lnmismatch(_ln_som_mismatch); log_os << "DUMP ON\n"; log_os << "tier1_qphred: " << tier_rs[0].snv_qphred << "\n"; // instead of dumping the entire distribution, we sort the lhood,prior,and prob to print out the N top values of each: std::vector<double> lhood(DDIGT_SGRID::SIZE); std::vector<double> prior(DDIGT_SGRID::SIZE); std::vector<double> post(DDIGT_SGRID::SIZE); // first get raw lhood: // for(unsigned ngt(0); ngt<DIGT_SGRID::PRESTRAND_SIZE; ++ngt) { for(unsigned tgt(0); tgt<DIGT_SGRID::PRESTRAND_SIZE; ++tgt) { const unsigned dgt(DDIGT_SGRID::get_state(ngt,tgt)); // unorm takes the role of the normal prior for the somatic case: // static const blt_float_t unorm(std::log(static_cast<blt_float_t>(DIGT_SGRID::PRESTRAND_SIZE))); //blt_float_t prior; //if(tgt==ngt) { prior=pset.normal[ngt]+lnmatch; } //else { prior=pset.somatic_marginal[ngt]+lnmismatch; } blt_float_t pr; if(tgt==ngt) { pr=pset.normal[ngt]+lnmatch; } else { pr=pset.somatic_marginal[ngt]+lnmismatch; } prior[dgt] = pr; lhood[dgt] = normal_lhood[ngt]+tumor_lhood[tgt]; post[dgt] = lhood[dgt] + prior[dgt]; } } for(unsigned gt(DIGT_SGRID::PRESTRAND_SIZE); gt<DIGT_SGRID::SIZE; ++gt) { const unsigned dgt(DDIGT_SGRID::get_state(gt,gt)); lhood[dgt] = normal_lhood[gt]+tumor_lhood[gt]; prior[dgt] = pset.normal[gt]+lnmatch; post[dgt] = lhood[dgt] + prior[dgt]; } std::vector<double> lhood2(lhood); sort_n_dump("lhood_prior",lhood,prior,sgt.ref_gt); sort_n_dump("post_lhood",post,lhood2,sgt.ref_gt); log_os << "DUMP OFF\n"; } #endif } if((tier_rs[0].snv_qphred==0) || (is_tier2 && (tier_rs[1].snv_qphred==0))) return; sgt.snv_tier=0; sgt.snv_from_ntype_tier=0; if(is_tier2) { if(tier_rs[0].snv_qphred > tier_rs[1].snv_qphred) { sgt.snv_tier=1; } if(tier_rs[0].snv_from_ntype_qphred > tier_rs[1].snv_from_ntype_qphred) { sgt.snv_from_ntype_tier=1; } } sgt.rs=tier_rs[sgt.snv_from_ntype_tier]; if(is_tier2 && (tier_rs[0].ntype != tier_rs[1].ntype)) { // catch NTYPE conflict states: sgt.rs.ntype = NTYPE::CONFLICT; sgt.rs.snv_from_ntype_qphred = 0; } else { // classify NTYPE: // // convert diploid genotype into more limited ntype set: // if (sgt.rs.ntype==sgt.ref_gt) { sgt.rs.ntype=NTYPE::REF; } else if(DIGT::is_het(sgt.rs.ntype)) { sgt.rs.ntype=NTYPE::HET; } else { sgt.rs.ntype=NTYPE::HOM; } } sgt.rs.snv_qphred = tier_rs[sgt.snv_tier].snv_qphred; sgt.is_snv=((sgt.rs.snv_qphred != 0)); }