cn3d_ba_interface.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:23k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cn3d_ba_interface.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:28:07  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.33
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: cn3d_ba_interface.cpp,v 1000.2 2004/06/01 18:28:07 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Authors:  Paul Thiessen
  35. *
  36. * File Description:
  37. *      Interface to Alejandro's block alignment algorithm
  38. *
  39. * ===========================================================================
  40. */
  41. #ifdef _MSC_VER
  42. #pragma warning(disable:4018)   // disable signed/unsigned mismatch warning in MSVC
  43. #endif
  44. #include <ncbi_pch.hpp>
  45. #include <corelib/ncbistd.hpp>
  46. #include <corelib/ncbi_limits.h>
  47. #include <objects/seqalign/Seq_align.hpp>
  48. #include <objects/seqalign/Seq_align_set.hpp>
  49. #include <objects/seqalign/Dense_seg.hpp>
  50. #include <objects/seqalign/Score.hpp>
  51. #include <objects/general/Object_id.hpp>
  52. #ifdef __WXMSW__
  53. #include <windows.h>
  54. #include <wx/msw/winundef.h>
  55. #endif
  56. #include <wx/wx.h>
  57. #include <algo/structure/struct_dp/struct_dp.h>
  58. #include "cn3d_ba_interface.hpp"
  59. #include "block_multiple_alignment.hpp"
  60. #include "sequence_set.hpp"
  61. #include "structure_set.hpp"
  62. #include "asn_converter.hpp"
  63. #include "molecule_identifier.hpp"
  64. #include "wx_tools.hpp"
  65. #include "cn3d_tools.hpp"
  66. #include "cn3d_blast.hpp"
  67. USING_NCBI_SCOPE;
  68. USING_SCOPE(objects);
  69. BEGIN_SCOPE(Cn3D)
  70. class BlockAlignerOptionsDialog : public wxDialog
  71. {
  72. public:
  73.     BlockAlignerOptionsDialog(wxWindow* parent, const BlockAligner::BlockAlignerOptions& init);
  74.     ~BlockAlignerOptionsDialog(void);
  75.     bool GetValues(BlockAligner::BlockAlignerOptions *options);
  76. private:
  77.     IntegerSpinCtrl *iExtension, *iCutoff;
  78.     FloatingPointSpinCtrl *fpPercent;
  79.     wxCheckBox *cGlobal, *cKeep, *cMerge;
  80.     void OnCloseWindow(wxCloseEvent& event);
  81.     void OnButton(wxCommandEvent& event);
  82.     DECLARE_EVENT_TABLE()
  83. };
  84. BlockAligner::BlockAligner(void)
  85. {
  86.     // default options
  87.     currentOptions.loopPercentile = 0.6;
  88.     currentOptions.loopExtension = 10;
  89.     currentOptions.loopCutoff = 0;
  90.     currentOptions.globalAlignment = false;
  91.     currentOptions.keepExistingBlocks = false;
  92.     currentOptions.mergeAfterEachSequence = false;
  93. }
  94. static void FreezeBlocks(const BlockMultipleAlignment *multiple,
  95.     const BlockMultipleAlignment *pairwise, DP_BlockInfo *blockInfo)
  96. {
  97.     BlockMultipleAlignment::UngappedAlignedBlockList multipleABlocks, pairwiseABlocks;
  98.     multiple->GetUngappedAlignedBlocks(&multipleABlocks);
  99.     pairwise->GetUngappedAlignedBlocks(&pairwiseABlocks);
  100.     // if a block in the multiple is contained in the pairwise (looking at master coords),
  101.     // then add a constraint to keep it there
  102.     BlockMultipleAlignment::UngappedAlignedBlockList::const_iterator
  103.         m, me = multipleABlocks.end(), p, pe = pairwiseABlocks.end();
  104.     const Block::Range *multipleRangeMaster, *pairwiseRangeMaster, *pairwiseRangeSlave;
  105.     int i;
  106.     for (i=0, m=multipleABlocks.begin(); m!=me; ++i, ++m) {
  107.         multipleRangeMaster = (*m)->GetRangeOfRow(0);
  108.         for (p=pairwiseABlocks.begin(); p!=pe; ++p) {
  109.             pairwiseRangeMaster = (*p)->GetRangeOfRow(0);
  110.             if (pairwiseRangeMaster->from <= multipleRangeMaster->from &&
  111.                     pairwiseRangeMaster->to >= multipleRangeMaster->to) {
  112.                 pairwiseRangeSlave = (*p)->GetRangeOfRow(1);
  113.                 blockInfo->freezeBlocks[i] = pairwiseRangeSlave->from +
  114.                     (multipleRangeMaster->from - pairwiseRangeMaster->from);
  115.                 break;
  116.             }
  117.         }
  118.         if (p == pe)
  119.             blockInfo->freezeBlocks[i] = -1;
  120. //        if (blockInfo->freezeBlocks[i] >= 0)
  121. //            TESTMSG("block " << (i+1) << " frozen at query pos " << (blockInfo->freezeBlocks[i]+1));
  122. //        else
  123. //            TESTMSG("block " << (i+1) << " unfrozen");
  124.     }
  125. }
  126. // global stuff for DP block aligner score callback
  127. DP_BlockInfo *dpBlocks = NULL;
  128. const BLAST_Matrix *dpPSSM = NULL;
  129. const Sequence *dpQuery = NULL;
  130. // sum of scores for residue vs. PSSM
  131. int dpScoreFunction(unsigned int block, unsigned int queryPos)
  132. {
  133.     if (!dpBlocks || !dpPSSM || !dpQuery || block >= dpBlocks->nBlocks ||
  134.         queryPos > dpQuery->Length() - dpBlocks->blockSizes[block])
  135.     {
  136.         ERRORMSG("dpScoreFunction() - bad parameters");
  137.         return DP_NEGATIVE_INFINITY;
  138.     }
  139.     int i, masterPos = dpBlocks->blockPositions[block], score = 0;
  140.     for (i=0; i<dpBlocks->blockSizes[block]; ++i)
  141.         score += dpPSSM->matrix[masterPos + i]
  142.             [LookupBLASTResidueNumberFromCharacter(dpQuery->sequenceString[queryPos + i])];
  143.     return score;
  144. }
  145. static BlockMultipleAlignment * UnpackDPResult(DP_BlockInfo *blocks, DP_AlignmentResult *result,
  146.     const Sequence *master, const Sequence *query)
  147. {
  148.     // create new alignment structure
  149.     BlockMultipleAlignment::SequenceList *seqs = new BlockMultipleAlignment::SequenceList(2);
  150.     (*seqs)[0] = master;
  151.     (*seqs)[1] = query;
  152.     auto_ptr<BlockMultipleAlignment>
  153.         bma(new BlockMultipleAlignment(seqs, master->parentSet->alignmentManager));
  154.     // unpack result blocks
  155.     for (unsigned int b=0; b<result->nBlocks; ++b) {
  156.         UngappedAlignedBlock *newBlock = new UngappedAlignedBlock(bma.get());
  157.         newBlock->width = blocks->blockSizes[b + result->firstBlock];
  158.         newBlock->SetRangeOfRow(0,
  159.             blocks->blockPositions[b + result->firstBlock],
  160.             blocks->blockPositions[b + result->firstBlock] + newBlock->width - 1);
  161.         newBlock->SetRangeOfRow(1,
  162.             result->blockPositions[b],
  163.             result->blockPositions[b] + newBlock->width - 1);
  164.         bma->AddAlignedBlockAtEnd(newBlock);
  165.         TRACEMSG("block " << (b+1)
  166.             << " position: " << (result->blockPositions[b]+1)
  167.             << " score: " << dpScoreFunction(b, result->blockPositions[b]));
  168.     }
  169.     // finalize the alignment
  170.     if (!bma->AddUnalignedBlocks() || !bma->UpdateBlockMapAndColors(false)) {
  171.         ERRORMSG("Error finalizing new alignment!");
  172.         return NULL;
  173.     }
  174.     // get scores
  175.     wxString score;
  176.     score.Printf(" raw score: %i", result->score);
  177.     bma->SetRowStatusLine(0, score.c_str());
  178.     bma->SetRowStatusLine(1, score.c_str());
  179.     // success
  180.     return bma.release();
  181. }
  182. bool BlockAligner::CreateNewPairwiseAlignmentsByBlockAlignment(BlockMultipleAlignment *multiple,
  183.     const AlignmentList& toRealign, AlignmentList *newAlignments, int *nRowsAddedToMultiple,
  184.     bool canMerge)
  185. {
  186.     // show options dialog each time block aligner is run
  187.     if (!SetOptions(NULL)) return false;
  188.     if (currentOptions.mergeAfterEachSequence && !canMerge) {
  189.         ERRORMSG("Can only merge when editing is enabled in the sequence window");
  190.         return false;
  191.     }
  192.     newAlignments->clear();
  193.     BlockMultipleAlignment::UngappedAlignedBlockList blocks;
  194.     multiple->GetUngappedAlignedBlocks(&blocks);
  195.     BlockMultipleAlignment::UngappedAlignedBlockList::const_iterator b, be = blocks.end();
  196.     if (nRowsAddedToMultiple) *nRowsAddedToMultiple = 0;
  197.     int i;
  198.     // set up block info
  199.     dpBlocks = DP_CreateBlockInfo(blocks.size());
  200.     unsigned int *loopLengths = new unsigned int[multiple->NRows()];
  201.     BlockMultipleAlignment::UngappedAlignedBlockList::const_iterator n;
  202.     const Block::Range *range, *nextRange;
  203.     for (i=0, b=blocks.begin(); b!=be; ++i, ++b) {
  204.         range = (*b)->GetRangeOfRow(0);
  205.         dpBlocks->blockPositions[i] = range->from;
  206.         dpBlocks->blockSizes[i] = range->to - range->from + 1;
  207.         // calculate max loop lengths
  208.         if (i < blocks.size() - 1) {
  209.             n = b;
  210.             ++n;
  211.             for (int r=0; r<multiple->NRows(); ++r) {
  212.                 range = (*b)->GetRangeOfRow(r);
  213.                 nextRange = (*n)->GetRangeOfRow(r);
  214.                 loopLengths[r] = nextRange->from - range->to - 1;
  215.             }
  216.             dpBlocks->maxLoops[i] = DP_CalculateMaxLoopLength(multiple->NRows(), loopLengths,
  217.                 currentOptions.loopPercentile, currentOptions.loopExtension, currentOptions.loopCutoff);
  218.             TRACEMSG("allowed gap after block " << (i+1) << ": " << dpBlocks->maxLoops[i]);
  219.         }
  220.     }
  221.     delete loopLengths;
  222.     // set up PSSM
  223.     dpPSSM = multiple->GetPSSM();
  224.     bool errorsEncountered = false;
  225.     AlignmentList::const_iterator s, se = toRealign.end();
  226.     for (s=toRealign.begin(); s!=se; ++s) {
  227.         if (multiple && (*s)->GetMaster() != multiple->GetMaster())
  228.             ERRORMSG("master sequence mismatch");
  229.         // slave sequence info
  230.         dpQuery = (*s)->GetSequenceOfRow(1);
  231.         int startQueryPosition =
  232.             ((*s)->alignSlaveFrom >= 0 && (*s)->alignSlaveFrom < dpQuery->Length()) ?
  233.                 (*s)->alignSlaveFrom : 0;
  234.         int endQueryPosition =
  235.             ((*s)->alignSlaveTo >= 0 && (*s)->alignSlaveTo < dpQuery->Length()) ?
  236.                 (*s)->alignSlaveTo : dpQuery->Length() - 1;
  237.         TRACEMSG("query region: " << (startQueryPosition+1) << " to " << (endQueryPosition+1));
  238.         // set frozen blocks
  239.         if (!currentOptions.keepExistingBlocks) {
  240.             for (i=0; i<blocks.size(); ++i)
  241.                 dpBlocks->freezeBlocks[i] = DP_UNFROZEN_BLOCK;
  242.         } else {
  243.             FreezeBlocks(multiple, *s, dpBlocks);
  244.         }
  245.         SetDialogSevereErrors(false);
  246.         // actually do the block alignment
  247.         DP_AlignmentResult *dpResult = NULL;
  248.         int dpStatus;
  249.         if (currentOptions.globalAlignment)
  250.             dpStatus = DP_GlobalBlockAlign(dpBlocks, dpScoreFunction,
  251.                 startQueryPosition, endQueryPosition, &dpResult);
  252.         else
  253.             dpStatus = DP_LocalBlockAlign(dpBlocks, dpScoreFunction,
  254.                 startQueryPosition, endQueryPosition, &dpResult);
  255.         SetDialogSevereErrors(true);
  256.         // create new alignment from DP result
  257.         BlockMultipleAlignment *dpAlignment = NULL;
  258.         if (dpResult) {
  259.             dpAlignment = UnpackDPResult(dpBlocks, dpResult, multiple->GetMaster(), dpQuery);
  260.             if (!dpAlignment)
  261.                 ERRORMSG("Couldn't create BlockMultipleAlignment from DP result");
  262.         }
  263.         if (dpStatus == STRUCT_DP_FOUND_ALIGNMENT && dpAlignment) {
  264.             // merge or add alignment to list
  265.             if (currentOptions.mergeAfterEachSequence && multiple->MergeAlignment(dpAlignment)) {
  266.                 delete dpAlignment; // if merge is successful, we can delete this alignment;
  267.                 if (nRowsAddedToMultiple)
  268.                     (*nRowsAddedToMultiple)++;
  269.                 else
  270.                     ERRORMSG("BlockAligner::CreateNewPairwiseAlignmentsByBlockAlignment() "
  271.                         "called with merge on, but NULL nRowsAddedToMultiple pointer");
  272.                 // recalculate PSSM
  273.                 dpPSSM = multiple->GetPSSM();
  274.             } else {
  275.                 newAlignments->push_back(dpAlignment);
  276.             }
  277.         }
  278.         // no alignment or block aligner failed - add old alignment to list so it doesn't get lost
  279.         else {
  280.             string status;
  281.             if (dpStatus == STRUCT_DP_NO_ALIGNMENT) {
  282.                 WARNINGMSG("block aligner found no significant alignment - current alignment unchanged");
  283.                 status = "alignment unchanged";
  284.             } else {
  285.                 WARNINGMSG("block aligner encountered a problem - current alignment unchanged");
  286.                 errorsEncountered = true;
  287.                 status = "block aligner error!";
  288.             }
  289.             BlockMultipleAlignment *newAlignment = (*s)->Clone();
  290.             newAlignment->SetRowDouble(0, -1.0);
  291.             newAlignment->SetRowDouble(1, -1.0);
  292.             newAlignment->SetRowStatusLine(0, status);
  293.             newAlignment->SetRowStatusLine(1, status);
  294.             newAlignments->push_back(newAlignment);
  295.         }
  296.         // cleanup
  297.         DP_DestroyAlignmentResult(dpResult);
  298.     }
  299.     if (errorsEncountered)
  300.         ERRORMSG("Block aligner encountered problem(s) - see message log for details");
  301.     // cleanup
  302.     DP_DestroyBlockInfo(dpBlocks);
  303.     dpBlocks = NULL;
  304.     dpPSSM = NULL;
  305.     dpQuery = NULL;
  306.     return true;
  307. }
  308. bool BlockAligner::SetOptions(wxWindow* parent)
  309. {
  310.     BlockAlignerOptionsDialog dialog(parent, currentOptions);
  311.     bool ok = (dialog.ShowModal() == wxOK);
  312.     if (ok && !dialog.GetValues(&currentOptions))
  313.         ERRORMSG("Error getting options from dialog!");
  314.     return ok;
  315. }
  316. /////////////////////////////////////////////////////////////////////////////////////
  317. ////// BlockAlignerOptionsDialog stuff
  318. ////// taken (and modified) from block_aligner_dialog.wdr code
  319. /////////////////////////////////////////////////////////////////////////////////////
  320. #define ID_TEXT 10000
  321. #define ID_T_PERCENT 10001
  322. #define ID_S_EXT 10002
  323. #define ID_T_EXTENSION 10003
  324. #define ID_S_PERCENT 10004
  325. #define ID_T_CUTOFF 10005
  326. #define ID_S_LAMBDA 10006
  327. #define ID_C_GLOBAL 10007
  328. #define ID_C_KEEP 10008
  329. #define ID_C_MERGE 10009
  330. #define ID_B_OK 10010
  331. #define ID_B_CANCEL 10011
  332. BEGIN_EVENT_TABLE(BlockAlignerOptionsDialog, wxDialog)
  333.     EVT_BUTTON(-1,  BlockAlignerOptionsDialog::OnButton)
  334.     EVT_CLOSE (     BlockAlignerOptionsDialog::OnCloseWindow)
  335. END_EVENT_TABLE()
  336. BlockAlignerOptionsDialog::BlockAlignerOptionsDialog(
  337.     wxWindow* parent, const BlockAligner::BlockAlignerOptions& init) :
  338.         wxDialog(parent, -1, "Set Block Aligner Options", wxPoint(100,100), wxDefaultSize,
  339.             wxCAPTION | wxSYSTEM_MENU) // not resizable
  340. {
  341.     wxPanel *panel = new wxPanel(this, -1);
  342.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  343.     wxStaticBox *item2 = new wxStaticBox( panel, -1, wxT("Block Aligner Options") );
  344.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL );
  345.     wxFlexGridSizer *item3 = new wxFlexGridSizer( 3, 0, 0 );
  346.     item3->AddGrowableCol( 1 );
  347.     wxStaticText *item4 = new wxStaticText( panel, ID_TEXT, wxT("Loop percentile:"), wxDefaultPosition, wxDefaultSize, 0 );
  348.     item3->Add( item4, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  349.     fpPercent = new FloatingPointSpinCtrl(panel,
  350.         0.0, 100.0, 0.6, init.loopPercentile,
  351.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  352.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  353.     item3->Add(fpPercent->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  354.     item3->Add(fpPercent->GetSpinButton(), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5);
  355.     wxStaticText *item7 = new wxStaticText( panel, ID_TEXT, wxT("Loop extension:"), wxDefaultPosition, wxDefaultSize, 0 );
  356.     item3->Add( item7, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  357.     iExtension = new IntegerSpinCtrl(panel,
  358.         0, 100000, 10, init.loopExtension,
  359.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  360.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  361.     item3->Add(iExtension->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  362.     item3->Add(iExtension->GetSpinButton(), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5);
  363.     wxStaticText *item10 = new wxStaticText( panel, ID_TEXT, wxT("Loop cutoff (0=none):"), wxDefaultPosition, wxDefaultSize, 0 );
  364.     item3->Add( item10, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  365.     iCutoff = new IntegerSpinCtrl(panel,
  366.         0, 100000, 0, init.loopCutoff,
  367.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  368.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  369.     item3->Add(iCutoff->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  370.     item3->Add(iCutoff->GetSpinButton(), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5);
  371.     item3->Add( 5, 5, 0, wxALIGN_CENTRE|wxALL, 5 );
  372.     item3->Add( 5, 5, 0, wxALIGN_CENTRE|wxALL, 5 );
  373.     item3->Add( 5, 5, 0, wxALIGN_CENTRE|wxALL, 5 );
  374.     wxStaticText *item13 = new wxStaticText( panel, ID_TEXT, wxT("Global alignment:"), wxDefaultPosition, wxDefaultSize, 0 );
  375.     item3->Add( item13, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  376.     cGlobal = new wxCheckBox( panel, ID_C_GLOBAL, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
  377.     cGlobal->SetValue(init.globalAlignment);
  378.     item3->Add( cGlobal, 0, wxALIGN_CENTRE|wxALL, 5 );
  379.     item3->Add( 5, 5, 0, wxALIGN_CENTRE, 5 );
  380.     wxStaticText *item15 = new wxStaticText( panel, ID_TEXT, wxT("Keep existing blocks (global only):"), wxDefaultPosition, wxDefaultSize, 0 );
  381.     item3->Add( item15, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  382.     cKeep = new wxCheckBox( panel, ID_C_KEEP, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
  383.     cKeep->SetValue(init.keepExistingBlocks);
  384.     item3->Add( cKeep, 0, wxALIGN_CENTRE|wxALL, 5 );
  385.     item3->Add( 5, 5, 0, wxALIGN_CENTRE, 5 );
  386.     wxStaticText *item17 = new wxStaticText( panel, ID_TEXT, wxT("Merge after each row aligned:"), wxDefaultPosition, wxDefaultSize, 0 );
  387.     item3->Add( item17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  388.     cMerge = new wxCheckBox( panel, ID_C_MERGE, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
  389.     cMerge->SetValue(init.mergeAfterEachSequence);
  390.     item3->Add( cMerge, 0, wxALIGN_CENTRE|wxALL, 5 );
  391.     item3->Add( 5, 5, 0, wxALIGN_CENTRE, 5 );
  392.     item1->Add( item3, 0, wxALIGN_CENTRE, 5 );
  393.     item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
  394.     wxBoxSizer *item19 = new wxBoxSizer( wxHORIZONTAL );
  395.     wxButton *item20 = new wxButton( panel, ID_B_OK, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 );
  396.     item19->Add( item20, 0, wxALIGN_CENTRE|wxALL, 5 );
  397.     item19->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 );
  398.     wxButton *item21 = new wxButton( panel, ID_B_CANCEL, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
  399.     item19->Add( item21, 0, wxALIGN_CENTRE|wxALL, 5 );
  400.     item0->Add( item19, 0, wxALIGN_CENTRE|wxALL, 5 );
  401.     panel->SetAutoLayout(true);
  402.     panel->SetSizer(item0);
  403.     item0->Fit(this);
  404.     item0->Fit(panel);
  405.     item0->SetSizeHints(this);
  406. }
  407. BlockAlignerOptionsDialog::~BlockAlignerOptionsDialog(void)
  408. {
  409.     delete iCutoff;
  410.     delete iExtension;
  411.     delete fpPercent;
  412. }
  413. bool BlockAlignerOptionsDialog::GetValues(BlockAligner::BlockAlignerOptions *options)
  414. {
  415.     options->globalAlignment = cGlobal->IsChecked();
  416.     options->keepExistingBlocks = cKeep->IsChecked();
  417.     options->mergeAfterEachSequence = cMerge->IsChecked();
  418.     return (
  419.         fpPercent->GetDouble(&(options->loopPercentile)) &&
  420.         iExtension->GetInteger(&(options->loopExtension)) &&
  421.         iCutoff->GetInteger(&(options->loopCutoff))
  422.     );
  423. }
  424. void BlockAlignerOptionsDialog::OnCloseWindow(wxCloseEvent& event)
  425. {
  426.     EndModal(wxCANCEL);
  427. }
  428. void BlockAlignerOptionsDialog::OnButton(wxCommandEvent& event)
  429. {
  430.     if (event.GetId() == ID_B_OK) {
  431. BlockAligner::BlockAlignerOptions dummy;
  432.         if (GetValues(&dummy))  // can't successfully quit if values aren't valid
  433.             EndModal(wxOK);
  434.         else
  435.             wxBell();
  436.     } else if (event.GetId() == ID_B_CANCEL) {
  437.         EndModal(wxCANCEL);
  438.     } else {
  439.         event.Skip();
  440.     }
  441. }
  442. END_SCOPE(Cn3D)
  443. /*
  444. * ---------------------------------------------------------------------------
  445. * $Log: cn3d_ba_interface.cpp,v $
  446. * Revision 1000.2  2004/06/01 18:28:07  gouriano
  447. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.33
  448. *
  449. * Revision 1.33  2004/05/21 21:41:39  gorelenk
  450. * Added PCH ncbi_pch.hpp
  451. *
  452. * Revision 1.32  2004/03/15 18:19:23  thiessen
  453. * prefer prefix vs. postfix ++/-- operators
  454. *
  455. * Revision 1.31  2004/03/10 23:15:51  thiessen
  456. * add ability to turn off/on error dialogs; group block aligner errors in message log
  457. *
  458. * Revision 1.30  2004/02/19 17:04:48  thiessen
  459. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  460. *
  461. * Revision 1.29  2004/02/19 02:16:06  thiessen
  462. * fix struct_dp.h path
  463. *
  464. * Revision 1.28  2003/08/23 22:26:23  thiessen
  465. * switch to new dp block aligner, remove Alejandro's
  466. *
  467. * Revision 1.27  2003/07/21 19:54:10  thiessen
  468. * fix firstBlock error
  469. *
  470. * Revision 1.26  2003/07/14 18:35:27  thiessen
  471. * run DP and Alejandro's block aligners, and compare results
  472. *
  473. * Revision 1.25  2003/03/27 18:45:59  thiessen
  474. * update blockaligner code
  475. *
  476. * Revision 1.24  2003/02/03 19:20:02  thiessen
  477. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  478. *
  479. * Revision 1.23  2003/01/23 20:03:05  thiessen
  480. * add BLAST Neighbor algorithm
  481. *
  482. * Revision 1.22  2003/01/22 14:47:30  thiessen
  483. * cache PSSM in BlockMultipleAlignment
  484. *
  485. * Revision 1.21  2002/12/20 02:51:46  thiessen
  486. * fix Prinf to self problems
  487. *
  488. * Revision 1.20  2002/12/09 16:25:04  thiessen
  489. * allow negative score threshholds
  490. *
  491. * Revision 1.19  2002/11/06 00:18:10  thiessen
  492. * fixes for new CRef/const rules in objects
  493. *
  494. * Revision 1.18  2002/09/30 17:13:02  thiessen
  495. * change structure import to do sequences as well; change cache to hold mimes; change block aligner vocabulary; fix block aligner dialog bugs
  496. *
  497. * Revision 1.17  2002/09/23 19:12:32  thiessen
  498. * add option to allow long gaps between frozen blocks
  499. *
  500. * Revision 1.16  2002/09/21 12:36:28  thiessen
  501. * add frozen block position validation; add select-other-by-distance
  502. *
  503. * Revision 1.15  2002/09/20 17:48:39  thiessen
  504. * fancier trace statements
  505. *
  506. * Revision 1.14  2002/09/19 14:09:41  thiessen
  507. * position options dialog higher up
  508. *
  509. * Revision 1.13  2002/09/19 12:51:08  thiessen
  510. * fix block aligner / update bug; add distance select for other molecules only
  511. *
  512. * Revision 1.12  2002/09/16 21:24:58  thiessen
  513. * add block freezing to block aligner
  514. *
  515. * Revision 1.11  2002/08/15 22:13:13  thiessen
  516. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  517. *
  518. * Revision 1.10  2002/08/14 00:02:08  thiessen
  519. * combined block/global aligner from Alejandro
  520. *
  521. * Revision 1.8  2002/08/09 18:24:08  thiessen
  522. * improve/add magic formula to avoid Windows symbol clashes
  523. *
  524. * Revision 1.7  2002/08/04 21:41:05  thiessen
  525. * fix GetObject problem
  526. *
  527. * Revision 1.6  2002/08/01 12:51:36  thiessen
  528. * add E-value display to block aligner
  529. *
  530. * Revision 1.5  2002/08/01 01:55:16  thiessen
  531. * add block aligner options dialog
  532. *
  533. * Revision 1.4  2002/07/29 19:22:46  thiessen
  534. * another blockalign bug fix; set better parameters to block aligner
  535. *
  536. * Revision 1.3  2002/07/29 13:25:42  thiessen
  537. * add range restriction to block aligner
  538. *
  539. * Revision 1.2  2002/07/27 12:29:51  thiessen
  540. * fix block aligner crash
  541. *
  542. * Revision 1.1  2002/07/26 15:28:45  thiessen
  543. * add Alejandro's block alignment algorithm
  544. *
  545. */