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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: sequence_viewer.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 18:29:12  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.67
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: sequence_viewer.cpp,v 1000.4 2004/06/01 18:29:12 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. *      implementation of non-GUI part of main sequence/alignment viewer
  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 <memory>
  47. #include "sequence_viewer.hpp"
  48. #include "sequence_viewer_window.hpp"
  49. #include "sequence_display.hpp"
  50. #include "messenger.hpp"
  51. #include "alignment_manager.hpp"
  52. #include "structure_set.hpp"
  53. #include "molecule_identifier.hpp"
  54. #include "cn3d_tools.hpp"
  55. #include "sequence_set.hpp"
  56. USING_NCBI_SCOPE;
  57. BEGIN_SCOPE(Cn3D)
  58. SequenceViewer::SequenceViewer(AlignmentManager *alnMgr) :
  59.     // not sure why this cast is necessary, but MSVC requires it...
  60.     ViewerBase(reinterpret_cast<ViewerWindowBase**>(&sequenceWindow), alnMgr),
  61.     sequenceWindow(NULL)
  62. {
  63. }
  64. SequenceViewer::~SequenceViewer(void)
  65. {
  66. }
  67. void SequenceViewer::CreateSequenceWindow(bool showNow)
  68. {
  69.     if (sequenceWindow) {
  70.         sequenceWindow->Show(showNow);
  71.         if (showNow)
  72.             GlobalMessenger()->PostRedrawSequenceViewer(this);
  73.     } else {
  74.         SequenceDisplay *display = GetCurrentDisplay();
  75.         if (display) {
  76.             sequenceWindow = new SequenceViewerWindow(this);
  77.             sequenceWindow->NewDisplay(display, true);
  78.             sequenceWindow->ScrollToColumn(display->GetStartingColumn());
  79.             sequenceWindow->Show(showNow);
  80.             // ScrollTo causes immediate redraw, so don't need a second one
  81.             GlobalMessenger()->UnPostRedrawSequenceViewer(this);
  82.         }
  83.     }
  84. }
  85. void SequenceViewer::SaveAlignment(void)
  86. {
  87.     KeepCurrent();
  88.     // go back into the original pairwise alignment data and save according to the
  89.     // current edited BlockMultipleAlignment and display row order
  90.     vector < int > rowOrder;
  91.     const SequenceDisplay *display = GetCurrentDisplay();
  92.     for (int i=0; i<display->rows.size(); ++i) {
  93.         DisplayRowFromAlignment *alnRow = dynamic_cast<DisplayRowFromAlignment*>(display->rows[i]);
  94.         if (alnRow) rowOrder.push_back(alnRow->row);
  95.     }
  96.     alignmentManager->SavePairwiseFromMultiple(GetCurrentAlignments().back(), rowOrder);
  97. }
  98. void SequenceViewer::DisplayAlignment(BlockMultipleAlignment *alignment)
  99. {
  100.     SequenceDisplay *display = new SequenceDisplay(true, viewerWindow);
  101.     for (int row=0; row<alignment->NRows(); ++row)
  102.         display->AddRowFromAlignment(row, alignment);
  103.     // set starting scroll to a few residues left of the first aligned block
  104.     display->SetStartingColumn(alignment->GetFirstAlignedBlockPosition() - 5);
  105.     AlignmentList alignments;
  106.     alignments.push_back(alignment);
  107.     InitData(&alignments, display);
  108.     if (sequenceWindow)
  109.         sequenceWindow->UpdateDisplay(display);
  110.     else
  111.         CreateSequenceWindow(false);
  112.     // allow alignment export
  113.     sequenceWindow->EnableExport(true);
  114. }
  115. void SequenceViewer::DisplaySequences(const SequenceList *sequenceList)
  116. {
  117.     SequenceDisplay *display = new SequenceDisplay(false, viewerWindow);
  118.     // populate each line of the display with one sequence, with blank lines inbetween
  119.     SequenceList::const_iterator s, se = sequenceList->end();
  120.     for (s=sequenceList->begin(); s!=se; ++s) {
  121.         // only do sequences from structure if this is a single-structure data file
  122.         if (!(*s)->parentSet->IsMultiStructure() &&
  123.             (*s)->parentSet->objects.front()->mmdbID != (*s)->identifier->mmdbID) continue;
  124.         if (display->NRows() > 0) display->AddRowFromString("");
  125.         // whole sequence on one row
  126.         display->AddRowFromSequence(*s, 0, (*s)->Length() - 1);
  127.     }
  128.     InitData(NULL, display);
  129.     if (sequenceWindow)
  130.         sequenceWindow->UpdateDisplay(display);
  131.     else
  132.         CreateSequenceWindow(false);
  133.     // forbid alignment export
  134.     sequenceWindow->EnableExport(false);
  135. }
  136. void SequenceViewer::TurnOnEditor(void)
  137. {
  138.     if (!sequenceWindow) CreateSequenceWindow(false);
  139.     sequenceWindow->TurnOnEditor();
  140. }
  141. static void DumpFASTA(bool isA2M, const BlockMultipleAlignment *alignment,
  142.     const vector < int >& rowOrder,
  143.     BlockMultipleAlignment::eUnalignedJustification justification, CNcbiOstream& os)
  144. {
  145.     // do whole alignment for now
  146.     int firstCol = 0, lastCol = alignment->AlignmentWidth() - 1, nColumns = 70;
  147.     if (firstCol < 0 || lastCol >= alignment->AlignmentWidth() || firstCol > lastCol || nColumns < 1) {
  148.         ERRORMSG("DumpFASTA() - nonsensical display region parameters");
  149.         return;
  150.     }
  151.     // first fill out ids
  152.     typedef map < const MoleculeIdentifier * , list < string > > IDMap;
  153.     IDMap idMap;
  154.     int row;
  155.     bool anyRepeat = false;
  156.     for (row=0; row<alignment->NRows(); ++row) {
  157.         const Sequence *seq = alignment->GetSequenceOfRow(row);
  158.         list < string >& titleList = idMap[seq->identifier];
  159.         CNcbiOstrstream oss;
  160.         oss << '>';
  161.         if (titleList.size() == 0) {
  162.             // create full title line for first instance of this sequence
  163.             bool prevID = false;
  164.             if (seq->identifier->gi != MoleculeIdentifier::VALUE_NOT_SET) {
  165.                 oss << "gi|" << seq->identifier->gi;
  166.                 prevID = true;
  167.             }
  168.             if (seq->identifier->pdbID.size() > 0) {
  169.                 if (prevID) oss << '|';
  170.                 if (seq->identifier->pdbID == "query" || seq->identifier->pdbID == "consensus") {
  171.                     oss << "lcl|" << seq->identifier->pdbID;
  172.                 } else {
  173.                     oss << "pdb|" << seq->identifier->pdbID;
  174.                     if (seq->identifier->pdbChain != ' ')
  175.                         oss << '|' << (char) seq->identifier->pdbChain << " Chain "
  176.                            << (char) seq->identifier->pdbChain << ',';
  177.                 }
  178.                 prevID = true;
  179.             }
  180.             if (seq->identifier->accession.size() > 0) {
  181.                 if (prevID) oss << '|';
  182.                 oss << seq->identifier->accession;
  183.                 prevID = true;
  184.             }
  185.             if (seq->description.size() > 0)
  186.                 oss << ' ' << seq->description;
  187.         } else {
  188.             // add repeat id
  189.             oss << "lcl|instance #" << (titleList.size() + 1) << " of " << seq->identifier->ToString();
  190.             anyRepeat = true;
  191.         }
  192.         titleList.resize(titleList.size() + 1);
  193.         oss << 'n' << '';
  194.         auto_ptr<char> data(oss.str());
  195.         titleList.back() = data.get();
  196.     }
  197.     static const int eAllRepeats=0, eFakeRepeatIDs=1, eNoRepeats=2;
  198.     int choice = eAllRepeats;
  199.     if (anyRepeat) {
  200.         wxArrayString choices;
  201.         choices.Add("Include all repeats with normal IDs");
  202.         choices.Add("Include all repeats, but use unique IDs");
  203.         choices.Add("Include no repeated sequences");
  204.         choice = wxGetSingleChoiceIndex("How do you want to handle repeated sequences?",
  205.             "Choose repeat type", choices);
  206.         if (choice < 0) return; // cancelled
  207.     }
  208.     // output each alignment row (in order of the display)
  209.     int paragraphStart, nParags = 0, i;
  210.     char ch;
  211.     Vector color, bgColor;
  212.     bool highlighted, drawBG;
  213.     for (row=0; row<alignment->NRows(); ++row) {
  214.         const Sequence *seq = alignment->GetSequenceOfRow(rowOrder[row]);
  215.         // output title
  216.         list < string >& titleList = idMap[seq->identifier];
  217.         if (choice == eAllRepeats) {
  218.             os << titleList.front();    // use full id
  219.         } else if (choice == eFakeRepeatIDs) {
  220.             os << titleList.front();
  221.             titleList.pop_front();      // move to next (fake) id
  222.         } else if (choice == eNoRepeats) {
  223.             if (titleList.size() > 0) {
  224.                 os << titleList.front();
  225.                 titleList.clear();      // remove all ids after first instance
  226.             } else {
  227.                 continue;
  228.             }
  229.         }
  230.         // split alignment up into "paragraphs", each with nColumns
  231.         for (paragraphStart=0; (firstCol+paragraphStart)<=lastCol; paragraphStart+=nColumns, ++nParags) {
  232.             for (i=0; i<nColumns && (firstCol+paragraphStart+i)<=lastCol; ++i) {
  233.                 if (alignment->GetCharacterTraitsAt(firstCol+paragraphStart+i, rowOrder[row], justification,
  234.                         &ch, &color, &highlighted, &drawBG, &bgColor)) {
  235.                     if (ch == '~')
  236.                         os << (isA2M ? '.' : '-');
  237.                     else
  238.                         os << (isA2M ? ch : (char) toupper(ch));
  239.                 } else
  240.                     ERRORMSG("GetCharacterTraitsAt failed!");
  241.             }
  242.             os << 'n';
  243.         }
  244.     }
  245. }
  246. static void DumpText(bool doHTML, const BlockMultipleAlignment *alignment,
  247.     const vector < int >& rowOrder,
  248.     BlockMultipleAlignment::eUnalignedJustification justification, CNcbiOstream& os)
  249. {
  250. #define LEFT_JUSTIFY resetiosflags(IOS_BASE::right) << setiosflags(IOS_BASE::left)
  251. #define RIGHT_JUSTIFY resetiosflags(IOS_BASE::left) << setiosflags(IOS_BASE::right)
  252.     // do whole alignment for now
  253.     int firstCol = 0, lastCol = alignment->AlignmentWidth() - 1, nColumns = 60;
  254.     if (firstCol < 0 || lastCol >= alignment->AlignmentWidth() || firstCol > lastCol || nColumns < 1) {
  255.         ERRORMSG("DumpText() - nonsensical display region parameters");
  256.         return;
  257.     }
  258.     // HTML colors
  259.     static const string
  260.         bgColor("#FFFFFF"), rulerColor("#700777"), numColor("#229922");
  261.     // set up the titles and uids, figure out how much space any seqLoc string will take
  262.     vector < string > titles(alignment->NRows()), uids(doHTML ? alignment->NRows() : 0);
  263.     int alnRow, row, maxTitleLength = 0, maxSeqLocStrLength = 0, leftMargin, decimalLength;
  264.     for (alnRow=0; alnRow<alignment->NRows(); ++alnRow) {
  265.         row = rowOrder[alnRow]; // translate display row -> data row
  266.         const Sequence *sequence = alignment->GetSequenceOfRow(row);
  267.         titles[row] = sequence->identifier->ToString();
  268.         if (titles[row].size() > maxTitleLength) maxTitleLength = titles[row].size();
  269.         decimalLength = ((int) log10((double) sequence->Length())) + 1;
  270.         if (decimalLength > maxSeqLocStrLength) maxSeqLocStrLength = decimalLength;
  271.         // uid for link to entrez
  272.         if (doHTML) {
  273.             // prefer gi's, since accessions can be outdated
  274.             if (sequence->identifier->gi != MoleculeIdentifier::VALUE_NOT_SET) {
  275.                 CNcbiOstrstream uidoss;
  276.                 uidoss << sequence->identifier->gi << '';
  277.                 uids[row] = uidoss.str();
  278.                 delete uidoss.str();
  279.             } else if (sequence->identifier->pdbID.size() > 0) {
  280.                 if (sequence->identifier->pdbID != "query" &&
  281.                     sequence->identifier->pdbID != "consensus") {
  282.                     uids[row] = sequence->identifier->pdbID;
  283.                     if (sequence->identifier->pdbChain != ' ')
  284.                         uids[row] += (char) sequence->identifier->pdbChain;
  285.                 }
  286.             } else if (sequence->identifier->accession.size() > 0) {
  287.                 uids[row] = sequence->identifier->accession;
  288.             }
  289.         }
  290.     }
  291.     leftMargin = maxTitleLength + maxSeqLocStrLength + 2;
  292.     // need to keep track of first, last seqLocs for each row in each paragraph;
  293.     // find seqLoc of first residue >= firstCol
  294.     vector < int > lastShownSeqLocs(alignment->NRows());
  295.     int alnLoc, i;
  296.     char ch;
  297.     Vector color, bgCol;
  298.     bool highlighted, drawBG;
  299.     for (alnRow=0; alnRow<alignment->NRows(); ++alnRow) {
  300.         row = rowOrder[alnRow]; // translate display row -> data row
  301.         lastShownSeqLocs[row] = -1;
  302.         for (alnLoc=0; alnLoc<firstCol; ++alnLoc) {
  303.             if (!alignment->GetCharacterTraitsAt(alnLoc, row, justification,
  304.                     &ch, &color, &highlighted, &drawBG, &bgCol))
  305.                 ch = '~';
  306.             if (ch != '~') lastShownSeqLocs[row]++;
  307.         }
  308.     }
  309.     // header
  310.     if (doHTML)
  311.         os << "<HTML><TITLE>Alignment Exported From Cn3D</TITLE>n" <<
  312.             "<BODY BGCOLOR=" << bgColor << ">n";
  313.     // split alignment up into "paragraphs", each with nColumns
  314.     if (doHTML) os << "<TABLE>n";
  315.     int paragraphStart, nParags = 0;
  316.     for (paragraphStart=0; (firstCol+paragraphStart)<=lastCol; paragraphStart+=nColumns, ++nParags) {
  317.         // start table row
  318.         if (doHTML)
  319.             os << "<tr><td><pre>n";
  320.         else
  321.             if (paragraphStart > 0) os << 'n';
  322.         // do ruler
  323.         int nMarkers = 0, width;
  324.         if (doHTML) os << "<font color=" << rulerColor << '>';
  325.         for (i=0; i<nColumns && (firstCol+paragraphStart+i)<=lastCol; ++i) {
  326.             if ((paragraphStart+i+1)%10 == 0) {
  327.                 if (nMarkers == 0)
  328.                     width = leftMargin + i + 1;
  329.                 else
  330.                     width = 10;
  331.                 os << RIGHT_JUSTIFY << setw(width) << (paragraphStart+i+1);
  332.                 ++nMarkers;
  333.             }
  334.         }
  335.         if (doHTML) os << "</font>";
  336.         os << 'n';
  337.         if (doHTML) os << "<font color=" << rulerColor << '>';
  338.         for (i=0; i<leftMargin; ++i) os << ' ';
  339.         for (i=0; i<nColumns && (firstCol+paragraphStart+i)<=lastCol; ++i) {
  340.             if ((paragraphStart+i+1)%10 == 0)
  341.                 os << '|';
  342.             else if ((paragraphStart+i+1)%5 == 0)
  343.                 os << '*';
  344.             else
  345.                 os << '.';
  346.         }
  347.         if (doHTML) os << "</font>";
  348.         os << 'n';
  349.         int nDisplayedResidues;
  350.         // output each alignment row
  351.         for (alnRow=0; alnRow<alignment->NRows(); ++alnRow) {
  352.             row = rowOrder[alnRow]; // translate display row -> data row
  353.             const Sequence *sequence = alignment->GetSequenceOfRow(row);
  354.             // actual sequence characters and colors; count how many non-gaps in each row
  355.             nDisplayedResidues = 0;
  356.             string rowChars;
  357.             vector < string > rowColors;
  358.             for (i=0; i<nColumns && (firstCol+paragraphStart+i)<=lastCol; ++i) {
  359.                 if (!alignment->GetCharacterTraitsAt(firstCol+paragraphStart+i, row, justification,
  360.                         &ch, &color, &highlighted, &drawBG, &bgCol))
  361.                     ch = '?';
  362.                 rowChars += ch;
  363.                 wxString colorStr;
  364.                 colorStr.Printf("#%02x%02x%02x",
  365.                     (int) (color[0]*255), (int) (color[1]*255), (int) (color[2]*255));
  366.                 rowColors.push_back(colorStr.c_str());
  367.                 if (ch != '~') ++nDisplayedResidues;
  368.             }
  369.             // title
  370.             if (doHTML && uids[row].size() > 0) {
  371.                 os << "<a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi"
  372.                     << "?cmd=Search&doptcmdl=GenPept&db=Protein&term="
  373.                     << uids[row] << "" onMouseOut="window.status=''"n"
  374.                     << "onMouseOver="window.status='"
  375.                     << ((sequence->description.size() > 0) ? sequence->description : titles[row])
  376.                     << "';return true">"
  377.                     << setw(0) << titles[row] << "</a>";
  378.             } else {
  379.                 os << setw(0) << titles[row];
  380.             }
  381.             os << setw(maxTitleLength+1-titles[row].size()) << ' ';
  382.             // left start pos (output 1-numbered for humans...)
  383.             if (doHTML) os << "<font color=" << numColor << '>';
  384.             if (nDisplayedResidues > 0)
  385.                 os << RIGHT_JUSTIFY << setw(maxSeqLocStrLength) << (lastShownSeqLocs[row]+2) << ' ';
  386.             else
  387.                 os << RIGHT_JUSTIFY << setw(maxSeqLocStrLength) << ' ' << ' ';
  388.             // dump sequence, applying color changes only when necessary
  389.             if (doHTML) {
  390.                 string prevColor;
  391.                 for (i=0; i<rowChars.size(); ++i) {
  392.                     if (rowColors[i] != prevColor) {
  393.                         os << "</font><font color=" << rowColors[i] << '>';
  394.                         prevColor = rowColors[i];
  395.                     }
  396.                     os << rowChars[i];
  397.                 }
  398.                 os << "</font>";
  399.             } else
  400.                 os << rowChars;
  401.             // right end pos
  402.             if (nDisplayedResidues > 0) {
  403.                 os << ' ';
  404.                 if (doHTML) os << "<font color=" << numColor << '>';
  405.                 os << LEFT_JUSTIFY << setw(0) << (lastShownSeqLocs[row]+nDisplayedResidues+1);
  406.                 if (doHTML) os << "</font>";
  407.             }
  408.             os << 'n';
  409.             // setup to begin next parag
  410.             lastShownSeqLocs[row] += nDisplayedResidues;
  411.         }
  412.         // end table row
  413.         if (doHTML) os << "</pre></td></tr>n";
  414.     }
  415.     if (doHTML)
  416.         os << "</TABLE>n"
  417.             << "</BODY></HTML>n";
  418.     // additional sanity check on seqloc markers
  419.     if (firstCol == 0 && lastCol == alignment->AlignmentWidth()-1) {
  420.         for (alnRow=0; alnRow<alignment->NRows(); ++alnRow) {
  421.             row = rowOrder[alnRow]; // translate display row -> data row
  422.             if (lastShownSeqLocs[row] !=
  423.                     alignment->GetSequenceOfRow(row)->Length()-1) {
  424.                 ERRORMSG("DumpText: full display - seqloc markers don't add up for row " << row);
  425.                 break;
  426.             }
  427.         }
  428.         if (alnRow != alignment->NRows())
  429.             ERRORMSG("DumpText: full display - seqloc markers don't add up correctly");
  430.     }
  431. }
  432. void SequenceViewer::ExportAlignment(eExportType type)
  433. {
  434.     // get filename
  435.     wxString extension, wildcard;
  436.     if (type == asFASTA) { extension = ".fsa"; wildcard = "FASTA Files (*.fsa)|*.fsa"; }
  437.     else if (type == asFASTAa2m) { extension = ".a2m"; wildcard = "A2M FASTA (*.a2m)|*.a2m"; }
  438.     else if (type == asText) { extension = ".txt"; wildcard = "Text Files (*.txt)|*.txt"; }
  439.     else if (type == asHTML) { extension = ".html"; wildcard = "HTML Files (*.html)|*.html"; }
  440.     wxString outputFolder = wxString(GetUserDir().c_str(), GetUserDir().size() - 1); // remove trailing /
  441.     wxString baseName, outputFile;
  442.     wxSplitPath(GetWorkingFilename().c_str(), NULL, &baseName, NULL);
  443.     wxFileDialog dialog(sequenceWindow, "Choose a file for alignment export:", outputFolder,
  444. #ifdef __WXGTK__
  445.         baseName + extension,
  446. #else
  447.         baseName,
  448. #endif
  449.         wildcard, wxSAVE | wxOVERWRITE_PROMPT);
  450.     dialog.SetFilterIndex(0);
  451.     if (dialog.ShowModal() == wxID_OK)
  452.         outputFile = dialog.GetPath();
  453.     if (outputFile.size() > 0) {
  454.         // create output stream
  455.         auto_ptr<CNcbiOfstream> ofs(new CNcbiOfstream(outputFile.c_str(), IOS_BASE::out));
  456.         if (!(*ofs)) {
  457.             ERRORMSG("Unable to open output file " << outputFile.c_str());
  458.             return;
  459.         }
  460.         // map display row order to rows in BlockMultipleAlignment
  461.         vector < int > rowOrder;
  462.         const SequenceDisplay *display = GetCurrentDisplay();
  463.         for (int i=0; i<display->rows.size(); ++i) {
  464.             DisplayRowFromAlignment *alnRow = dynamic_cast<DisplayRowFromAlignment*>(display->rows[i]);
  465.             if (alnRow) rowOrder.push_back(alnRow->row);
  466.         }
  467.         // actually write the alignment
  468.         if (type == asFASTA || type == asFASTAa2m) {
  469.             INFOMSG("exporting" << (type == asFASTAa2m ? " A2M " : " ") << "FASTA to " << outputFile.c_str());
  470.             DumpFASTA((type == asFASTAa2m), alignmentManager->GetCurrentMultipleAlignment(),
  471.                 rowOrder, sequenceWindow->GetCurrentJustification(), *ofs);
  472.         } else if (type == asText || type == asHTML) {
  473.             INFOMSG("exporting " << (type == asText ? "text" : "HTML") << " to " << outputFile.c_str());
  474.             DumpText((type == asHTML), alignmentManager->GetCurrentMultipleAlignment(),
  475.                 rowOrder, sequenceWindow->GetCurrentJustification(), *ofs);
  476.         }
  477.     }
  478. }
  479. END_SCOPE(Cn3D)
  480. /*
  481. * ---------------------------------------------------------------------------
  482. * $Log: sequence_viewer.cpp,v $
  483. * Revision 1000.4  2004/06/01 18:29:12  gouriano
  484. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.67
  485. *
  486. * Revision 1.67  2004/05/21 21:41:39  gorelenk
  487. * Added PCH ncbi_pch.hpp
  488. *
  489. * Revision 1.66  2004/03/15 18:32:03  thiessen
  490. * prefer prefix vs. postfix ++/-- operators
  491. *
  492. * Revision 1.65  2004/02/19 17:05:07  thiessen
  493. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  494. *
  495. * Revision 1.64  2003/11/26 20:37:54  thiessen
  496. * prefer gi for URLs
  497. *
  498. * Revision 1.63  2003/11/20 22:08:50  thiessen
  499. * update Entrez url
  500. *
  501. * Revision 1.62  2003/10/13 14:16:31  thiessen
  502. * add -n option to not show alignment window
  503. *
  504. * Revision 1.61  2003/02/05 14:55:22  thiessen
  505. * always load single structure even if structureLimit == 0
  506. *
  507. * Revision 1.60  2003/02/03 19:20:05  thiessen
  508. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  509. *
  510. * Revision 1.59  2002/12/09 16:25:04  thiessen
  511. * allow negative score threshholds
  512. *
  513. * Revision 1.58  2002/12/06 17:07:15  thiessen
  514. * remove seqrow export format; add choice of repeat handling for FASTA export; export rows in display order
  515. *
  516. * Revision 1.57  2002/12/02 13:37:08  thiessen
  517. * add seqrow format export
  518. *
  519. * Revision 1.56  2002/10/13 22:58:08  thiessen
  520. * add redo ability to editor
  521. *
  522. * Revision 1.55  2002/09/09 13:38:23  thiessen
  523. * separate save and save-as
  524. *
  525. * Revision 1.54  2002/09/03 13:15:58  thiessen
  526. * add A2M export
  527. *
  528. * Revision 1.53  2002/08/15 22:13:16  thiessen
  529. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  530. *
  531. * Revision 1.52  2002/06/06 01:30:02  thiessen
  532. * fixes for linux/gcc
  533. *
  534. * Revision 1.51  2002/06/05 14:28:40  thiessen
  535. * reorganize handling of window titles
  536. *
  537. * Revision 1.50  2002/04/22 18:01:55  thiessen
  538. * add default extension for alignment export
  539. *
  540. * Revision 1.49  2002/04/22 14:27:28  thiessen
  541. * add alignment export
  542. *
  543. * Revision 1.48  2002/03/07 19:16:04  thiessen
  544. * don't auto-show sequence windows
  545. *
  546. * Revision 1.47  2002/03/04 15:52:14  thiessen
  547. * hide sequence windows instead of destroying ; add perspective/orthographic projection choice
  548. *
  549. * Revision 1.46  2002/03/01 15:48:05  thiessen
  550. * revert to single line per sequence
  551. *
  552. * Revision 1.45  2002/02/28 19:11:52  thiessen
  553. * wrap sequences in single-structure mode
  554. *
  555. * Revision 1.44  2001/12/06 23:13:45  thiessen
  556. * finish import/align new sequences into single-structure data; many small tweaks
  557. *
  558. * Revision 1.43  2001/11/30 14:02:05  thiessen
  559. * progress on sequence imports to single structures
  560. *
  561. * Revision 1.42  2001/10/01 16:04:24  thiessen
  562. * make CDD annotation window non-modal; add SetWindowTitle to viewers
  563. *
  564. * Revision 1.41  2001/04/05 22:55:36  thiessen
  565. * change bg color handling ; show geometry violations
  566. *
  567. * Revision 1.40  2001/04/04 00:27:14  thiessen
  568. * major update - add merging, threader GUI controls
  569. *
  570. * Revision 1.39  2001/03/30 03:07:34  thiessen
  571. * add threader score calculation & sorting
  572. *
  573. * Revision 1.38  2001/03/13 01:25:06  thiessen
  574. * working undo system for >1 alignment (e.g., update window)
  575. *
  576. * Revision 1.37  2001/03/09 15:49:04  thiessen
  577. * major changes to add initial update viewer
  578. *
  579. * Revision 1.36  2001/03/02 15:32:52  thiessen
  580. * minor fixes to save & show/hide dialogs, wx string headers
  581. *
  582. * Revision 1.35  2001/03/01 20:15:51  thiessen
  583. * major rearrangement of sequence viewer code into base and derived classes
  584. *
  585. * Revision 1.34  2001/02/13 01:03:57  thiessen
  586. * backward-compatible domain ID's in output; add ability to delete rows
  587. *
  588. * Revision 1.33  2001/02/08 23:01:51  thiessen
  589. * hook up C-toolkit stuff for threading; working PSSM calculation
  590. *
  591. * Revision 1.32  2001/01/26 19:29:59  thiessen
  592. * limit undo stack size ; fix memory leak
  593. *
  594. * Revision 1.31  2000/12/29 19:23:39  thiessen
  595. * save row order
  596. *
  597. * Revision 1.30  2000/12/21 23:42:16  thiessen
  598. * load structures from cdd's
  599. *
  600. * Revision 1.29  2000/12/15 15:51:47  thiessen
  601. * show/hide system installed
  602. *
  603. * Revision 1.28  2000/11/30 15:49:39  thiessen
  604. * add show/hide rows; unpack sec. struc. and domain features
  605. *
  606. * Revision 1.27  2000/11/17 19:48:14  thiessen
  607. * working show/hide alignment row
  608. *
  609. * Revision 1.26  2000/11/12 04:02:59  thiessen
  610. * working file save including alignment edits
  611. *
  612. * Revision 1.25  2000/11/11 21:15:54  thiessen
  613. * create Seq-annot from BlockMultipleAlignment
  614. *
  615. * Revision 1.24  2000/11/03 01:12:44  thiessen
  616. * fix memory problem with alignment cloning
  617. *
  618. * Revision 1.23  2000/11/02 16:56:02  thiessen
  619. * working editor undo; dynamic slave transforms
  620. *
  621. * Revision 1.22  2000/10/19 12:40:54  thiessen
  622. * avoid multiple sequence redraws with scroll set
  623. *
  624. * Revision 1.21  2000/10/17 14:35:06  thiessen
  625. * added row shift - editor basically complete
  626. *
  627. * Revision 1.20  2000/10/16 20:03:07  thiessen
  628. * working block creation
  629. *
  630. * Revision 1.19  2000/10/12 19:20:45  thiessen
  631. * working block deletion
  632. *
  633. * Revision 1.18  2000/10/12 16:22:45  thiessen
  634. * working block split
  635. *
  636. * Revision 1.17  2000/10/12 02:14:56  thiessen
  637. * working block boundary editing
  638. *
  639. * Revision 1.16  2000/10/05 18:34:43  thiessen
  640. * first working editing operation
  641. *
  642. * Revision 1.15  2000/10/04 17:41:30  thiessen
  643. * change highlight color (cell background) handling
  644. *
  645. * Revision 1.14  2000/10/03 18:59:23  thiessen
  646. * added row/column selection
  647. *
  648. * Revision 1.13  2000/10/02 23:25:22  thiessen
  649. * working sequence identifier window in sequence viewer
  650. *
  651. * Revision 1.12  2000/09/20 22:22:27  thiessen
  652. * working conservation coloring; split and center unaligned justification
  653. *
  654. * Revision 1.11  2000/09/15 19:24:22  thiessen
  655. * allow repeated structures w/o different local id
  656. *
  657. * Revision 1.10  2000/09/14 14:55:34  thiessen
  658. * add row reordering; misc fixes
  659. *
  660. * Revision 1.9  2000/09/12 01:47:38  thiessen
  661. * fix minor but obscure bug
  662. *
  663. * Revision 1.8  2000/09/11 22:57:33  thiessen
  664. * working highlighting
  665. *
  666. * Revision 1.7  2000/09/11 14:06:29  thiessen
  667. * working alignment coloring
  668. *
  669. * Revision 1.6  2000/09/11 01:46:16  thiessen
  670. * working messenger for sequence<->structure window communication
  671. *
  672. * Revision 1.5  2000/09/08 20:16:55  thiessen
  673. * working dynamic alignment views
  674. *
  675. * Revision 1.4  2000/09/07 17:37:35  thiessen
  676. * minor fixes
  677. *
  678. * Revision 1.3  2000/09/03 18:46:49  thiessen
  679. * working generalized sequence viewer
  680. *
  681. * Revision 1.2  2000/08/30 23:46:28  thiessen
  682. * working alignment display
  683. *
  684. * Revision 1.1  2000/08/30 19:48:42  thiessen
  685. * working sequence window
  686. *
  687. */