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

Go to the SVN repository for this file.

1 /* $Id: vcf_ds.cpp 47479 2023-05-02 13:24:02Z ucko $
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  * Authors: Liangshou Wu
27  *
28  */
29 #include <ncbi_pch.hpp>
30 
35 
38 
41 
42 #include <objmgr/util/feature.hpp>
43 #include <objmgr/util/sequence.hpp>
49 
51 
52 #include <serial/serial.hpp>
53 #include <connect/ncbi_types.h>
55 #include <serial/objistr.hpp>
56 
58 
59 #include <chrono>
60 
63 
64 // the maximal number of objects allowed to show without smearing
65 static const int kMaxObjNum = 250000;
66 
67 // the maximal number of children in parent/child situations dictated by approximation of screen size limits
68 static const size_t kMaxChildNum = 500;
69 // the zoom level that allows to show sequence
70 static const float kSeqZoomLevel = 0.125;
71 
72 // create feature product mapping if scale (m_Window) is less than this value
73 static const float kMinScaleForMapping = 16.;
74 
75 // the maximum number of features to show before switching to histogram mode
76 static const int kMaxFeatures = 500;
77 
78 static CRef<CVcfVariant> s_CreateVcfGlyph(const objects::CSeq_id &seq_id, const CVCFVariant_CI &variant_CI)
79 {
80  CRef<CVcfVariant> result{ new CVcfVariant( seq_id, variant_CI.GetVariantID(), variant_CI.GetPosition(), variant_CI.GetRef(), variant_CI.GetAlt()) };
81  static const vector<string> info_fields{ "SVTYPE", "POS", "END", "CIPOS", "CIEND", "SVLEN", "CLNSIG", "CLNREVSTAT", "CLNVC", "CLNVCSO", "MC", "RS", "DBVARID" };
82  if (variant_CI.IsSetInfo()) {
83  auto &info_map = result->SetInfoColumns();
84  for (const auto &field : info_fields) {
85  if (!variant_CI.IsSetInfoField(field))
86  continue;
87  info_map[field] = variant_CI.GetInfoField(field);
88  }
89  result->ParseInfoColumns();
90  }
91  return result;
92 }
93 
94 static void s_DoSearch(const CSeq_id* seq_id, const INonAsnTrackData::TDataBlob& vcf_blob, const string& sSearchTerm, list<CRef<CObject>>& results)
95 {
96  results.clear();
97  vector<unsigned> blob_pos;
99  CVCFSlicedVariants variants(vcf_blob, nullptr, data_cols);
100  variants.GetPositionsForVariant(sSearchTerm, blob_pos);
101 
102  for(auto pos: blob_pos) {
103  TSeqRange variant_range(pos, pos);
104  CVCFSlicedVariants range_variants(vcf_blob, &variant_range, data_cols, true);
105  CVCFVariant_CI variant_CI(range_variants);
106 
107  while (variant_CI.IsValid()) {
108  CRef<CVcfVariant> vcf_object{ s_CreateVcfGlyph(*seq_id, variant_CI) };
109  if (vcf_object && vcf_object->GetID() == sSearchTerm) {
110  results.push_back(vcf_object);
111  }
112  ++variant_CI;
113  }
114  }
115 }
116 
117 
119 {
120  return string(typeid(CVcfFeatureDSType).name());
121 }
122 
123 // performs some sort of a search in data and place results into a list of objects
124 void CVcfTrackData::DoSearch(const CSeq_id* seq_id, const string& sSearchTerm, list<CRef<CObject>>& results) const
125 {
126  s_DoSearch(seq_id, GetBlob(), sSearchTerm, results);
127 }
128 
129 
131 {
132  do {
133  if (!prj_item.IsSetDescr()) {
134 // LOG_POST(Info << "\tDeclined: No descr");
135  break;
136  }
137  if (!prj_item.GetItem().IsOther()) {
138 // LOG_POST(Info << "\tDeclined: Not other");
139  break;
140  }
141 
142  if (!NStr::StartsWith(prj_item.GetItem().GetOther().GetType(), "ColumnarVCF", NStr::eNocase)) {
143 // LOG_POST(Info << "\tDeclined: Not ColumnarVCF: " << prj_item.GetItem().GetOther().GetType());
144  break;
145  }
146 
147  bool found{ false };
148  for (const auto& annotdesc : prj_item.GetDescr()) {
149  if (!annotdesc->IsSrc())
150  continue;
151  const auto& prj_seq_id = annotdesc->GetSrc();
152  if (seq_id.AsFastaString() != prj_seq_id.AsFastaString()) {
153 // LOG_POST(Info << "\tDeclined: seq_id no match: " << prj_seq_id.AsFastaString());
154  continue;
155  }
156  found = true;
157  break;
158  }
159  if (!found) {
160 // LOG_POST(Info << "\tDeclined: seq_id mismatch");
161  break;
162  }
163  string annot_name;
164  if (!CProjectItemExtra::GetStr(prj_item, "AnnotName", annot_name)) {
165 // LOG_POST(Info << "\tDeclined: cannot get prj_item annot_name");
166  break;
167  }
168 
169  string title;
170  CProjectItemExtra::GetStr(prj_item, "OriginalFile", title);
171 
172 // LOG_POST(Info << "\tGetting track for: " << seq_id.AsFastaString() << ", title: " << title << ", annot_name: " << annot_name);
173 
174  return new CVcfTrackData{ title, annot_name, prj_item.GetItem().GetOther().GetData() };
175 
176  } while (false);
177 
178  return nullptr;
179 }
180 
182 {
183  static string sid("vcf_nonasn_track_data_factory_type");
184  return sid;
185 }
186 
188 {
189  static string label("VCF Non-ASN1 Track Data Factory Type");
190  return label;
191 }
192 
193 ///////////////////////////////////////////////////////////////////////////////
194 /// CVcfFeatureJob: a job class for loading annotated features from a given
195 /// sequence and visible range.
196 ///////////////////////////////////////////////////////////////////////////////
198 {
199 public:
201  CVcfFeatureJob(const string& desc, CBioseq_Handle handle,
202  const SAnnotSelector& sel, const TSeqRange& range,
203  TModelUnit window, int max_feat,
204  TJobToken token, const TDataBlob& vcf_blob, bool show_only_pathogenic);
205 
206 
207 protected:
208  virtual EJobState x_Execute();
209 
210 
211 protected:
212  TModelUnit m_Window; ///< current window for smear bars
213  /// the maximum number of features allowed.
214  /// -2: pack all features into one smear line
215  /// -1: theoretically unlimited, practically there is one (kMaxObjNum)
216  /// -0: pack all features into a histogram
217  /// >0: any limit set from a user
221 };
222 
223 
224 ///////////////////////////////////////////////////////////////////////////////
225 /// CVcfFeatureDS
226 ///////////////////////////////////////////////////////////////////////////////
228  : CSGFeatureDS(scope, id)
229 {}
230 
232  const TSeqRange& range, TModelUnit window,
233  TJobToken token, int max_feat,
234  ELinkedFeatDisplay LinkedFeat,
235  const string&)
236 {
237  if (sel.GetIncludedAnnotsNames().empty())
238  return;
239  const TDataBlob &blob = m_DataRegistry->GetNonAsnDataBlob(sel.GetIncludedAnnotsNames()[0].GetName());
241  new CVcfFeatureJob("VCF Feature", m_Handle, sel, range, window,
242  max_feat, token, blob, m_ShowOnlyPathogenic));
243  job->SetGraphLevel(CGraphUtils::GetNearestLevel(m_GraphLevels, window));
244  x_LaunchJob(*job);
245 }
246 
248 {
250 }
251 
252 bool CVcfFeatureDS::HasNonAsnData(const string &annot_name) const
253 {
255  return m_DataRegistry->HasNonAsnData(annot_name);
256 }
257 
259 {
261  return m_DataRegistry->GetNonAsnDataBlob(annot_name);
262 }
263 
264 // performs some sort of a search in data and place results into a list of objects
265 void CVcfFeatureDS::DoSearch(const string &annot_name, const string& sSearchTerm, list<CRef<CObject>>& results) const
266 {
267  results.clear();
268  if(HasNonAsnData(annot_name)) {
269  s_DoSearch(GetBioseqHandle().GetSeqId(), GetNonAsnDataBlob(annot_name), sSearchTerm, results);
270  }
271 }
272 
273 size_t CVcfFeatureDS::GetFeaturesCountInRange(const string &annot_name, const TSeqRange& range)
274 {
276  const TDataBlob &blob = m_DataRegistry->GetNonAsnDataBlob(annot_name);
277  CVCFSlicedVariants variants(blob);
278  return variants.Count(TSeqRange(range.GetFrom()+1, range.GetTo()+1));
279 }
280 
281 ///////////////////////////////////////////////////////////////////////////////
282 /// CVcfFeatureDSType
283 ///////////////////////////////////////////////////////////////////////////////
284 
287 {
288  const CSeq_id& id = dynamic_cast<const CSeq_id&>(object.object.GetObject());
289 // cerr << "Creating DS for seq-id" << endl <<
290 // MSerial_AsnText << id << endl;
291  return new CVcfFeatureDS(object.scope.GetObject(), id);
292 }
293 
294 
296 {
297  static string sid("vcf_feature_ds_type");
298  return sid;
299 }
300 
301 
303 {
304  static string slabel("Graphical View VCF Feature Data Source Type");
305  return slabel;
306 }
307 
308 
310 {
311  return false;
312 }
313 
314 
316  const SAnnotSelector& sel,
317  const TSeqRange& range, TModelUnit window,
318  int max_feat,
319  TJobToken token,
320  const TDataBlob& vcf_blob,
321  bool show_only_pathogenic)
322  : CSGAnnotJob(desc, handle, sel, range)
323  , m_Window(window)
324  , m_FeatLimit(max_feat)
325  , m_VcfBlob(vcf_blob)
326  , m_ShowOnlyPathogenic(show_only_pathogenic)
327 {
328  SetToken(token);
329 }
330 
331 
333 {
336 
337  SetTaskName("Loading VCF records...");
338  SetTaskTotal(0);
339  SetTaskCompleted(0);
340 
341  try {
342  TSeqRange range(m_Range.GetFrom() + 1, m_Range.GetTo() + 1);
344  // ERR_POST(Error << "CVcfFeatureJob::x_Execute(): loading m_VcfBlob.size(): " << m_VcfBlob.size());
345 
346  CVCFSlicedVariants variants(m_VcfBlob, &range, data_cols);
347 
348  int size = (int)variants.Count();
349  if (size < 0) {
350  LOG_POST(Info << "Negative size: " << size);
351  }
352  if (size > 0) {
354 
355  // use the real feature limit
356  if (m_FeatLimit > 0) {
357  // we may want to adjust feature limit based on the
358  // actual screen size (in pixels) for this case
359  int new_limit = (int)(m_FeatLimit * m_Range.GetLength() / (1024 * m_Window));
360  //ERR_POST(Error << "FL adjusted from " << m_FeatLimit << " to " << new_limit << ",w:" << m_Window << ",r:" << m_Range.GetLength());
361  m_FeatLimit = max(m_FeatLimit, new_limit);
362  }
363  else if (m_FeatLimit == -1) {
364  // unlimited, but still set a upper limit to guard against problem.
366  }
367 
368  // show a histogram when there are too many features (VCF records), but balance this with
369  // being zoomed in at a level when we want to show all records nevertheless (SV-4934)
370  if (size > kMaxFeatures && m_Window > 1.0) {
371  size_t BinWidth(round(m_Window));
372 
374 
375  auto CalculateHistogram = [&](CVcfHistogram::THistogramVector& vcf_histogram) {
376  auto opt_start = chrono::steady_clock::now();
377  variants.GetHistogram(vcf_histogram, static_cast<bm::bvector_size_type>(BinWidth));
378  auto diff_opt = chrono::steady_clock::now() - opt_start;
379  auto exec_time_ms = chrono::duration_cast<chrono::milliseconds>(diff_opt).count();
380  return exec_time_ms;
381  };
382 
383  const auto &annot_name = m_Sel.GetIncludedAnnotsNames()[0].GetName();
384  string cache_key = CVcfHistogram::GetCacheKey(annot_name, BinWidth);
386  if (data) {
387  data->GetHistogram(m_Range, dmap);
388  }
389  else {
390  CVcfHistogram::THistogramVector VCFHistogram;
391  auto hist_calc_time = CalculateHistogram(VCFHistogram);
392  CVcfHistogram::InitHistogramGlyph(BinWidth, m_Range, VCFHistogram, dmap);
393  // Cache the histogram of its calculation took more than 50 ms
394  if (hist_calc_time > 50) {
396  _ASSERT(data);
397  data->SetData(VCFHistogram);
399  }
400  }
401 
403  CRef<CSeqGlyph> glyph(hist_glyph);
404  if (glyph) {
405  result->m_ObjectList.push_back(glyph);
406  }
407  }
408  else {
409  CVCFVariant_CI variant_CI(variants);
410  CRef<CSeq_id> seq_id(new CSeq_id);
411  seq_id->Assign(*m_Handle.GetSeqId());
412 
413  while (variant_CI.IsValid()) {
414  CRef<CVcfVariant> var{ s_CreateVcfGlyph(*seq_id, variant_CI) };
415  // temporary protection against SV-4959, ignore such glyphs
416  if(var->GetPos() == size_t(-1)) {
417  LOG_POST(Error << "CVcfVariant with pos == -1: " << var->GetID());
418  }
419  else {
420  if (m_ShowOnlyPathogenic && var->IsClinVar()) {
421  const auto &info_fields = var->GetInfoColumns();
422  auto clnsig_it = info_fields.find("CLNSIG");
423  if (clnsig_it == info_fields.end()) {
424  ++variant_CI;
425  continue;
426  }
427  static set<string> pathogens = { "pathogenic/likely_pathogenic", "likely_pathogenic", "pathogenic" };
428  string clinsig = clnsig_it->second;
429  NStr::ToLower(clinsig);
430  if (0 == pathogens.count(clinsig)) {
431  ++variant_CI;
432  continue;
433  }
434 
435  }
436 
437  CRef<CSeqGlyph> glyph{ new CVcfGlyph(var.GetPointer()) };
438  if (glyph) {
439  result->m_ObjectList.push_back(glyph);
440  }
441  }
442  ++variant_CI;
443  }
444  }
445  }
447  } catch (CException& ex) {
448  m_Error.Reset(new CAppJobError(ex.GetMsg()));
449  return eFailed;
450  } catch (std::exception& ex) {
451  m_Error.Reset(new CAppJobError(ex.what()));
452  return eFailed;
453  }
454  result->m_Token = m_Token;
455  return eCompleted;
456 }
457 
458 
459 
460 
User-defined methods of the data storage class.
User-defined methods of the data storage class.
T round(const T &v)
CAppJobError Default implementation for IAppJobError - encapsulates a text error message.
CBioseq_Handle –.
void SaveData(CRef< TData > data)
Clones TData, puts it into Save Queue for asynchroneous storage operation.
CRef< TData > GetData(const string &data_key)
Retrieves TData from in-memory cache or if not found calls TData::Init to initialize new TData instan...
static CGraphCache & GetInstance()
Definition: graph_cache.hpp:97
CRef< TData > GetCachedData(const string &data_key)
Retrieves TData from in-memory cache.
static int GetNearestLevel(const set< int > &levels, double zoom)
Definition: graph_utils.cpp:47
static bool GetStr(const objects::CProjectItem &pi, const string &tag, string &value)
CRef –.
Definition: ncbiobj.hpp:618
objects::SAnnotSelector m_Sel
our annotation selector
TSeqRange m_Range
target range
objects::CBioseq_Handle m_Handle
target sequence
CSGFeatureDS.
Definition: feature_ds.hpp:49
TJobID x_LaunchJob(IAppJob &job, int report_period=1, const string &pool="ObjManagerEngine")
Launch either a background or foreground job.
objects::CBioseq_Handle & GetBioseqHandle(void)
Get the underlying bioseq handle.
TGraphLevels m_GraphLevels
Existing coverage graph levels.
objects::CBioseq_Handle m_Handle
CSGJobResult – the data structure holding the seqgraphic job results.
CScope –.
Definition: scope.hpp:92
CRef< CObject > m_Result
virtual void SetTaskTotal(int total)
virtual void SetTaskName(const string &name)
virtual void SetTaskCompleted(int completed)
set total finished task number.
void SetToken(TJobToken token)
CSeqGraphicJob inline methods.
TJobToken m_Token
Job token recognizable by job listener.
CRef< CAppJobError > m_Error
virtual bool GetPositionsForVariant(const string &variant_id, vector< unsigned > &positions)
string GetVariantID() const
string GetInfoField(const string &field_name) const
bool IsSetInfoField(const string &field_name) const
unsigned GetPosition() const
void GetHistogram(svector &hist, const svector::size_type &bin_width) const
CSGFeatureDSType.
Definition: vcf_ds.hpp:158
virtual ISGDataSource * CreateDS(SConstScopedObject &object) const
create an instance of the layout track type using default settings.
Definition: vcf_ds.cpp:286
virtual string GetExtensionLabel() const
returns a displayable label for this extension ( please capitalize the key words - "My Extension" )
Definition: vcf_ds.cpp:302
virtual bool IsSharable() const
check if the data source can be shared.
Definition: vcf_ds.cpp:309
virtual string GetExtensionIdentifier() const
returns the unique human-readable identifier for the extension the id should use lowercase letters se...
Definition: vcf_ds.cpp:295
CVcfFeatureDS.
Definition: vcf_ds.hpp:110
CConstIRef< INonAsnDataRegistry > m_DataRegistry
Definition: vcf_ds.hpp:146
virtual void LoadFeatures(objects::SAnnotSelector &sel, const TSeqRange &range, TModelUnit window, TJobToken token=-1, int max_feat=-1, ELinkedFeatDisplay LinkedFeatDisplay=ELinkedFeatDisplay::eLFD_Default, const string &="")
void SetNonAsnDataRegistry(const INonAsnDataRegistry *registry)
Definition: vcf_ds.cpp:247
bool HasNonAsnData(const string &annot_name) const
Definition: vcf_ds.cpp:252
INonAsnTrackData::TDataBlob TDataBlob
Definition: vcf_ds.hpp:112
CVcfFeatureDS(objects::CScope &scope, const objects::CSeq_id &id)
CVcfFeatureDS.
Definition: vcf_ds.cpp:227
bool m_ShowOnlyPathogenic
Definition: vcf_ds.hpp:147
virtual void DoSearch(const string &annot_name, const string &sSearchTerm, list< CRef< CObject >> &results) const
Definition: vcf_ds.cpp:265
const TDataBlob & GetNonAsnDataBlob(const string &annot_name) const
Definition: vcf_ds.cpp:258
size_t GetFeaturesCountInRange(const string &annot_name, const TSeqRange &range)
Definition: vcf_ds.cpp:273
CVcfFeatureJob: a job class for loading annotated features from a given sequence and visible range.
Definition: vcf_ds.cpp:198
int m_FeatLimit
the maximum number of features allowed.
Definition: vcf_ds.cpp:218
CVcfFeatureJob(const string &desc, CBioseq_Handle handle, const SAnnotSelector &sel, const TSeqRange &range, TModelUnit window, int max_feat, TJobToken token, const TDataBlob &vcf_blob, bool show_only_pathogenic)
Definition: vcf_ds.cpp:315
INonAsnTrackData::TDataBlob TDataBlob
Definition: vcf_ds.cpp:200
virtual EJobState x_Execute()
method truly doing the job.
Definition: vcf_ds.cpp:332
TModelUnit m_Window
current window for smear bars
Definition: vcf_ds.cpp:212
const TDataBlob & m_VcfBlob
Definition: vcf_ds.cpp:219
bool m_ShowOnlyPathogenic
Definition: vcf_ds.cpp:220
static string GetCacheKey(const string &annot_name, const size_t bin_width)
static void InitHistogramGlyph(size_t bin_width, const TSeqRange &range, const THistogramVector &histogram, CHistogramGlyph::TMap &dmap)
INonAsnTrackData * CreateTrackData(const objects::CSeq_id &seq_id, const objects::CProjectItem &prj_item) const
Definition: vcf_ds.cpp:130
string GetExtensionLabel() const
returns a displayable label for this extension ( please capitalize the key words - "My Extension" )
Definition: vcf_ds.cpp:187
string GetExtensionIdentifier() const
returns the unique human-readable identifier for the extension the id should use lowercase letters se...
Definition: vcf_ds.cpp:181
virtual void DoSearch(const objects::CSeq_id *seq_id, const string &sSearchTerm, list< CRef< CObject >> &results) const
Definition: vcf_ds.cpp:124
const string GetDataSourceTypeName() const
Definition: vcf_ds.cpp:118
const TDataBlob & GetBlob() const
Definition: vcf_ds.hpp:70
File Description:
succinct sparse vector with runtime compression using bit-slicing / transposition method
Definition: bmsparsevec.h:87
static CMemoryRegistry registry
Definition: cn3d_tools.cpp:81
ELinkedFeatDisplay
string
Definition: cgiapp.hpp:687
#define LOG_POST(message)
This macro is deprecated and it's strongly recomended to move in all projects (except tests) to macro...
Definition: ncbidiag.hpp:226
void Error(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1197
const string & GetMsg(void) const
Get message string.
Definition: ncbiexpt.cpp:461
virtual const char * what(void) const noexcept
Standard report (includes full backlog).
Definition: ncbiexpt.cpp:342
void Info(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1185
vector< char > TDataBlob
INonAsnTrackData::TDataBlob TDataBlob
GLdouble TModelUnit
Definition: gltypes.hpp:48
EJobState
Job states (describe FSM)
Definition: app_job.hpp:86
@ eCompleted
Definition: app_job.hpp:89
@ eFailed
Definition: app_job.hpp:90
const string AsFastaString(void) const
Definition: Seq_id.cpp:2265
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Optimized implementation of CSerialObject::Assign, which is not so efficient.
Definition: Seq_id.cpp:318
const TAnnotsNames & GetIncludedAnnotsNames(void) const
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:1439
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:773
position_type GetLength(void) const
Definition: range.hpp:158
CRange< TSeqPos > TSeqRange
typedefs for sequence ranges
Definition: range.hpp:419
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
static bool StartsWith(const CTempString str, const CTempString start, ECase use_case=eCase)
Check if a string starts with a specified prefix value.
Definition: ncbistr.hpp:5411
static string & ToLower(string &str)
Convert string to lower case – string& version.
Definition: ncbistr.cpp:405
@ eNocase
Case insensitive compare.
Definition: ncbistr.hpp:1206
static const char label[]
TTo GetTo(void) const
Get the To member data.
Definition: Range_.hpp:269
TFrom GetFrom(void) const
Get the From member data.
Definition: Range_.hpp:222
const TType & GetType(void) const
Get the Type member data.
const TData & GetData(void) const
Get the Data member data.
const TItem & GetItem(void) const
Get the Item member data.
bool IsSetDescr(void) const
user-defined descriptors Check if a value has been assigned to Descr data member.
const TDescr & GetDescr(void) const
Get the Descr member data.
const TOther & GetOther(void) const
Get the variant data.
bool IsOther(void) const
Check if variant Other is selected.
unsigned int
A callback function used to compare two keys in a database.
Definition: types.hpp:1210
bm::id_t bvector_size_type
Definition: bm.h:103
range(_Ty, _Ty) -> range< _Ty >
const struct ncbi::grid::netcache::search::fields::SIZE size
T max(T x_, T y_)
static bool GetSeqId(const T &d, set< string > &labels, const string name="", bool detect=false, bool found=false)
SAnnotSelector –.
#define _ASSERT
else result
Definition: token2.c:20
USING_SCOPE(objects)
static CRef< CVcfVariant > s_CreateVcfGlyph(const objects::CSeq_id &seq_id, const CVCFVariant_CI &variant_CI)
Definition: vcf_ds.cpp:78
static const float kMinScaleForMapping
Definition: vcf_ds.cpp:73
static const size_t kMaxChildNum
Definition: vcf_ds.cpp:68
static const int kMaxObjNum
Definition: vcf_ds.cpp:65
static const int kMaxFeatures
Definition: vcf_ds.cpp:76
static void s_DoSearch(const CSeq_id *seq_id, const INonAsnTrackData::TDataBlob &vcf_blob, const string &sSearchTerm, list< CRef< CObject >> &results)
Definition: vcf_ds.cpp:94
static const float kSeqZoomLevel
Definition: vcf_ds.cpp:70
Modified on Sat Dec 02 09:21:55 2023 by modify_doxy.py rev. 669887