NCBI C++ ToolKit
tracebacksearch_unit_test.cpp
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* $Id: tracebacksearch_unit_test.cpp 101688 2024-01-25 20:14:30Z merezhuk $
2  * ===========================================================================
3  *
4  * PUBLIC DOMAIN NOTICE
5  * National Center for Biotechnology Information
6  *
7  * This software/database is a "United States Government Work" under the
8  * terms of the United States Copyright Act. It was written as part of
9  * the author's official duties as a United States Government employee and
10  * thus cannot be copyrighted. This software/database is freely available
11  * to the public for use. The National Library of Medicine and the U.S.
12  * Government have not placed any restriction on its use or reproduction.
13  *
14  * Although all reasonable efforts have been taken to ensure the accuracy
15  * and reliability of the software and data, the NLM and the U.S.
16  * Government do not and cannot warrant the performance or results that
17  * may be obtained by using this software or data. The NLM and the U.S.
18  * Government disclaim all warranties, express or implied, including
19  * warranties of performance, merchantability or fitness for any particular
20  * purpose.
21  *
22  * Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Author: Kevin Bealer
27  *
28  * File Description:
29  * Unit test module for the traceback stage of the BLAST search.
30  *
31  * ===========================================================================
32  */
33 #include <ncbi_pch.hpp>
34 #include <corelib/test_boost.hpp>
35 
40 
43 
45 
50 
51 
52 // needed for objmgr dependent tests of query data interface
53 #include "test_objmgr.hpp"
54 #include "blast_test_util.hpp"
55 
56 using namespace std;
57 using namespace ncbi;
58 using namespace ncbi::objects;
59 using namespace ncbi::blast;
60 
61 
63 public:
64 
67  {
68  CSeq_id sid("EAL40459");
69 
70  vector<int> OIDS;
71  db.SeqidToOids(sid, OIDS);
72 
73  BOOST_REQUIRE(OIDS.size());
74 
75  const int k_num_hsps_start = 12;
76  //const int k_num_hsps_end = 10;
77 
78  // Taken from traceback unit test.
79 
80  BlastHSPList* hsp_list =
81  (BlastHSPList*) calloc(1, sizeof(BlastHSPList));
82  hsp_list->oid = OIDS[0];
83  hsp_list->hspcnt = k_num_hsps_start;
84  hsp_list->allocated = k_num_hsps_start;
85  hsp_list->hsp_max = k_num_hsps_start;
86  hsp_list->do_not_reallocate = FALSE;
87 
88  hsp_list->hsp_array = (BlastHSP**)
89  malloc(hsp_list->allocated*sizeof(BlastHSP*));
90 
93  opts->GetHitSaveOpts(),
96 
97  BlastHSPWriter* writer = BlastHSPWriterNew(&writer_info, NULL, NULL);
98  BOOST_REQUIRE(writer_info == NULL);
99 
100  BlastHSPStream* hsp_stream = BlastHSPStreamNew(
101  opts->GetProgramType(),
102  opts->GetExtnOpts(),
103  FALSE, 1, writer);
104 
105  const int query_offset[k_num_hsps_start] =
106  { 0, 3864, 3254, 1828, 2189, 795,
107  607, 1780, 1363, 2751, 3599, 242 };
108  const int query_end[k_num_hsps_start] =
109  { 307, 4287, 3556, 2058, 2269, 914,
110  741, 1821, 1451, 2810, 3631, 285 };
111  const int subject_offset[k_num_hsps_start] =
112  { 1, 2723, 2267, 1028, 1292, 634,
113  501, 925, 1195, 1795, 477, 1233 };
114  const int subject_end[k_num_hsps_start] =
115  { 321, 3171, 2537, 1243, 1371, 749,
116  618, 966, 1286, 1869, 509, 1276 };
117  const int score[k_num_hsps_start] =
118  { 370, 319, 139, 120, 89, 84,
119  75, 70, 69, 60, 47, 43 };
120  const int query_gapped_start[k_num_hsps_start] =
121  { 47, 4181, 3286, 2034, 2228, 871,
122  632, 1798, 1383, 2759, 3606, 259 };
123  const int subject_gapped_start[k_num_hsps_start] =
124  { 48, 3073, 2299, 1219, 1330, 709,
125  526, 943, 1215, 1803, 484, 1250 };
126 
127  for (int index=0; index<k_num_hsps_start; index++) {
128  BlastHSP * h1
129  = hsp_list->hsp_array[index]
130  = (BlastHSP*) calloc(1, sizeof(BlastHSP));
131 
132  h1->query.offset = query_offset[index];
133  h1->query.end = query_end[index];
134  h1->subject.offset = subject_offset[index];
135  h1->subject.end = subject_end[index];
136  h1->score = score[index];
137  h1->query.gapped_start = query_gapped_start[index];
138  h1->subject.gapped_start = subject_gapped_start[index];
139  }
140 
141  // needed after tie-breaking algorithm for scores was changed
142  // in ScoreCompareHSP (blast_hits.c, revision 1.139)
143  Blast_HSPListSortByScore(hsp_list);
144  BlastHSPStreamWrite(hsp_stream, &hsp_list);
145 
147  hsps(WrapStruct(hsp_stream, BlastHSPStreamFree));
148 
149  return hsps;
150  }
151 
154  {
155  vector<int> OIDS;
156  db.SeqidToOids(sid, OIDS);
157 
158  BOOST_REQUIRE(OIDS.size());
159 
160  const int k_num_hsps_start = 1;
161  const int k_seq_length = db.GetSeqLength(OIDS.front());
162 
163  BlastHSPList* hsp_list =
164  (BlastHSPList*) calloc(1, sizeof(BlastHSPList));
165  hsp_list->oid = OIDS.front();
166  hsp_list->hspcnt = k_num_hsps_start;
167  hsp_list->allocated = k_num_hsps_start;
168  hsp_list->hsp_max = k_num_hsps_start;
169  hsp_list->do_not_reallocate = FALSE;
170 
171  hsp_list->hsp_array = (BlastHSP**)
172  malloc(hsp_list->allocated*sizeof(BlastHSP*));
173 
174 
177  opts->GetHitSaveOpts(),
180 
181  BlastHSPWriter* writer = BlastHSPWriterNew(&writer_info, NULL, NULL);
182  BOOST_REQUIRE(writer_info == NULL);
183 
184  BlastHSPStream* hsp_stream = BlastHSPStreamNew(
185  opts->GetProgramType(),
186  opts->GetExtnOpts(),
187  FALSE, 1, writer);
188 
189  const int query_offset[k_num_hsps_start] = { 0 };
190  const int query_end[k_num_hsps_start] = { k_seq_length - 1 };
191  const int subject_offset[k_num_hsps_start] = { 0 };
192  const int subject_end[k_num_hsps_start] = { k_seq_length - 1 };
193  const int score[k_num_hsps_start] = { 0 };
194  const int query_gapped_start[k_num_hsps_start] = { 0 };
195  const int subject_gapped_start[k_num_hsps_start] = { 0 };
196 
197  for (int index=0; index<k_num_hsps_start; index++) {
198  BlastHSP * h1
199  = hsp_list->hsp_array[index]
200  = (BlastHSP*) calloc(1, sizeof(BlastHSP));
201 
202  h1->query.offset = query_offset[index];
203  h1->query.end = query_end[index];
204  h1->subject.offset = subject_offset[index];
205  h1->subject.end = subject_end[index];
206  h1->score = score[index];
207  h1->query.gapped_start = query_gapped_start[index];
208  h1->subject.gapped_start = subject_gapped_start[index];
209  }
210 
211  // needed after tie-breaking algorithm for scores was changed
212  // in ScoreCompareHSP (blast_hits.c, revision 1.139)
213  Blast_HSPListSortByScore(hsp_list);
214  BlastHSPStreamWrite(hsp_stream, &hsp_list);
215 
217  hsps(WrapStruct(hsp_stream, BlastHSPStreamFree));
218 
219  return hsps;
220  }
221 
222  void x_FindUsedGis(const CSeq_align_set & aset, set<string> & used)
223  {
224  used.clear();
225  ITERATE(CSeq_align_set::Tdata, align, aset.Get()) {
226  if((**align).CanGetExt() && (**align).GetExt().size() > 0)
227  {
228  CRef<CUser_object> uObject = (**align).GetExt().front();
229  if(uObject->IsSetType() && uObject->GetType().IsStr() &&
230  uObject->GetType().GetStr() == "use_this_seqid" && uObject->IsSetData())
231  {
232  const CUser_object::TData& fields = uObject->GetData();
233  for(CUser_object::TData::const_iterator fit = fields.begin(); fit != fields.end(); ++fit)
234  {
235  const CUser_field& field = **fit;
236  if (field.IsSetLabel() && field.GetLabel().IsStr() && field.GetLabel().GetStr() == "SEQIDS")
237  {
238  const vector< CStringUTF8 >& giStrings = field.GetData().GetStrs();
239  ITERATE(vector< CStringUTF8 >, str, giStrings) {
240  used.insert(*str);
241  }
242  }
243  }
244  }
245  }
246  }
247  }
248 
250  {
251  // Build uniform search factory, get options
253  CRef<CBlastOptionsHandle> opth(&* sf->GetOptions(eBlastp));
254 
255  // Get a SeqDB and a query factory... This uses two SeqDB
256  // objects in the gi_list case, so that it is possible to
257  // fetch the query, which is not in the GI list.
258 
259  CRef<CSeqDB> query_seqdb(new CSeqDB("nr", CSeqDB::eProtein));
260  CRef<CSeqDB> subject_seqdb;
261 
262  if (gi_list) {
263  subject_seqdb.Reset(new CSeqDB("nr", CSeqDB::eProtein, gi_list));
264  } else {
265  subject_seqdb = query_seqdb;
266  }
267 
268  CSeq_id query("NP_056193");
269  unique_ptr<SSeqLoc> sl(CTestObjMgr::Instance().CreateSSeqLoc(query));
270  TSeqLocVector qv;
271  qv.push_back(*sl);
273 
274  // Note that the traceback code will (in some cases) modify
275  // the options object.
276 
278  opts(& const_cast<CBlastOptions&>(opth->GetOptions()));
279 
280  // Construct false HSPs.
282  hsps(x_GetSampleHspStream(opts, *subject_seqdb));
283 
284  // Now to do the traceback..
285 
286  // Build the object itself
288 
289  BOOST_REQUIRE(subject_seqdb.NotEmpty());
290  CBlastSeqSrc seq_src = SeqDbBlastSeqSrcInit(subject_seqdb);
291  CRef<blast::IBlastSeqInfoSrc> seq_info_src(new blast::CSeqDbSeqInfoSrc(subject_seqdb));
292  tbs.Reset(new CBlastTracebackSearch(qf, opts, seq_src.Get(), seq_info_src, hsps));
293 
294  CSearchResultSet v = *tbs->Run();
295 
296  BOOST_REQUIRE_EQUAL(1, (int)v.GetNumResults());
297  BOOST_REQUIRE_EQUAL(0, (int)v[0].GetErrors().size());
298 
299  return v;
300  }
301 };
302 
303 BOOST_FIXTURE_TEST_SUITE(tracebacksearch, CTracebackSearchTestFixture)
304 
306  CSearchResultSet rset = x_Traceback(0);
307 
308  set<string> use_these;
309  x_FindUsedGis(*rset[0].GetSeqAlign(), use_these);
310 
311  BOOST_REQUIRE(use_these.empty());
312 }
313 
314 // Traceback without Seq-align
315 BOOST_AUTO_TEST_CASE(SimpleTraceback)
316 {
317  // Build uniform search factory, get options
319  CRef<CBlastOptionsHandle> opth(&* sf->GetOptions(eBlastp));
320 
321  // Get a SeqDB and a query factory... This uses two SeqDB
322  // objects in the gi_list case, so that it is possible to
323  // fetch the query, which is not in the GI list.
324 
325  CRef<CSeqDB> query_seqdb(new CSeqDB("nr", CSeqDB::eProtein));
326  CRef<CSeqDB> subject_seqdb;
327 
328  subject_seqdb = query_seqdb;
329 
330  CSeq_id query("NP_056193");
331  unique_ptr<SSeqLoc> sl(CTestObjMgr::Instance().CreateSSeqLoc(query));
332  TSeqLocVector qv;
333  qv.push_back(*sl);
335 
336  // Note that the traceback code will (in some cases) modify
337  // the options object.
338 
340  opts(& const_cast<CBlastOptions&>(opth->GetOptions()));
341 
342  // Construct false HSPs.
344  hsps(x_GetSampleHspStream(opts, *subject_seqdb));
345 
346  // Now to do the traceback..
347 
348  // Build the object itself
350 
351  BOOST_REQUIRE(subject_seqdb.NotEmpty());
352  CBlastSeqSrc seq_src = SeqDbBlastSeqSrcInit(subject_seqdb);
353  CRef<blast::IBlastSeqInfoSrc> seq_info_src(new blast::CSeqDbSeqInfoSrc(subject_seqdb));
354  tbs.Reset(new CBlastTracebackSearch(qf, opts, seq_src.Get(), seq_info_src, hsps));
355 
356  BlastHSPResults* hsp = tbs->RunSimple();
357 
358  BOOST_REQUIRE_EQUAL(1, (int)hsp->num_queries);
359 
360  BlastHitList* hitlist = hsp->hitlist_array[0];
361 
362  BOOST_REQUIRE_EQUAL(1, (int)hitlist->hsplist_count);
363 }
364 
365 BOOST_AUTO_TEST_CASE(TracebackWithPssm_AndWarning) {
366  // read the pssm
367  const string kPssmFile("data/pssm_zero_fratios.asn");
369  TestUtil::ReadObject<CPssmWithParameters>(kPssmFile);
370 
371  // set up the database
372  CRef<CSeqDB> subject_seqdb(new CSeqDB("nr", CSeqDB::eProtein));
373 
374  CSeq_id query("P01013");
375  unique_ptr<SSeqLoc> sl(CTestObjMgr::Instance().CreateSSeqLoc(query));
376  TSeqLocVector qv;
377  qv.push_back(*sl);
379 
380  // get the options
383  opts(& const_cast<CBlastOptions&>(opth->GetOptions()));
384 
385  // Construct false HSPs.
387  hsps(x_GetSelfHitHspStream(opts, *subject_seqdb, query));
388 
389  // Build the object itself
390  CBlastSeqSrc seq_src = SeqDbBlastSeqSrcInit(subject_seqdb);
391  CRef<blast::IBlastSeqInfoSrc> seq_info_src(new blast::CSeqDbSeqInfoSrc(subject_seqdb));
393  (new CBlastTracebackSearch(qf, opts, seq_src.Get(), seq_info_src, hsps, pssm));
394 
395  CSearchResultSet v = *tbs->Run();
396 
397  BOOST_REQUIRE_EQUAL(1, (int)v.GetNumResults());
398  BOOST_REQUIRE_EQUAL(0, (int)v[0].GetErrors().size());
399 
400  TQueryMessages qm = v[0].GetErrors(eBlastSevWarning);
401  BOOST_REQUIRE_EQUAL(2, (int)qm.size());
402 
403  const char* msg = "Frequency ratios for PSSM are all zeros";
404  BOOST_REQUIRE(qm.front()->GetMessage().find(msg) != string::npos);
405 
406 }
407 
408 BOOST_AUTO_TEST_CASE(TracebackEntrez) {
409  CRef<CSeqDBGiList> gi_list
410  (new CSeqDBFileGiList("data/Sample_gilist.p.gil", CSeqDBFileGiList::eSiList));
411 
412  CSearchResultSet rset = x_Traceback(gi_list.GetPointerOrNull());
413 
414  set<string> use_these;
415  x_FindUsedGis(*rset[0].GetSeqAlign(), use_these);
416 
417  BOOST_REQUIRE_EQUAL((int)use_these.size(), 1);
419  BOOST_REQUIRE(*(use_these.begin()) == "seqid:EAL40459.3");
420  }
421 }
422 
424 
425 
void Blast_HSPListSortByScore(BlastHSPList *hsp_list)
Sort the HSPs in an HSP list by score.
Definition: blast_hits.c:1374
BlastHSPWriter * BlastHSPWriterNew(BlastHSPWriterInfo **writer_info, BlastQueryInfo *query_info, BLAST_SequenceBlk *query)
A generic function to create writer.
Declaration of ADT to save and retrieve lists of HSPs in the BLAST engine.
int BlastHSPStreamWrite(BlastHSPStream *hsp_stream, BlastHSPList **hsp_list)
Invokes the user-specified write function for this BlastHSPStream implementation.
BlastHSPStream * BlastHSPStreamFree(BlastHSPStream *hsp_stream)
Frees the BlastHSPStream structure by invoking the destructor function set by the user-defined constr...
BlastHSPStream * BlastHSPStreamNew(EBlastProgramType program, const BlastExtensionOptions *extn_opts, Boolean sort_on_read, Int4 num_queries, BlastHSPWriter *writer)
Initialize the HSP stream.
@ eBlastSevWarning
Definition: blast_message.h:57
Defines interface for retrieving sequence identifiers.
@ eBlastp
Protein-Protein.
Definition: blast_types.hpp:59
@ ePSIBlast
PSI Blast.
Definition: blast_types.hpp:67
BOOST_AUTO_TEST_SUITE_END() static int s_GetSegmentFlags(const CBioseq &bioseq)
Encapsulates ALL the BLAST algorithm's options.
Wrapper class for BlastSeqSrc .
Definition: blast_aux.hpp:350
Factory for CLocalSearch.
NCBI C++ Object Manager dependant implementation of IQueryFactory.
CRef –.
Definition: ncbiobj.hpp:618
Search Results for All Queries.
CSeqDBFileGiList.
CSeqDBGiList.
CSeqDB.
Definition: seqdb.hpp:161
int GetSeqLength(int oid) const
Returns the sequence length in base pairs or residues.
Definition: seqdb.cpp:400
@ eProtein
Definition: seqdb.hpp:174
void SeqidToOids(const CSeq_id &seqid, vector< int > &oids) const
Translate a Seq-id to a list of OIDs.
Definition: seqdb.cpp:896
static CTestObjMgr & Instance()
Definition: test_objmgr.cpp:69
CRef< CStructWrapper< BlastHSPStream > > x_GetSelfHitHspStream(CRef< CBlastOptions > opts, CSeqDB &db, CSeq_id &sid)
CRef< CStructWrapper< BlastHSPStream > > x_GetSampleHspStream(CRef< CBlastOptions > opts, CSeqDB &db)
CSearchResultSet x_Traceback(CSeqDBGiList *gi_list)
void x_FindUsedGis(const CSeq_align_set &aset, set< string > &used)
Class for the messages for an individual query sequence.
iterator_bool insert(const value_type &val)
Definition: set.hpp:149
const_iterator begin() const
Definition: set.hpp:135
void clear()
Definition: set.hpp:153
size_type size() const
Definition: set.hpp:132
bool empty() const
Definition: set.hpp:133
static const char * str(char *buf, int n)
Definition: stats.c:84
BlastHitSavingOptions * GetHitSaveOpts() const
Returns BlastHitSavingOptions for eLocal objects, NULL for eRemote.
BlastSeqSrc * Get() const
Definition: blast_aux.hpp:350
BlastExtensionOptions * GetExtnOpts() const
Returns BlastExtensionOptions for eLocal objects, NULL for eRemote.
BlastSeqSrc * SeqDbBlastSeqSrcInit(const string &dbname, bool is_prot, Uint4 first_seq=0, Uint4 last_seq=0, Int4 mask_algo_id=-1, ESubjectMaskingType mask_type=eNoSubjMasking)
Initialize the sequence source structure.
CStructWrapper< TData > * WrapStruct(TData *obj, TData *(*del)(TData *))
Auxiliary function to create a CStructWrapper for a pointer to an object.
CRef< CSearchResultSet > Run()
Run the traceback search.
static CBlastOptionsHandle * Create(EProgram program, EAPILocality locality=CBlastOptions::eLocal)
Creates an options handle object configured with default options for the requested program,...
BlastHSPResults * RunSimple()
Runs the traceback but only returns the HSP's and not the Seq-Align.
EBlastProgramType GetProgramType() const
Returns the CORE BLAST notion of program type.
const CBlastOptions & GetOptions() const
Return the object which this object is a handle for.
BlastScoringOptions * GetScoringOpts() const
Returns BlastScoringOptions for eLocal objects, NULL for eRemote.
size_type GetNumResults() const
Return the number of results contained by this object.
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
#define NULL
Definition: ncbistd.hpp:225
static bool PreferAccessionOverGi(void)
Check if the option to prefer accession.version over GI is enabled (SeqId/PreferAccessionOverGi or SE...
Definition: Seq_id.cpp:3404
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:773
bool NotEmpty(void) const THROWS_NONE
Check if CRef is not empty – pointing to an object and has a non-null value.
Definition: ncbiobj.hpp:726
TObjectType * GetPointerOrNull(void) THROWS_NONE
Get pointer value.
Definition: ncbiobj.hpp:986
bool IsSetData(void) const
the object itself Check if a value has been assigned to Data data member.
bool IsStr(void) const
Check if variant Str is selected.
Definition: Object_id_.hpp:291
bool IsSetType(void) const
type of object within class Check if a value has been assigned to Type data member.
const TStrs & GetStrs(void) const
Get the variant data.
const TData & GetData(void) const
Get the Data member data.
bool IsSetLabel(void) const
field label Check if a value has been assigned to Label data member.
const TStr & GetStr(void) const
Get the variant data.
Definition: Object_id_.hpp:297
const TData & GetData(void) const
Get the Data member data.
const TLabel & GetLabel(void) const
Get the Label member data.
const TType & GetType(void) const
Get the Type member data.
vector< CRef< CUser_field > > TData
list< CRef< CSeq_align > > Tdata
const Tdata & Get(void) const
Get the member data.
Implementation of a number of BlastHSPWriters to save hits from a BLAST search, and subsequently retu...
BlastHSPCollectorParams * BlastHSPCollectorParamsNew(const BlastHitSavingOptions *hit_options, Int4 compositionBasedStats, Boolean gapped_calculation)
Sets up parameter set for use by collector.
BlastHSPWriterInfo * BlastHSPCollectorInfoNew(BlastHSPCollectorParams *params)
WriterInfo to create a default writer: the collecter.
Implementation of the uniform BLAST search interface for searching locally installed BLAST databases.
const struct ncbi::grid::netcache::search::fields::SIZE size
Magic spell ;-) needed for some weird compilers... very empiric.
#define FALSE
bool replacment for C indicating false.
Definition: ncbi_std.h:101
NOTE: This file contains work in progress and the APIs are likely to change, please do not rely on th...
Utilities to develop and debug unit tests for BLAST.
Defines BLAST database access classes.
Defines a concrete strategy for the IBlastSeqInfoSrc interface for sequence identifiers retrieval fro...
Implementation of the BlastSeqSrc interface using the C++ BLAST databases API.
vector< SSeqLoc > TSeqLocVector
Vector of sequence locations.
Definition: sseqloc.hpp:129
Int4 compositionBasedStats
mode of compositional adjustment to use; if zero then compositional adjustment is not used
The structure to hold all HSPs for a given sequence after the gapped alignment.
Definition: blast_hits.h:153
Boolean do_not_reallocate
Is reallocation of the hsp_array allowed?
Definition: blast_hits.h:161
Int4 oid
The ordinal id of the subject sequence this HSP list is for.
Definition: blast_hits.h:154
Int4 hspcnt
Number of HSPs saved.
Definition: blast_hits.h:158
BlastHSP ** hsp_array
Array of pointers to individual HSPs.
Definition: blast_hits.h:157
Int4 hsp_max
The maximal number of HSPs allowed to be saved.
Definition: blast_hits.h:160
Int4 allocated
The allocated size of the hsp_array.
Definition: blast_hits.h:159
The structure to contain all BLAST results, for multiple queries.
Definition: blast_hits.h:183
BlastHitList ** hitlist_array
Array of results for individual query sequences.
Definition: blast_hits.h:185
Int4 num_queries
Number of query sequences.
Definition: blast_hits.h:184
Default implementation of BlastHSPStream.
A wrap of data structure used to create a writer.
ADT definition of BlastHSPWriter.
Structure holding all information about an HSP.
Definition: blast_hits.h:126
BlastSeg query
Query sequence info.
Definition: blast_hits.h:131
BlastSeg subject
Subject sequence info.
Definition: blast_hits.h:132
Int4 score
This HSP's raw score.
Definition: blast_hits.h:127
The structure to contain all BLAST results for one query sequence.
Definition: blast_hits.h:169
Int4 hsplist_count
Filled size of the HSP lists array.
Definition: blast_hits.h:170
Boolean gapped_calculation
gap-free search if FALSE
Int4 end
End of hsp.
Definition: blast_hits.h:99
Int4 gapped_start
Where the gapped extension started.
Definition: blast_hits.h:100
Int4 offset
Start of hsp.
Definition: blast_hits.h:98
static string query
Utility stuff for more convenient using of Boost.Test library.
NOTE: This file contains work in progress and the APIs are likely to change, please do not rely on th...
BOOST_AUTO_TEST_CASE(Traceback)
voidp malloc(uInt size)
voidp calloc(uInt items, uInt size)
Modified on Tue Apr 30 06:41:03 2024 by modify_doxy.py rev. 669887