CRef<CSeq_interval> CSpliced_exon::CreateRowSeq_interval(CSeq_align::TDim row, const CSpliced_seg& seg) const { CRef<CSeq_interval> ret; ret.Reset(new CSeq_interval); TSeqRange range = GetRowSeq_range(row, false); ret->SetFrom(range.GetFrom()); ret->SetTo(range.GetTo()); if (row == 0) { if ( IsSetProduct_id() ) { ret->SetId().Assign(GetProduct_id()); } else if ( seg.IsSetProduct_id() ) { ret->SetId().Assign(seg.GetProduct_id()); } else { NCBI_THROW(CSeqalignException, eInvalidAlignment, "CSpliced_exon::CreateRowSeq_interval() - " "missing product id."); } if ( IsSetProduct_strand() ) { ret->SetStrand(GetProduct_strand()); } else if ( seg.IsSetProduct_strand() ) { ret->SetStrand(seg.GetProduct_strand()); } } else if (row == 1) { // Genomic if ( IsSetGenomic_id() ) { ret->SetId().Assign(GetGenomic_id()); } else if ( seg.IsSetGenomic_id() ) { ret->SetId().Assign(seg.GetGenomic_id()); } else { NCBI_THROW(CSeqalignException, eInvalidAlignment, "CSpliced_exon::CreateRowSeq_interval() - " "missing genomic id."); } if ( IsSetGenomic_strand() ) { ret->SetStrand(GetGenomic_strand()); } else if ( seg.IsSetGenomic_strand() ) { ret->SetStrand(seg.GetGenomic_strand()); } } return ret; }
void x_ValidatePssmVsGi129295(CConstRef<CSeq_align> sa) { BOOST_REQUIRE(sa->GetSegs().IsDenseg()); const CDense_seg & denseg = sa->GetSegs().GetDenseg(); // Validate the first (and only) HSP, which is a self hit const TSeqRange hsp(0, 231); TSeqRange hsp1_query = denseg.GetSeqRange(0); TSeqRange hsp1_subj = denseg.GetSeqRange(1); BOOST_REQUIRE_EQUAL(hsp.GetFrom(), hsp1_query.GetFrom()); BOOST_REQUIRE_EQUAL(hsp.GetTo(), hsp1_query.GetTo()); BOOST_REQUIRE_EQUAL(hsp.GetFrom(), hsp1_subj.GetFrom()); BOOST_REQUIRE_EQUAL(hsp.GetTo(), hsp1_subj.GetTo()); }
CRef<objects::CBioseq> SeqLocToBioseq(const objects::CSeq_loc& loc, objects::CScope& scope) { CRef<CBioseq> bioseq; if ( !loc.GetId() ) { return bioseq; } // Build a Seq-entry for the query Seq-loc CBioseq_Handle handle = scope.GetBioseqHandle(*loc.GetId()); if( !handle ){ return bioseq; } bioseq.Reset( new CBioseq() ); // add an ID for our sequence CRef<CSeq_id> id(new CSeq_id()); id->Assign(*handle.GetSeqId()); bioseq->SetId().push_back(id); // a title CRef<CSeqdesc> title( new CSeqdesc() ); string title_str; id -> GetLabel(&title_str ); title_str += ": "; loc.GetLabel( &title_str ); title->SetTitle( title_str ); bioseq->SetDescr().Set().push_back( title ); /// /// create the seq-inst /// we can play some games here /// CSeq_inst& inst = bioseq->SetInst(); if (handle.IsAa()) { inst.SetMol(CSeq_inst::eMol_aa); } else { inst.SetMol(CSeq_inst::eMol_na); } bool process_whole = false; if (loc.IsWhole()) { process_whole = true; } else if (loc.IsInt()) { TSeqRange range = loc.GetTotalRange(); if (range.GetFrom() == 0 && range.GetTo() == handle.GetBioseqLength() - 1) { /// it's whole process_whole = true; } } /// BLAST now handles delta-seqs correctly, so we can submit this /// as a delta-seq if (process_whole) { /// just encode the whole sequence CSeqVector vec(loc, scope, CBioseq_Handle::eCoding_Iupac); string seq_string; vec.GetSeqData(0, vec.size(), seq_string); inst.SetRepr(CSeq_inst::eRepr_raw); inst.SetLength(seq_string.size()); if (vec.IsProtein()) { inst.SetMol(CSeq_inst::eMol_aa); inst.SetSeq_data().SetIupacaa().Set().swap(seq_string); } else { inst.SetMol(CSeq_inst::eMol_na); inst.SetSeq_data().SetIupacna().Set().swap(seq_string); CSeqportUtil::Pack(&inst.SetSeq_data()); } } else { inst.SetRepr(CSeq_inst::eRepr_delta); inst.SetLength(handle.GetBioseqLength()); CDelta_ext& ext = inst.SetExt().SetDelta(); /// /// create a delta sequence /// //const CSeq_id& id = sequence::GetId(loc, &scope); //ENa_strand strand = sequence::GetStrand(loc, &scope); TSeqRange range = loc.GetTotalRange(); /// first segment: gap out to initial start of seq-loc if (range.GetFrom() != 0) { ext.AddLiteral(range.GetFrom()); } CSeq_loc_CI loc_iter(loc); if (loc_iter) { TSeqRange prev = loc_iter.GetRange(); ENa_strand strand = loc_iter.GetStrand(); do { /// encode a literal for the included bases CRef<CSeq_loc> sl = handle.GetRangeSeq_loc(prev.GetFrom(), prev.GetTo(), strand); CSeqVector vec(*sl, scope, CBioseq_Handle::eCoding_Iupac); string seq_string; vec.GetSeqData(0, vec.size(), seq_string); ext.AddLiteral(seq_string, (vec.IsProtein() ? CSeq_inst::eMol_aa : CSeq_inst::eMol_na)); /// skip to the next segment /// we may need to include a gap ++loc_iter; if (loc_iter) { TSeqRange next = loc_iter.GetRange(); ext.AddLiteral(next.GetFrom() - prev.GetTo()); prev = next; strand = loc_iter.GetStrand(); } } while (loc_iter); /// gap at the end if (prev.GetTo() < handle.GetBioseqLength() - 1) { ext.AddLiteral(handle.GetBioseqLength() - prev.GetTo() - 1); } } } return bioseq; }
CSeqLocInfo(objects::CSeq_id& id, TSeqRange& range, int frame) : m_Interval(new objects::CSeq_interval(id, range.GetFrom(), range.GetToOpen())) { SetFrame(frame); }