1 /*  $Id: names.cpp 591152 2019-08-12 11:18:21Z fongah2 $
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  *   Define names and value types for options known to blast4.
30  *
31  */
32 
33 #include <ncbi_pch.hpp>
34 #include <objects/blast/names.hpp>
35 #include <objects/blast/blast__.hpp>
36 #include <objects/scoremat/scoremat__.hpp>
37 #include <corelib/ncbimtx.hpp>
38 
39 BEGIN_NCBI_SCOPE
40 
41 BEGIN_objects_SCOPE // namespace ncbi::objects::
42 
43 CBlast4Field::TFieldMap CBlast4Field::m_Fields;
Get(EBlastOptIdx opt)44 CBlast4Field & CBlast4Field::Get(EBlastOptIdx opt)
45 {
46 	{
47    	DEFINE_STATIC_MUTEX(mx);
48    	CMutexGuard guard(mx);
49     if (m_Fields.count(opt) == 0) {
50         switch (opt) {
51         //case eBlastOpt_Program:
52         case eBlastOpt_WordThreshold:
53             m_Fields[opt] = CBlast4Field("WordThreshold",         CBlast4_value::e_Integer);
54             break;
55         //case eBlastOpt_LookupTableType:  // not found
56         case eBlastOpt_WordSize:
57             m_Fields[opt] = CBlast4Field("WordSize",              CBlast4_value::e_Integer);
58             break;
59         //case eBlastOpt_AlphabetSize: //not found
60         case eBlastOpt_MBTemplateLength:
61             m_Fields[opt] = CBlast4Field("MBTemplateLength",      CBlast4_value::e_Integer);
62             break;
63         case eBlastOpt_MBTemplateType:
64             m_Fields[opt] = CBlast4Field("MBTemplateType",        CBlast4_value::e_Integer);
65             break;
66         case eBlastOpt_FilterString:
67             m_Fields[opt] = CBlast4Field("FilterString",          CBlast4_value::e_String);
68             break;
69         case eBlastOpt_MaskAtHash:
70             m_Fields[opt] = CBlast4Field("MaskAtHash",            CBlast4_value::e_Boolean);
71             break;
72         case eBlastOpt_DustFiltering:
73             m_Fields[opt] = CBlast4Field("DustFiltering",         CBlast4_value::e_Boolean);
74             break;
75         case eBlastOpt_DustFilteringLevel:
76             m_Fields[opt] = CBlast4Field("DustFilteringLevel",    CBlast4_value::e_Integer);
77             break;
78         case eBlastOpt_DustFilteringWindow:
79             m_Fields[opt] = CBlast4Field("DustFilteringWindow",   CBlast4_value::e_Integer);
80             break;
81         case eBlastOpt_DustFilteringLinker:
82             m_Fields[opt] = CBlast4Field("DustFilteringLinker",   CBlast4_value::e_Integer);
83             break;
84         case eBlastOpt_SegFiltering:
85             m_Fields[opt] = CBlast4Field("SegFiltering",          CBlast4_value::e_Boolean);
86             break;
87         case eBlastOpt_SegFilteringWindow:
88             m_Fields[opt] = CBlast4Field("SegFilteringWindow",    CBlast4_value::e_Integer);
89             break;
90         case eBlastOpt_SegFilteringLocut:
91             m_Fields[opt] = CBlast4Field("SegFilteringLocut",     CBlast4_value::e_Real);
92             break;
93         case eBlastOpt_SegFilteringHicut:
94             m_Fields[opt] = CBlast4Field("SegFilteringHicut",     CBlast4_value::e_Real);
95             break;
96         case eBlastOpt_RepeatFiltering:
97             m_Fields[opt] = CBlast4Field("RepeatFiltering",       CBlast4_value::e_Boolean);
98             break;
99         case eBlastOpt_RepeatFilteringDB:
100             m_Fields[opt] = CBlast4Field("RepeatFilteringDB",     CBlast4_value::e_String);
101             break;
102         case eBlastOpt_StrandOption:
103             m_Fields[opt] = CBlast4Field("StrandOption",          CBlast4_value::e_Strand_type);
104             break;
105         case eBlastOpt_QueryGeneticCode:
106             m_Fields[opt] = CBlast4Field("QueryGeneticCode",      CBlast4_value::e_Integer);
107             break;
108         case eBlastOpt_WindowSize:
109             m_Fields[opt] = CBlast4Field("WindowSize",            CBlast4_value::e_Integer);
110             break;
111         //case eBlastOpt_SeedContainerType:    // not found
112         //case eBlastOpt_SeedExtensionMethod:  // not found
113         //case eBlastOpt_XDropoff: //not found
114         case eBlastOpt_GapXDropoff:
115             m_Fields[opt] = CBlast4Field("GapXDropoff",           CBlast4_value::e_Real);
116             break;
117         case eBlastOpt_GapXDropoffFinal:
118             m_Fields[opt] = CBlast4Field("GapXDropoffFinal",      CBlast4_value::e_Real);
119             break;
120         case eBlastOpt_GapTrigger:
121             m_Fields[opt] = CBlast4Field("GapTrigger",            CBlast4_value::e_Real);
122             break;
123         case eBlastOpt_GapExtnAlgorithm:
124             m_Fields[opt] = CBlast4Field("GapExtnAlgorithm",      CBlast4_value::e_Integer);
125             break;
126         case eBlastOpt_HitlistSize:
127             m_Fields[opt] = CBlast4Field("HitlistSize",           CBlast4_value::e_Integer);
128         //case eBlastOpt_MaxNumHspPerSequence:     // not found
129             break;
130         case eBlastOpt_CullingLimit:
131             m_Fields[opt] = CBlast4Field("Culling",               CBlast4_value::e_Integer);
132             break;
133         case eBlastOpt_EvalueThreshold:
134             m_Fields[opt] = CBlast4Field("EvalueThreshold",       CBlast4_value::e_Cutoff);
135             break;
136         case eBlastOpt_CutoffScore:
137             m_Fields[opt] = CBlast4Field("CutoffScore",           CBlast4_value::e_Cutoff);
138             break;
139         case eBlastOpt_PercentIdentity:
140             m_Fields[opt] = CBlast4Field("PercentIdentity",       CBlast4_value::e_Real);
141             break;
142         case eBlastOpt_QueryCovHspPerc:
143             m_Fields[opt] = CBlast4Field("QueryCovHspPerc",       CBlast4_value::e_Real);
144             break;
145         case eBlastOpt_MaxHspsPerSubject:
146             m_Fields[opt] = CBlast4Field("MaxHspsPerSubject",     CBlast4_value::e_Integer);
147             break;
148         case eBlastOpt_SumStatisticsMode:
149             m_Fields[opt] = CBlast4Field("SumStatistics",         CBlast4_value::e_Boolean);
150             break;
151         case eBlastOpt_LongestIntronLength:
152             m_Fields[opt] = CBlast4Field("LongestIntronLength",   CBlast4_value::e_Integer);
153             break;
154         case eBlastOpt_GappedMode:   // same as !ungapped mode
155             m_Fields[opt] = CBlast4Field("UngappedMode",          CBlast4_value::e_Boolean);
156             break;
157         case eBlastOpt_ComplexityAdjMode:  // -RMH-
158             m_Fields[opt] = CBlast4Field("ComplexityAdjustMode",          CBlast4_value::e_Boolean);
159             break;
160         case eBlastOpt_MaskLevel:  // -RMH-
161             m_Fields[opt] = CBlast4Field("MaskLevel",             CBlast4_value::e_Integer);
162             break;
163         case eBlastOpt_MatrixName:
164             m_Fields[opt] = CBlast4Field("MatrixName",            CBlast4_value::e_String);
165             break;
166         //case eBlastOpt_MatrixPath:       // not found
167         case eBlastOpt_MatchReward:
168             m_Fields[opt] = CBlast4Field("MatchReward",           CBlast4_value::e_Integer);
169             break;
170         case eBlastOpt_MismatchPenalty:
171             m_Fields[opt] = CBlast4Field("MismatchPenalty",       CBlast4_value::e_Integer);
172             break;
173         case eBlastOpt_GapOpeningCost:
174             m_Fields[opt] = CBlast4Field("GapOpeningCost",        CBlast4_value::e_Integer);
175             break;
176         case eBlastOpt_GapExtensionCost:
177             m_Fields[opt] = CBlast4Field("GapExtensionCost",      CBlast4_value::e_Integer);
178             break;
179         //case eBlastOpt_FrameShiftPenalty:    // not found
180         case eBlastOpt_OutOfFrameMode:
181             m_Fields[opt] = CBlast4Field("OutOfFrameMode",        CBlast4_value::e_Boolean);
182             break;
183         case eBlastOpt_DbLength:
184             m_Fields[opt] = CBlast4Field("DbLength",              CBlast4_value::e_Big_integer);
185             break;
186         //case eBlastOpt_DbSeqNum:     // not found
187         case eBlastOpt_EffectiveSearchSpace:
188             m_Fields[opt] = CBlast4Field("EffectiveSearchSpace",  CBlast4_value::e_Big_integer);
189             break;
190         case eBlastOpt_DbGeneticCode:
191             m_Fields[opt] = CBlast4Field("DbGeneticCode",         CBlast4_value::e_Integer);
192             break;
193         case eBlastOpt_PHIPattern:
194             m_Fields[opt] = CBlast4Field("PHIPattern",            CBlast4_value::e_String);
195             break;
196         case eBlastOpt_InclusionThreshold:
197             m_Fields[opt] = CBlast4Field("InclusionThreshold",    CBlast4_value::e_Real);
198             break;
199         case eBlastOpt_PseudoCount:
200             m_Fields[opt] = CBlast4Field("PseudoCountWeight",     CBlast4_value::e_Integer);
201             break;
202         case eBlastOpt_GapTracebackAlgorithm:
203             m_Fields[opt] = CBlast4Field("GapTracebackAlgorithm", CBlast4_value::e_Integer);
204             break;
205         case eBlastOpt_CompositionBasedStats:
206             m_Fields[opt] = CBlast4Field("CompositionBasedStats", CBlast4_value::e_Integer);
207             break;
208         case eBlastOpt_SmithWatermanMode:
209             m_Fields[opt] = CBlast4Field("SmithWatermanMode",     CBlast4_value::e_Boolean);
210             break;
211         case eBlastOpt_UnifiedP:
212             m_Fields[opt] = CBlast4Field("UnifiedP",              CBlast4_value::e_Integer);
213             break;
214         case eBlastOpt_WindowMaskerDatabase:
215             m_Fields[opt] = CBlast4Field("WindowMaskerDatabase",  CBlast4_value::e_String);
216             break;
217         case eBlastOpt_WindowMaskerTaxId:
218             m_Fields[opt] = CBlast4Field("WindowMaskerTaxId",     CBlast4_value::e_Integer);
219             break;
220         case eBlastOpt_ForceMbIndex:         // corresponds to -use_index flag
221             m_Fields[opt] = CBlast4Field("ForceMbIndex",          CBlast4_value::e_Boolean);
222             break;
223         case eBlastOpt_MbIndexName:          // corresponds to -index_name flag
224             m_Fields[opt] = CBlast4Field("MbIndexName",           CBlast4_value::e_String);
225             break;
226         case eBlastOpt_BestHitScoreEdge:
227             m_Fields[opt] = CBlast4Field("BestHitScoreEdge",      CBlast4_value::e_Real);
228             break;
229         case eBlastOpt_BestHitOverhang:
230             m_Fields[opt] = CBlast4Field("BestHitOverhang",       CBlast4_value::e_Real);
231             break;
232         case eBlastOpt_SubjectBestHit:  // corresponds to -subject_besthit flag
233             m_Fields[opt] = CBlast4Field("UseSubjectBestHit",     CBlast4_value::e_Boolean);
234             break;
235         case eBlastOpt_IgnoreMsaMaster:
236             m_Fields[opt] = CBlast4Field("IgnoreMsaMaster",       CBlast4_value::e_Boolean);
237             break;
238         case eBlastOpt_DomainInclusionThreshold:  // options for DELTA-BLAST
239             m_Fields[opt] = CBlast4Field("DomainInclusionThreshold", CBlast4_value::e_Real);
240             break;
241 
242         // Added to provide access to these options, they don't have a usage in
243         case eBlastOpt_Culling:
244             m_Fields[opt] = CBlast4Field("Culling",               CBlast4_value::e_Boolean);
245             break;
246         case eBlastOpt_EntrezQuery:
247             m_Fields[opt] = CBlast4Field("EntrezQuery",           CBlast4_value::e_String);
248             break;
249         case eBlastOpt_FinalDbSeq:
250             m_Fields[opt] = CBlast4Field("FinalDbSeq",            CBlast4_value::e_Integer);
251             break;
252         case eBlastOpt_FirstDbSeq:
253             m_Fields[opt] = CBlast4Field("FirstDbSeq",            CBlast4_value::e_Integer);
254             break;
255         case eBlastOpt_GiList:
256             m_Fields[opt] = CBlast4Field("GiList",                CBlast4_value::e_Integer_list);
257             break;
258         case eBlastOpt_DbFilteringAlgorithmId:
259             m_Fields[opt] = CBlast4Field("DbFilteringAlgorithmId",CBlast4_value::e_Integer);
260             break;
261         case eBlastOpt_DbFilteringAlgorithmKey:
262             m_Fields[opt] = CBlast4Field("DbFilteringAlgorithmKey",CBlast4_value::e_String);
263             break;
264         case eBlastOpt_SubjectMaskingType:
265             m_Fields[opt] = CBlast4Field("SubjectMaskingType",    CBlast4_value::e_Integer);
266             break;
267         case eBlastOpt_HspRangeMax:
268             m_Fields[opt] = CBlast4Field("HspRangeMax",           CBlast4_value::e_Integer);
269             break;
270         case eBlastOpt_LCaseMask:
271             m_Fields[opt] = CBlast4Field("LCaseMask",             CBlast4_value::e_Query_mask);
272             break;
273         case eBlastOpt_MatrixTable:
274             m_Fields[opt] = CBlast4Field("MatrixTable",           CBlast4_value::e_Matrix);
275             break;
276         case eBlastOpt_NegativeGiList:
277             m_Fields[opt] = CBlast4Field("NegativeGiList",        CBlast4_value::e_Integer_list);
278             break;
279         case eBlastOpt_RequiredEnd:
280             m_Fields[opt] = CBlast4Field("RequiredEnd",           CBlast4_value::e_Integer);
281             break;
282         case eBlastOpt_RequiredStart:
283             m_Fields[opt] = CBlast4Field("RequiredStart",         CBlast4_value::e_Integer);
284             break;
285         case eBlastOpt_UseRealDbSize:
286             m_Fields[opt] = CBlast4Field("UseRealDbSize",         CBlast4_value::e_Boolean);
287             break;
288         case eBlastOpt_TaxidList:
289             m_Fields[opt] = CBlast4Field("TaxidList",             CBlast4_value::e_Integer_list);
290             break;
291         case eBlastOpt_NegativeTaxidList:
292             m_Fields[opt] = CBlast4Field("NegativeTaxidList",     CBlast4_value::e_Integer_list);
293             break;
294 
295 // List of web-related options
296         case eBlastOpt_Web_BlastSpecialPage:
297             m_Fields[opt] = CBlast4Field("Web_BlastSpecialPage", CBlast4_value::e_String);
298             break;
299         case eBlastOpt_Web_EntrezQuery:
300             m_Fields[opt] = CBlast4Field("Web_EntrezQuery",      CBlast4_value::e_String);
301             break;
302         case eBlastOpt_Web_JobTitle:
303             m_Fields[opt] = CBlast4Field("Web_JobTitle",         CBlast4_value::e_String);
304             break;
305         case eBlastOpt_Web_NewWindow:
306             m_Fields[opt] = CBlast4Field("Web_NewWindow",        CBlast4_value::e_Boolean);
307             break;
308         case eBlastOpt_Web_OrganismName:
309             m_Fields[opt] = CBlast4Field("Web_OrganismName",     CBlast4_value::e_String);
310             break;
311         case eBlastOpt_Web_RunPsiBlast:
312             m_Fields[opt] = CBlast4Field("Web_RunPsiBlast",      CBlast4_value::e_Boolean);
313             break;
314         case eBlastOpt_Web_ShortQueryAdjust:
315             m_Fields[opt] = CBlast4Field("Web_ShortQueryAdjust", CBlast4_value::e_Boolean);
316             break;
317         case eBlastOpt_Web_StepNumber:
318             m_Fields[opt] = CBlast4Field("Web_StepNumber",       CBlast4_value::e_Integer);
319             break;
320         case eBlastOpt_Web_DBInput:
321             m_Fields[opt] = CBlast4Field("Web_DBInput", 	      CBlast4_value::e_Boolean);
322             break;
323         case eBlastOpt_Web_DBGroup:
324             m_Fields[opt] = CBlast4Field("Web_DBGroup",          CBlast4_value::e_String);
325             break;
326         case eBlastOpt_Web_DBSubgroupName:
327             m_Fields[opt] = CBlast4Field("Web_DBSubgroupName",   CBlast4_value::e_String);
328             break;
329         case eBlastOpt_Web_DBSubgroup:
330             m_Fields[opt] = CBlast4Field("Web_DBSubgroup",       CBlast4_value::e_String);
331             break;
332         case eBlastOpt_Web_ExclModels:
333             m_Fields[opt] = CBlast4Field("Web_ExclModels",       CBlast4_value::e_Boolean);
334             break;
335         case eBlastOpt_Web_ExclSeqUncult:
336             m_Fields[opt] = CBlast4Field("Web_SeqUncult",        CBlast4_value::e_Boolean);
337             break;
338 
339         default:
340             ERR_POST(Warning << "Undefined remote BLAST options used");
341             m_Fields[opt] = CBlast4Field("-",        CBlast4_value::e_not_set);
342             break;
343         }
344     }
345 	}
346     _ASSERT(m_Fields.count(opt) != 0);
347     return m_Fields[opt];
348 }
349 
GetName(EBlastOptIdx opt)350 const string & CBlast4Field::GetName(EBlastOptIdx opt)
351 {
352     return CBlast4Field::Get(opt).GetName();
353 }
354 
GetName() const355 const string & CBlast4Field::GetName() const
356 {
357     return m_Name;
358 }
359 
GetType() const360 CBlast4_value::E_Choice CBlast4Field::GetType() const
361 {
362     return m_Type;
363 }
364 
Match(const CBlast4_parameter & p) const365 bool CBlast4Field::Match(const CBlast4_parameter & p) const
366 {
367     return (p.CanGetName()        &&
368             p.CanGetValue()       &&
369             p.GetValue().Which() == m_Type  &&
370             p.GetName() == m_Name);
371 }
372 
GetString(const CBlast4_parameter & p) const373 string CBlast4Field::GetString(const CBlast4_parameter & p) const
374 {
375     _ASSERT(Match(p));
376     return p.GetValue().GetString();
377 }
378 
GetBoolean(const CBlast4_parameter & p) const379 bool CBlast4Field::GetBoolean(const CBlast4_parameter & p) const
380 {
381     _ASSERT(Match(p));
382     return p.GetValue().GetBoolean();
383 }
384 
GetBig_integer(const CBlast4_parameter & p) const385 Int8 CBlast4Field::GetBig_integer(const CBlast4_parameter & p) const
386 {
387     _ASSERT(Match(p));
388     return p.GetValue().GetBig_integer();
389 }
390 
391 CConstRef<CBlast4_cutoff>
GetCutoff(const CBlast4_parameter & p) const392 CBlast4Field::GetCutoff(const CBlast4_parameter & p) const
393 {
394     _ASSERT(Match(p));
395     return CConstRef<CBlast4_cutoff>(& p.GetValue().GetCutoff());
396 }
397 
GetInteger(const CBlast4_parameter & p) const398 int CBlast4Field::GetInteger(const CBlast4_parameter & p) const
399 {
400     _ASSERT(Match(p));
401     return p.GetValue().GetInteger();
402 }
403 
GetIntegerList(const CBlast4_parameter & p) const404 list<int> CBlast4Field::GetIntegerList (const CBlast4_parameter & p) const
405 {
406     _ASSERT(Match(p));
407     return p.GetValue().GetInteger_list();
408 }
409 
410 CConstRef<CPssmWithParameters>
GetMatrix(const CBlast4_parameter & p) const411 CBlast4Field::GetMatrix(const CBlast4_parameter & p) const
412 {
413     _ASSERT(Match(p));
414     return CConstRef<CPssmWithParameters>(& p.GetValue().GetMatrix());
415 }
416 
417 CConstRef<CBlast4_mask>
GetQueryMask(const CBlast4_parameter & p) const418 CBlast4Field::GetQueryMask(const CBlast4_parameter & p) const
419 {
420     _ASSERT(Match(p));
421     return CConstRef<CBlast4_mask>(& p.GetValue().GetQuery_mask());
422 }
423 
GetReal(const CBlast4_parameter & p) const424 double CBlast4Field::GetReal(const CBlast4_parameter & p) const
425 {
426     _ASSERT(Match(p));
427     return p.GetValue().GetReal();
428 }
429 
430 EBlast4_strand_type
GetStrandType(const CBlast4_parameter & p) const431 CBlast4Field::GetStrandType(const CBlast4_parameter & p) const
432 {
433     _ASSERT(Match(p));
434     return p.GetValue().GetStrand_type();
435 }
436 
437 const char* kBlast4SearchInfoReqName_Search("search");
438 const char* kBlast4SearchInfoReqName_Alignment("alignment");
439 const char* kBlast4SearchInfoReqValue_Status("status");
440 const char* kBlast4SearchInfoReqValue_Title("title");
441 const char* kBlast4SearchInfoReqValue_Subjects("subjects");
442 const char* kBlast4SearchInfoReqValue_PsiIterationNum("psi_iteration_number");
443 
444 /// Auxiliary function to consistently build the Blast4-get-search-info-reply
445 /// names
Blast4SearchInfo_BuildReplyName(const string & name,const string & value)446 string Blast4SearchInfo_BuildReplyName(const string& name, const string& value)
447 {
448     return name + string("-") + value;
449 }
450 
451 END_objects_SCOPE // namespace ncbi::objects::
452 
453 END_NCBI_SCOPE
454