/// Constructor CQueryFactoryInfo::CQueryFactoryInfo(CRef<IQueryFactory> query_factory, EBlastProgramType program) : m_IsProt(Blast_SubjectIsProtein(program) ? true : false), m_MaxLength(0), m_MinLength(1), m_AvgLength(0), m_QuerySource(0), m_NumSeqs(0) { CRef<IRemoteQueryData> query_data(query_factory->MakeRemoteQueryData()); CRef<CBioseq_set> bss(query_data->GetBioseqSet()); _ASSERT(bss.NotEmpty()); m_QuerySource.Reset(new CBlastQuerySourceBioseqSet(*bss, m_IsProt)); if ( !m_QuerySource ) { NCBI_THROW(CBlastException, eSeqSrcInit, "Failed to initialize sequences for IQueryFactory"); } // TODO support for m_MinLength SetupSubjects_OMF(*m_QuerySource, program, &m_SeqBlkVector, &m_MaxLength); m_NumSeqs = static_cast<Uint4>(m_QuerySource->Size()); _ASSERT(!m_SeqBlkVector.empty()); }
/// Constructor CMultiSeqInfo::CMultiSeqInfo(TSeqLocVector& seq_vector, EBlastProgramType program, bool dbscan_mode) { m_ibIsProt = Blast_SubjectIsProtein(program) ? true : false; m_DbScanMode = dbscan_mode; m_iTotalLength=0; // Fix subject location for tblast[nx]. if (Blast_SubjectIsTranslated(program)) { TSeqLocVector temp_slv; vector<Int2> strand_v; ITERATE(TSeqLocVector, iter, seq_vector) { strand_v.push_back((Int2) (*iter).seqloc->GetStrand()); CRef<CSeq_loc> sl(new CSeq_loc); sl->Assign(*((*iter).seqloc)); sl->SetStrand(eNa_strand_both); if ((*iter).mask) { CRef<CSeq_loc> mask_sl(new CSeq_loc); mask_sl->Assign(*((*iter).mask)); SSeqLoc sseq_loc(*sl, *((*iter).scope), *mask_sl); temp_slv.push_back(sseq_loc); } else { SSeqLoc sseq_loc(*sl, *((*iter).scope)); temp_slv.push_back(sseq_loc); } } SetupSubjects(temp_slv, program, &m_ivSeqBlkVec, &m_iMaxLength); int index=0; ITERATE(vector<Int2>, s_iter, strand_v) { m_ivSeqBlkVec[index++]->subject_strand = *s_iter; } }
CQueryFactoryInfo::CQueryFactoryInfo(const TSeqLocVector& subj_seqs, EBlastProgramType program) : m_IsProt(Blast_SubjectIsProtein(program) ? true : false), m_MaxLength(0), m_MinLength(1), m_AvgLength(0), m_QuerySource(0), m_NumSeqs(subj_seqs.size()) { // Fix subject location for tblast[nx]. if (Blast_SubjectIsTranslated(program)) { TSeqLocVector temp_slv; vector<Int2> strand_v; ITERATE(TSeqLocVector, iter, subj_seqs) { strand_v.push_back((Int2) (*iter).seqloc->GetStrand()); CRef<CSeq_loc> sl(new CSeq_loc); sl->Assign(*((*iter).seqloc)); sl->SetStrand(eNa_strand_both); if ((*iter).mask) { CRef<CSeq_loc> mask_sl(new CSeq_loc); mask_sl->Assign(*((*iter).mask)); SSeqLoc sseq_loc(*sl, *((*iter).scope), *mask_sl); temp_slv.push_back(sseq_loc); } else { SSeqLoc sseq_loc(*sl, *((*iter).scope)); temp_slv.push_back(sseq_loc); } } SetupSubjects(temp_slv, program, &m_SeqBlkVector, &m_MaxLength); int index=0; ITERATE(vector<Int2>, s_iter, strand_v) { m_SeqBlkVector[index++]->subject_strand = *s_iter; } }
void InitializeSubject(CRef<blast::CBlastDatabaseArgs> db_args, CRef<blast::CBlastOptionsHandle> opts_hndl, bool is_remote_search, CRef<blast::CLocalDbAdapter>& db_adapter, CRef<objects::CScope>& scope) { db_adapter.Reset(); _ASSERT(db_args.NotEmpty()); CRef<CSearchDatabase> search_db = db_args->GetSearchDatabase(); // Initialize the scope... if (is_remote_search) { const bool is_protein = Blast_SubjectIsProtein(opts_hndl->GetOptions().GetProgramType()) ? true : false; SDataLoaderConfig config(is_protein); if (search_db.NotEmpty() && search_db->GetDatabaseName() != "n/a") { config.m_BlastDbName = search_db->GetDatabaseName(); } CBlastScopeSource scope_src(config); // configure scope to fetch sequences remotely for formatting if (scope.NotEmpty()) { scope_src.AddDataLoaders(scope); } else { scope = scope_src.NewScope(); } } else { if (scope.Empty()) { scope.Reset(new CScope(*CObjectManager::GetInstance())); } } _ASSERT(scope.NotEmpty()); // ... and then the subjects CRef<IQueryFactory> subjects; if ( (subjects = db_args->GetSubjects(scope)) ) { _ASSERT(search_db.Empty()); db_adapter.Reset(new CLocalDbAdapter(subjects, opts_hndl)); } else { _ASSERT(search_db.NotEmpty()); try { // Try to open the BLAST database even for remote searches, as if // it is available locally, it will be better to fetch the // sequence data for formatting from this (local) source CRef<CSeqDB> seqdb = search_db->GetSeqDb(); db_adapter.Reset(new CLocalDbAdapter(*search_db)); scope->AddDataLoader(RegisterOMDataLoader(seqdb)); } catch (const CSeqDBException&) { // The BLAST database couldn't be found, report this for local // searches, but for remote searches go on. if (is_remote_search ) { db_adapter.Reset(new CLocalDbAdapter(*search_db)); } else { throw; } } } /// Set the BLASTDB data loader as the default data loader (if applicable) if (search_db.NotEmpty()) { string dbloader_name = s_FindBlastDbDataLoaderName(search_db->GetDatabaseName(), search_db->IsProtein()); if ( !dbloader_name.empty() ) { // FIXME: will this work with multiple BLAST DBs? scope->AddDataLoader(dbloader_name, CBlastDatabaseArgs::kSubjectsDataLoaderPriority); _TRACE("Setting " << dbloader_name << " priority to " << (int)CBlastDatabaseArgs::kSubjectsDataLoaderPriority << " for subjects"); } } }