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

Go to the SVN repository for this file.

1 /* $Id: seqtechdlg.cpp 42186 2019-01-09 19:34:50Z asztalos $
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: Colleen Bollin
27  */
28 
29 
30 #include <ncbi_pch.hpp>
31 
32 ////@begin includes
33 ////@end includes
34 
37 #include <objmgr/bioseq_ci.hpp>
38 #include <objmgr/seqdesc_ci.hpp>
44 
45 #include <wx/button.h>
46 
47 ////@begin XPM images
48 ////@end XPM images
49 
51 
52 static const string kRawOrAssembled = "Raw or Assembled";
53 static const string kRaw = "Raw";
54 static const string kAssembled = "Assembled";
55 
56 /*!
57  * CSeqTechDlg type definition
58  */
59 
60 IMPLEMENT_DYNAMIC_CLASS( CSeqTechDlg, wxFrame )
61 
62 
63 /*!
64  * CSeqTechDlg event table definition
65  */
66 
67 BEGIN_EVENT_TABLE( CSeqTechDlg, wxFrame )
68 
69 ////@begin CSeqTechDlg event table entries
70  EVT_RADIOBUTTON( ID_RAW_BTN, CSeqTechDlg::OnRawBtnSelected )
71 
73 
74 ////@end CSeqTechDlg event table entries
75 
77 
78 
79 /*!
80  * CSeqTechDlg constructors
81  */
82 
84 {
85  Init();
86 }
87 
88 CSeqTechDlg::CSeqTechDlg( wxWindow* parent, objects::CSeq_entry_Handle seh, CSourceRequirements::EWizardType wizard_type,
89  wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
90 : m_TopSeqEntry(seh), m_WizardType(wizard_type)
91 {
92  m_EditedObj = new objects::CUser_object();
94 
95  Init();
96  Create(parent, id, caption, pos, size, style);
97 }
98 
99 
100 /*!
101  * SeqTechDlg creator
102  */
103 
104 bool CSeqTechDlg::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
105 {
106 ////@begin CSeqTechDlg creation
107  SetExtraStyle(wxWS_EX_BLOCK_EVENTS);
108  wxFrame::Create( parent, id, caption, pos, size, style );
109 
110  CreateControls();
111  if (GetSizer())
112  {
113  GetSizer()->SetSizeHints(this);
114  }
115  Centre();
116 ////@end CSeqTechDlg creation
117  return true;
118 }
119 
120 
121 /*!
122  * CSeqTechDlg destructor
123  */
124 
126 {
127 ////@begin CSeqTechDlg destruction
128 ////@end CSeqTechDlg destruction
129 }
130 
131 
132 /*!
133  * Member initialisation
134  */
135 
137 {
138 ////@begin CSeqTechDlg member initialisation
139  m_PanelSizer = NULL;
140  m_RawBtn = NULL;
142 ////@end CSeqTechDlg member initialisation
143 }
144 
145 
146 /*!
147  * Control creation for SeqTechDlg
148  */
149 
151 {
152 ////@begin CSeqTechDlg content construction
153  // Generated by DialogBlocks, 10/06/2013 17:57:02 (unregistered)
154 
155  CSeqTechDlg* itemDialog1 = this;
156 
157  wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
158  itemDialog1->SetSizer(itemBoxSizer2);
159 
160  m_PanelSizer = new wxBoxSizer(wxHORIZONTAL);
161  itemBoxSizer2->Add(m_PanelSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
162 
163  wxStaticBox* itemStaticBoxSizer4Static = new wxStaticBox(itemDialog1, wxID_ANY, _("These sequence(s) are"));
164  wxStaticBoxSizer* itemStaticBoxSizer4 = new wxStaticBoxSizer(itemStaticBoxSizer4Static, wxHORIZONTAL);
165  itemBoxSizer2->Add(itemStaticBoxSizer4, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
166 
167  m_RawBtn = new wxRadioButton( itemDialog1, ID_RAW_BTN, _("raw sequence reads (not assembled)"), wxDefaultPosition, wxDefaultSize, 0 );
168  m_RawBtn->SetValue(false);
169  itemStaticBoxSizer4->Add(m_RawBtn, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
170 
171  m_AssembledBtn = new wxRadioButton( itemDialog1, ID_ASSEMBLED_BTN, _("assembled sequences"), wxDefaultPosition, wxDefaultSize, 0 );
172  m_AssembledBtn->SetValue(false);
173  itemStaticBoxSizer4->Add(m_AssembledBtn, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
174 
175  wxBoxSizer* itemBoxSizer7 = new wxBoxSizer(wxHORIZONTAL);
176  itemBoxSizer2->Add(itemBoxSizer7, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
177 
178  wxButton* itemButton8 = new wxButton( itemDialog1, wxID_OK, _("Accept"), wxDefaultPosition, wxDefaultSize, 0 );
179  itemBoxSizer7->Add(itemButton8, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
180 
181  wxButton* itemButton9 = new wxButton( itemDialog1, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
182  itemBoxSizer7->Add(itemButton9, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
183 
184 ////@end CSeqTechDlg content construction
185 
186  m_Panel = new CSequencingTechnologyPanel( itemDialog1, m_EditedObj, wxID_ANY, wxDefaultPosition, wxSize(100, 100), wxSIMPLE_BORDER );
188  m_PanelSizer->Add(m_Panel, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
189 
191  if (NStr::EqualNocase(raw_or_assembled, kRaw)) {
192  m_RawBtn->SetValue(true);
193  } else if (NStr::EqualNocase(raw_or_assembled, kAssembled)) {
194  m_AssembledBtn->SetValue(true);
195  }
196 
197 }
198 
199 
200 /*!
201  * Should we show tooltips?
202  */
203 
205 {
206  return true;
207 }
208 
209 /*!
210  * Get bitmap resources
211  */
212 
213 wxBitmap CSeqTechDlg::GetBitmapResource( const wxString& name )
214 {
215  // Bitmap retrieval
216 ////@begin CSeqTechDlg bitmap retrieval
217  wxUnusedVar(name);
218  return wxNullBitmap;
219 ////@end CSeqTechDlg bitmap retrieval
220 }
221 
222 /*!
223  * Get icon resources
224  */
225 
226 wxIcon CSeqTechDlg::GetIconResource( const wxString& name )
227 {
228  // Icon retrieval
229 ////@begin CSeqTechDlg icon retrieval
230  wxUnusedVar(name);
231  return wxNullIcon;
232 ////@end CSeqTechDlg icon retrieval
233 }
234 
235 
237 {
238  if (NStr::IsBlank(tech)) {
239  return false;
240  }
241  vector<string> values;
242  NStr::Split(tech, ";", values);
243 
244  ITERATE(vector<string>, it, values) {
245  if (!NStr::EqualNocase(*it, "Sanger dideoxy sequencing") && !NStr::StartsWith(*it, "ABI", NStr::eNocase)) {
246  return false;
247  }
248  }
249  return true;
250 }
251 
252 
253 static string s_BadAssemblyPrograms[] = {
254  "Assembly program",
255  "No",
256  "Yes",
257  "Not Applicable",
258  "N/A",
259  "Sequencing",
260  "PCR",
261  "PCR product",
262  "Overlapping sequence",
263  "Overlapping sequences"};
264 
265 static const int k_NumBadAssemblyPrograms = sizeof (s_BadAssemblyPrograms) / sizeof (string);
266 
267 string s_IsAssemblyMethodValid (string assem)
268 {
269  if (NStr::FindNoCase(assem, "BLAST") != string::npos) {
270  return "BLAST is not an assembly program. Please provide valid assembly program information.";
271  } else {
272  string program = assem;
273  size_t pos = NStr::FindNoCase(assem, " v. ");
274  if (pos != string::npos) {
275  program = assem.substr(0, pos);
276  }
277  for (int i = 0; i < k_NumBadAssemblyPrograms; i++) {
278  if (NStr::EqualNocase(program, s_BadAssemblyPrograms[i])) {
279  return "The assembly program name is not valid. Please enter the name of the program used to assemble these sequences.";
280  }
281  }
282  if (pos == string::npos) {
283  return "You must provide the version as well as the name of the assembly program.";
284  }
285  }
286  return "";
287 }
288 
289 
290 static string s_BadMethods[] = {
291  "core",
292  "core facility",
293  "core lab",
294  "Sequencing",
295  "PCR",
296  "PCR product",
297  "Overlapping sequence",
298  "Overlapping sequences"
299 };
300 
301 static const int k_NumBadMethods = sizeof (s_BadMethods) / sizeof (string);
302 
303 
304 bool s_IsBadMethod (string method)
305 {
306  for (int i = 0; i < k_NumBadMethods; i++) {
307  if (NStr::EqualNocase(s_BadMethods[i], method)) {
308  return true;
309  }
310  }
311  return false;
312 }
313 
314 
315 static string s_GetFieldValFromUserObj(CRef<objects::CUser_object> user, string field_name)
316 {
317  string val = "";
318  try {
319  const objects::CUser_field& field = user->GetField(field_name);
320  if (field.IsSetData() && field.GetData().IsStr()) {
321  val = field.GetData().GetStr();
322  }
323  } catch (const exception&) {
324  }
325  return val;
326 }
327 
328 
330 {
331  string seq_tech = s_GetFieldValFromUserObj(user, "Sequencing Technology");
332  if (NStr::IsBlank(seq_tech)) {
333  return "Missing Sequencing Technology!";
334  }
335 
336  if (x_IsSpecialTech(seq_tech) && wizard_type != CSourceRequirements::eWizardType_tsa) {
337  return "";
338  } else if (NStr::IsBlank(raw_or_assembled)) {
339  return "You must select whether the sequences are assembled or raw.";
340  } else if (NStr::EqualNocase(raw_or_assembled, kRaw)) {
341  if (x_IsSpecialTech(seq_tech) && wizard_type == CSourceRequirements::eWizardType_tsa) {
342  return "Do not use TSA wizard for unassembled Sanger or ABI sequences";
343  } else {
344  return "Raw sequence reads generated by next generation sequencing technologies should be submitted to the Sequence Read Archive (SRA), not GenBank. Please see: https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi";
345  }
346  }
347 
348  string assem = s_GetFieldValFromUserObj(user, "Assembly Method");
349  string coverage = s_GetFieldValFromUserObj(user, "Coverage");
350  string a_name = s_GetFieldValFromUserObj(user, "Assembly Name");
351 
352  if (NStr::IsBlank (assem)) {
353  return "Please provide the assembly program and version in the form.";
354  } else if (NStr::FindNoCase(coverage, "BLAST") != string::npos) {
355  return "BLAST is not an assembly program. Please provide valid assembly program information.";
356  }
357 
358  string problem = s_IsAssemblyMethodValid(assem);
359  if (!NStr::IsBlank(problem)) {
360  return problem;
361  }
362  if (NStr::EqualNocase(seq_tech, "Sequencing Technology")) {
363  return "Sequencing technology is not a valid answer. Please enter the specific type of technology used to obtain these sequences.";
364  }
365 
366  if (s_IsBadMethod(seq_tech)) {
367  return "'" + seq_tech + "' is not a sequencing technology. Please only enter the type of technology that was used to generate your sequences.";
368  }
369 
370  return "";
371 }
372 
373 
375 {
376  string raw_or_assembled = "";
377  if (m_RawBtn->GetValue()) {
378  raw_or_assembled = kRaw;
379  } else if (m_AssembledBtn->GetValue()) {
380  raw_or_assembled = kAssembled;
381  }
382  return raw_or_assembled;
383 }
384 
385 
387 {
388  CRef<CCmdComposite> cmd(new CCmdComposite("Bulk Sequencing Technology Edit") );
389 
391  m_EditedObj->Assign(*(m_Panel->GetUser_object()));
392 
393  string raw_or_assembled = x_GetRawOrAssembled();
394 
395  string problem = CheckSequencingTechnology(m_EditedObj, m_WizardType, raw_or_assembled);
396  if (!NStr::IsBlank(problem)) {
398  return empty;
399  }
400 
401  objects::CBioseq_CI b_iter(m_TopSeqEntry, objects::CSeq_inst::eMol_na);
402  for ( ; b_iter ; ++b_iter ) {
403  CRef<objects::CSeqdesc> new_desc( new objects::CSeqdesc );
404  CRef<objects::CUser_object> new_user (new objects::CUser_object());
405  new_user->Assign (*m_EditedObj);
406  new_desc->SetUser(*new_user);
407  bool found = false;
408 
409  for (objects::CSeqdesc_CI desc_ci( *b_iter, objects::CSeqdesc::e_User);
410  desc_ci && !found;
411  ++desc_ci) {
412  const objects::CUser_object& u = desc_ci->GetUser();
413  if (u.IsSetType() && u.GetType().IsStr() && NStr::EqualNocase(u.GetType().GetStr(), "StructuredComment")) {
414  try {
415  const objects::CUser_field& prefix = desc_ci->GetUser().GetField("StructuredCommentPrefix");
416  if (prefix.IsSetData() && prefix.GetData().IsStr()
417  && NStr::EqualNocase(prefix.GetData().GetStr(), "##Assembly-Data-START##")) {
418 
419  CRef<CCmdChangeSeqdesc> ecmd(new CCmdChangeSeqdesc(desc_ci.GetSeq_entry_Handle(), *desc_ci, *new_desc));
420  cmd->AddCommand (*ecmd);
421  found = true;
422  }
423  } catch (const exception&) {
424  }
425  }
426  }
427  if (!found) {
428  objects::CBioseq_set_Handle bssh = b_iter->GetParentBioseq_set();
429  if (bssh && bssh.IsSetClass() && bssh.GetClass() == objects::CBioseq_set::eClass_nuc_prot) {
430  cmd->AddCommand( *CRef<CCmdCreateDesc>(new CCmdCreateDesc(bssh.GetParentEntry(), *new_desc)) );
431  } else {
432  cmd->AddCommand( *CRef<CCmdCreateDesc>(new CCmdCreateDesc(b_iter->GetParentEntry(), *new_desc)) );
433  }
434  }
435  }
437  return cmd;
438 }
439 
440 
442 {
444  m_EditedObj->Assign(*(m_Panel->GetUser_object()));
445  string raw_or_assembled = x_GetRawOrAssembled();
446 
447  string problem = CheckSequencingTechnology(m_EditedObj, m_WizardType, raw_or_assembled);
448 
449  if (NStr::IsBlank(problem)) {
450  problem = "Unknown error";
451  }
452  return problem;
453 }
454 
455 
457 {
458  objects::CBioseq_CI b_iter(m_TopSeqEntry, objects::CSeq_inst::eMol_na);
459  for ( ; b_iter ; ++b_iter ) {
460  objects::CSeqdesc_CI it (*b_iter, objects::CSeqdesc::e_User);
461  while (it ) {
462  if (it->GetUser().IsSetType()
463  && it->GetUser().GetType().IsStr()
464  && NStr::EqualNocase(it->GetUser().GetType().GetStr(), "StructuredComment")) {
465  ITERATE (objects::CUser_object::TData, field_it, it->GetUser().GetData()) {
466  if ((*field_it)->IsSetLabel()
467  && (*field_it)->GetLabel().IsStr()
468  && NStr::EqualNocase((*field_it)->GetLabel().GetStr(), "StructuredCommentPrefix")
469  && (*field_it)->IsSetData()
470  && (*field_it)->GetData().IsStr()
471  && NStr::EqualNocase((*field_it)->GetData().GetStr(), "##Assembly-Data-START##")) {
472  m_EditedObj->Assign (it->GetUser());
473  return;
474  // TODO: combine multiples...
475  }
476  }
477  }
478  ++it;
479  }
480  }
481  m_EditedObj->SetType().SetStr("StructuredComment");
482  objects::CUser_field& prefix = m_EditedObj->SetField("StructuredCommentPrefix");
483  prefix.SetData().SetStr("##Assembly-Data-START##");
484  objects::CUser_field& suffix = m_EditedObj->SetField("StructuredCommentSuffix");
485  suffix.SetData().SetStr("##Assembly-Data-END##");
486 }
487 
488 
489 /*!
490  * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RAW_BTN
491  */
492 
493 void CSeqTechDlg::OnRawBtnSelected( wxCommandEvent& event )
494 {
495 ////@begin wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RAW_BTN in CSeqTechDlg.
496  // Before editing this code, remove the block markers.
497  event.Skip();
498 ////@end wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RAW_BTN in CSeqTechDlg.
499 }
500 
501 
502 /*!
503  * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_ASSEMBLED_BTN
504  */
505 
506 void CSeqTechDlg::OnAssembledBtnSelected( wxCommandEvent& event )
507 {
508 ////@begin wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_ASSEMBLED_BTN in CSeqTechDlg.
509  // Before editing this code, remove the block markers.
510  event.Skip();
511 ////@end wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_ASSEMBLED_BTN in CSeqTechDlg.
512 }
513 
514 
virtual CRef< CCmdComposite > GetCommand()
Definition: seqtechdlg.cpp:386
CSeqTechDlg()
Constructors.
Definition: seqtechdlg.cpp:83
CSourceRequirements::EWizardType m_WizardType
Definition: seqtechdlg.hpp:138
static string CheckSequencingTechnology(CRef< objects::CUser_object > user, CSourceRequirements::EWizardType wizard_type, string raw_or_assembled)
Definition: seqtechdlg.cpp:329
wxBitmap GetBitmapResource(const wxString &name)
Retrieves bitmap resources.
Definition: seqtechdlg.cpp:213
CRef< objects::CUser_object > m_EditedObj
Definition: seqtechdlg.hpp:136
wxRadioButton * m_RawBtn
Definition: seqtechdlg.hpp:126
string x_GetRawOrAssembled()
Definition: seqtechdlg.cpp:374
wxIcon GetIconResource(const wxString &name)
Retrieves icon resources.
Definition: seqtechdlg.cpp:226
bool Create(wxWindow *parent, wxWindowID id=10014, const wxString &caption=_("Sequencing Technology"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(400, 300), long style=wxCAPTION|wxRESIZE_BORDER|wxSYSTEM_MENU|wxCLOSE_BOX|wxTAB_TRAVERSAL)
Creation.
Definition: seqtechdlg.cpp:104
objects::CSeq_entry_Handle m_TopSeqEntry
Definition: seqtechdlg.hpp:135
wxBoxSizer * m_PanelSizer
Definition: seqtechdlg.hpp:125
~CSeqTechDlg()
Destructor.
Definition: seqtechdlg.cpp:125
CSequencingTechnologyPanel * m_Panel
Definition: seqtechdlg.hpp:137
wxRadioButton * m_AssembledBtn
Definition: seqtechdlg.hpp:127
virtual string GetErrorMessage()
Definition: seqtechdlg.cpp:441
void CreateControls()
Creates the controls and sizers.
Definition: seqtechdlg.cpp:150
static bool x_IsSpecialTech(string tech)
Definition: seqtechdlg.cpp:236
void Init()
Initialises member variables.
Definition: seqtechdlg.cpp:136
void x_GetSeqTechUserFromSeqEntry()
Definition: seqtechdlg.cpp:456
void OnAssembledBtnSelected(wxCommandEvent &event)
wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_ASSEMBLED_BTN
Definition: seqtechdlg.cpp:506
static bool ShowToolTips()
Should we show tooltips?
Definition: seqtechdlg.cpp:204
void OnRawBtnSelected(wxCommandEvent &event)
wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RAW_BTN
Definition: seqtechdlg.cpp:493
CRef< objects::CUser_object > GetUser_object() const
static string GetWizardFieldFromSeqEntry(objects::CSeq_entry_Handle entry, string field_name)
static CRef< CCmdComposite > SetWizardFieldInSeqEntry(objects::CSeq_entry_Handle entry, string field_name, string value)
static CS_COMMAND * cmd
Definition: ct_dynamic.c:26
#define _(proto)
Definition: ct_nlmzip_i.h:78
static void Init(void)
Definition: cursor6.c:76
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
#define NULL
Definition: ncbistd.hpp:225
#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 list< string > & Split(const CTempString str, const CTempString delim, list< string > &arr, TSplitFlags flags=0, vector< SIZE_TYPE > *token_pos=NULL)
Split a string using specified delimiters.
Definition: ncbistr.cpp:3457
static SIZE_TYPE FindNoCase(const CTempString str, const CTempString pattern, SIZE_TYPE start, SIZE_TYPE end, EOccurrence which=eFirst)
Find the pattern in the specified range of a string using a case insensitive search.
Definition: ncbistr.cpp:2989
static bool IsBlank(const CTempString str, SIZE_TYPE pos=0)
Check if a string is blank (has no text).
Definition: ncbistr.cpp:106
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:5412
static bool EqualNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive equality of a substring with another string.
Definition: ncbistr.hpp:5353
@ eNocase
Case insensitive compare.
Definition: ncbistr.hpp:1206
END_EVENT_TABLE()
int i
constexpr bool empty(list< Ts... >) noexcept
const struct ncbi::grid::netcache::search::fields::SIZE size
static const char * suffix[]
Definition: pcregrep.c:408
static const char * prefix[]
Definition: pcregrep.c:405
static static static wxID_ANY
static const string kAssembled
Definition: seqtechdlg.cpp:54
bool s_IsBadMethod(string method)
Definition: seqtechdlg.cpp:304
static const int k_NumBadAssemblyPrograms
Definition: seqtechdlg.cpp:265
static const string kRaw
Definition: seqtechdlg.cpp:53
string s_IsAssemblyMethodValid(string assem)
Definition: seqtechdlg.cpp:267
static string s_GetFieldValFromUserObj(CRef< objects::CUser_object > user, string field_name)
Definition: seqtechdlg.cpp:315
static const int k_NumBadMethods
Definition: seqtechdlg.cpp:301
static string s_BadMethods[]
Definition: seqtechdlg.cpp:290
static const string kRawOrAssembled
Definition: seqtechdlg.cpp:52
static string s_BadAssemblyPrograms[]
Definition: seqtechdlg.cpp:253
#define ID_RAW_BTN
Definition: seqtechdlg.hpp:66
#define ID_ASSEMBLED_BTN
Definition: seqtechdlg.hpp:67
Modified on Sun Mar 03 03:13:13 2024 by modify_doxy.py rev. 669887