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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: data_manager.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:28:33  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: data_manager.cpp,v 1000.2 2004/06/01 18:28:33 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. *      class to manage different root ASN data types
  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 <objects/ncbimime/Entrez_general.hpp>
  47. #include <objects/ncbimime/Biostruc_align.hpp>
  48. #include <objects/ncbimime/Biostruc_align_seq.hpp>
  49. #include <objects/ncbimime/Biostruc_seq.hpp>
  50. #include <objects/ncbimime/Biostruc_seqs.hpp>
  51. #include <objects/ncbimime/Biostruc_seqs_aligns_cdd.hpp>
  52. #include <objects/ncbimime/Bundle_seqs_aligns.hpp>
  53. #include <objects/seqset/Bioseq_set.hpp>
  54. #include <objects/mmdb3/Biostruc_feature_set.hpp>
  55. #include <objects/cdd/Cdd_descr_set.hpp>
  56. #include <objects/cdd/Cdd_descr.hpp>
  57. #include <objects/cdd/Cdd_id.hpp>
  58. #include <objects/cdd/Global_id.hpp>
  59. #include <objects/cdd/Cdd_id_set.hpp>
  60. #include "asn_reader.hpp"
  61. #include "data_manager.hpp"
  62. #include "structure_set.hpp"
  63. #include "sequence_set.hpp"
  64. #include "alignment_set.hpp"
  65. #include "cn3d_tools.hpp"
  66. #include "asn_converter.hpp"
  67. USING_NCBI_SCOPE;
  68. USING_SCOPE(objects);
  69. BEGIN_SCOPE(Cn3D)
  70. ASNDataManager::ASNDataManager(ncbi::objects::CNcbi_mime_asn1 *mime)
  71. {
  72.     mimeData.Reset(mime);
  73.     Load();
  74. }
  75. ASNDataManager::ASNDataManager(ncbi::objects::CCdd *cdd)
  76. {
  77.     cddData.Reset(cdd);
  78.     Load();
  79. }
  80. ASNDataManager::~ASNDataManager(void)
  81. {
  82. }
  83. void ASNDataManager::Load(void)
  84. {
  85.     // initialization
  86.     seqEntryList = NULL;
  87.     masterBiostruc = NULL;
  88.     biostrucList = NULL;
  89.     biostrucModelType = eModel_type_ncbi_all_atom;  // default, for CDD's
  90.     sequenceAlignments = NULL;
  91.     structureAlignments = NULL;
  92.     bundleImports = NULL;
  93.     cddUpdates = NULL;
  94.     dataChanged = 0;
  95.     // mime
  96.     if (mimeData.NotEmpty()) {
  97.         if (mimeData->IsEntrez()) {
  98.             if (mimeData->GetEntrez().GetData().IsStructure())
  99.                 masterBiostruc = &(mimeData->SetEntrez().SetData().SetStructure());
  100.         }
  101.         else if (mimeData->IsAlignstruc()) {
  102.             seqEntryList = &(mimeData->SetAlignstruc().SetSequences());
  103.             masterBiostruc = &(mimeData->SetAlignstruc().SetMaster());
  104.             biostrucList = &(mimeData->SetAlignstruc().SetSlaves());
  105.             structureAlignments = &(mimeData->SetAlignstruc().SetAlignments());
  106.             sequenceAlignments = &(mimeData->SetAlignstruc().SetSeqalign());
  107.         }
  108.         else if (mimeData->IsAlignseq()) {
  109.             seqEntryList = &(mimeData->SetAlignseq().SetSequences());
  110.             sequenceAlignments = &(mimeData->SetAlignseq().SetSeqalign());
  111.         }
  112.         else if (mimeData->IsStrucseq()) {
  113.             seqEntryList = &(mimeData->SetStrucseq().SetSequences());
  114.             masterBiostruc = &(mimeData->SetStrucseq().SetStructure());
  115.         }
  116.         else if (mimeData->IsStrucseqs()) {
  117.             seqEntryList = &(mimeData->SetStrucseqs().SetSequences());
  118.             masterBiostruc = &(mimeData->SetStrucseqs().SetStructure());
  119.             sequenceAlignments = &(mimeData->SetStrucseqs().SetSeqalign());
  120.         }
  121.         else if (mimeData->IsGeneral()) {
  122.             if (mimeData->GetGeneral().IsSetStructures())
  123.                 biostrucList = &(mimeData->SetGeneral().SetStructures());
  124.             if (mimeData->GetGeneral().IsSetStructure_type())
  125.                 // assume structure-type values match MMDB's Model-type
  126.                 biostrucModelType = (EModel_type) mimeData->GetGeneral().GetStructure_type();
  127.             if (mimeData->GetGeneral().GetSeq_align_data().IsBundle()) {
  128.                 if (mimeData->GetGeneral().GetSeq_align_data().GetBundle().IsSetSequences())
  129.                     seqEntryList = &(mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetSequences());
  130.                 if (mimeData->GetGeneral().GetSeq_align_data().GetBundle().IsSetStrucaligns())
  131.                     structureAlignments =
  132.                         &(mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetStrucaligns());
  133.                 if (mimeData->GetGeneral().GetSeq_align_data().GetBundle().IsSetSeqaligns())
  134.                     sequenceAlignments =
  135.                         &(mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetSeqaligns());
  136.                 if (mimeData->GetGeneral().GetSeq_align_data().GetBundle().IsSetImports()) {
  137.                     bundleImports = &(mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetImports());
  138.                     // make "fake" Update-aligns from imports (to pass to alignment manager)
  139.                     SeqAnnotList::iterator i,
  140.                         ie = mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetImports().end();
  141.                     for (i=mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetImports().begin();
  142.                          i!= ie; ++i) {
  143.                         CRef < CUpdate_align > update(new CUpdate_align());
  144.                         update->SetSeqannot(**i);
  145.                         update->SetType(CUpdate_align::eType_other);
  146.                         bundleImportsFaked.push_back(update);
  147.                     }
  148.                 }
  149.             }
  150.             else {  // cdd
  151.                 if (mimeData->GetGeneral().GetSeq_align_data().GetCdd().IsSetSequences()) {
  152.                     if (mimeData->GetGeneral().GetSeq_align_data().GetCdd().GetSequences().IsSeq()) {
  153.                         // convert Seq-entry type from seq to set
  154.                         CRef < CSeq_entry > seqEntry(
  155.                             &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetSequences()));
  156.                         mimeData->SetGeneral().SetSeq_align_data().SetCdd().ResetSequences();
  157.                         mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetSequences().
  158.                             SetSet().SetSeq_set().push_back(seqEntry);
  159.                     }
  160.                     seqEntryList =
  161.                         &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetSequences().SetSet().SetSeq_set());
  162.                 }
  163.                 if (mimeData->GetGeneral().GetSeq_align_data().GetCdd().IsSetFeatures())
  164.                     structureAlignments = &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetFeatures());
  165.                 if (mimeData->GetGeneral().GetSeq_align_data().GetCdd().IsSetSeqannot())
  166.                     sequenceAlignments = &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetSeqannot());
  167.                 if (mimeData->GetGeneral().GetSeq_align_data().GetCdd().IsSetPending())
  168.                     cddUpdates = &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetPending());
  169.             }
  170.         }
  171.         else
  172.             ERRORMSG("Unrecognized mime type!");
  173.     }
  174.     // CDD
  175.     else {
  176.         if (cddData->IsSetSequences()) {
  177.             if (cddData->GetSequences().IsSeq()) {
  178.                 // convert Seq-entry type from seq to set
  179.                 CRef < CSeq_entry > seqEntry(&(cddData->SetSequences()));
  180.                 cddData->ResetSequences();
  181.                 cddData->SetSequences().SetSet().SetSeq_set().push_back(seqEntry);
  182.             }
  183.             seqEntryList = &(cddData->SetSequences().SetSet().SetSeq_set());
  184.         }
  185.         if (cddData->IsSetFeatures())
  186.             structureAlignments = &(cddData->SetFeatures());
  187.         if (cddData->IsSetSeqannot())
  188.             sequenceAlignments = &(cddData->SetSeqannot());
  189.         if (cddData->IsSetPending())
  190.             cddUpdates = &(cddData->SetPending());
  191.     }
  192.     // sequence list is interpreted differently for single structure
  193.     isSingleStructure = (mimeData.NotEmpty() &&
  194.         (mimeData->IsStrucseq() ||
  195.             (mimeData->IsGeneral() &&
  196.                 !sequenceAlignments && !structureAlignments &&
  197.                 biostrucList && biostrucList->size() == 1)));
  198.     TRACEMSG("is single structure: " << (isSingleStructure ? "yes" : "no"));
  199.     // pre-screen sequence alignments to make sure they're all a type we can deal with
  200.     if (sequenceAlignments) {
  201.         list < CRef < CSeq_align > > validAlignments;
  202.         SeqAnnotList::const_iterator n, ne = sequenceAlignments->end();
  203.         for (n=sequenceAlignments->begin(); n!=ne; ++n) {
  204.             if (!n->GetObject().GetData().IsAlign()) {
  205.                 ERRORMSG("Warning - confused by seqannot data format");
  206.                 continue;
  207.             }
  208.             if (n != sequenceAlignments->begin()) TRACEMSG("multiple Seq-annots");
  209.             CSeq_annot::C_Data::TAlign::const_iterator
  210.                 a, ae = n->GetObject().GetData().GetAlign().end();
  211.             for (a=n->GetObject().GetData().GetAlign().begin(); a!=ae; ++a) {
  212.                 // verify this is a type of alignment we can deal with
  213.                 if (!(a->GetObject().GetType() != CSeq_align::eType_partial ||
  214.                     a->GetObject().GetType() != CSeq_align::eType_diags) ||
  215.                     !a->GetObject().IsSetDim() || a->GetObject().GetDim() != 2 ||
  216.                     (!a->GetObject().GetSegs().IsDendiag() && !a->GetObject().GetSegs().IsDenseg())) {
  217.                     ERRORMSG("Warning - confused by alignment type");
  218.                     continue;
  219.                 }
  220.                 validAlignments.push_back(*a);
  221.             }
  222.         }
  223.         sequenceAlignments->clear();
  224.         if (validAlignments.size() == 0) {
  225.             ERRORMSG("Warning - no valid Seq-aligns present");
  226.             sequenceAlignments = NULL;
  227.         } else {
  228.             sequenceAlignments->push_back(CRef < CSeq_annot > (new CSeq_annot()));
  229.             // copy list of valid alignments only
  230.             sequenceAlignments->front()->SetData().SetAlign() = validAlignments;
  231.         }
  232.     }
  233. }
  234. bool ASNDataManager::ConvertMimeDataToCDD(const std::string& cddName)
  235. {
  236.     // if we have CDD data already, this is really easy
  237.     if (IsCDDInMime()) {
  238.         cddData.Reset(GetInternalCDDData());
  239.     }
  240.     else if (IsCDD()){
  241.         return true;    // nothing to do
  242.     }
  243.     // otherwise, splice together from mime data
  244.     else {
  245.         CRef < CCdd > cdd(new CCdd());
  246.         cdd->SetName(cddName);
  247.         // make up a local id
  248.         static int localID = 1;
  249.         CRef < CCdd_id > id(new CCdd_id());
  250.         cdd->SetId().Set().push_back(id);
  251.         CNcbiOstrstream oss;
  252.         oss << "loc" << localID++ << '';
  253.         auto_ptr<char> accession(oss.str());
  254.         id->SetGid().SetAccession(accession.get());
  255.         // fill in data
  256.         if (!seqEntryList) {
  257.             ERRORMSG("can't find sequences to put into new Cdd");
  258.             return false;
  259.         }
  260.         cdd->SetSequences().SetSet().SetSeq_set() = *seqEntryList;
  261.         if (!sequenceAlignments) {
  262.             ERRORMSG("can't find sequence alignments to put into new Cdd");
  263.             return false;
  264.         }
  265.         cdd->SetSeqannot() = *sequenceAlignments;
  266.         if (structureAlignments)
  267.             cdd->SetFeatures(*structureAlignments);
  268.         if (cddUpdates)
  269.             cdd->SetPending() = *cddUpdates;
  270.         if (bundleImportsFaked.size() > 0)
  271.             cdd->SetPending().splice(cdd->SetPending().end(), bundleImportsFaked);
  272.         cddData.Reset(cdd.GetPointer());
  273.     }
  274.     mimeData.Reset();
  275.     Load();
  276.     return true;
  277. }
  278. ASNDataManager::SeqAnnotList * ASNDataManager::GetOrCreateSequenceAlignments(void)
  279. {
  280.     // if necessary, convert mime data into general type that has a place for alignments
  281.     if (!sequenceAlignments && mimeData.NotEmpty() && !mimeData->IsGeneral())
  282.         ConvertMimeToGeneral();
  283.     if (!sequenceAlignments && mimeData.NotEmpty() && mimeData->IsGeneral() &&
  284.             mimeData->GetGeneral().GetSeq_align_data().IsBundle())
  285.         sequenceAlignments =
  286.             &(mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetSeqaligns());
  287.     return sequenceAlignments;
  288. }
  289. const CCn3d_style_dictionary * ASNDataManager::GetStyleDictionary(void) const
  290. {
  291.     if (mimeData.NotEmpty()) {
  292.         if (mimeData->IsAlignstruc() && mimeData->GetAlignstruc().IsSetStyle_dictionary())
  293.             return &(mimeData->GetAlignstruc().GetStyle_dictionary());
  294.         else if (mimeData->IsAlignseq() && mimeData->GetAlignseq().IsSetStyle_dictionary())
  295.             return &(mimeData->GetAlignseq().GetStyle_dictionary());
  296.         else if (mimeData->IsStrucseq() && mimeData->GetStrucseq().IsSetStyle_dictionary())
  297.             return &(mimeData->GetStrucseq().GetStyle_dictionary());
  298.         else if (mimeData->IsStrucseqs() && mimeData->GetStrucseqs().IsSetStyle_dictionary())
  299.             return &(mimeData->GetStrucseqs().GetStyle_dictionary());
  300.         else if (mimeData->IsGeneral()) {
  301.             if (mimeData->GetGeneral().GetSeq_align_data().IsBundle() &&
  302.                 mimeData->GetGeneral().GetSeq_align_data().GetBundle().IsSetStyle_dictionary())
  303.                 return &(mimeData->GetGeneral().GetSeq_align_data().GetBundle().GetStyle_dictionary());
  304.             else if (mimeData->GetGeneral().GetSeq_align_data().IsCdd() &&
  305.                      mimeData->GetGeneral().GetSeq_align_data().GetCdd().IsSetStyle_dictionary())
  306.                 return &(mimeData->GetGeneral().GetSeq_align_data().GetCdd().GetStyle_dictionary());
  307.         }
  308.     } else if (cddData->IsSetStyle_dictionary())
  309.         return &(cddData->GetStyle_dictionary());
  310.     return NULL;
  311. }
  312. void ASNDataManager::SetStyleDictionary(ncbi::objects::CCn3d_style_dictionary& styles)
  313. {
  314.     if (mimeData.NotEmpty()) {
  315.         if (mimeData->IsAlignstruc()) mimeData->SetAlignstruc().SetStyle_dictionary(styles);
  316.         else if (mimeData->IsAlignseq()) mimeData->SetAlignseq().SetStyle_dictionary(styles);
  317.         else if (mimeData->IsStrucseq()) mimeData->SetStrucseq().SetStyle_dictionary(styles);
  318.         else if (mimeData->IsStrucseqs()) mimeData->SetStrucseqs().SetStyle_dictionary(styles);
  319.         else if (mimeData->IsGeneral()) {
  320.             if (mimeData->GetGeneral().GetSeq_align_data().IsBundle())
  321.                 mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetStyle_dictionary(styles);
  322.             else
  323.                 mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetStyle_dictionary(styles);
  324.         }
  325.     } else
  326.         cddData->SetStyle_dictionary(styles);
  327. }
  328. void ASNDataManager::RemoveStyleDictionary(void)
  329. {
  330.     if (mimeData.NotEmpty()) {
  331.         if (mimeData->IsAlignstruc()) mimeData->SetAlignstruc().ResetStyle_dictionary();
  332.         else if (mimeData->IsAlignseq()) mimeData->SetAlignseq().ResetStyle_dictionary();
  333.         else if (mimeData->IsStrucseq()) mimeData->SetStrucseq().ResetStyle_dictionary();
  334.         else if (mimeData->IsStrucseqs()) mimeData->SetStrucseqs().ResetStyle_dictionary();
  335.         else if (mimeData->IsGeneral()) {
  336.             if (mimeData->GetGeneral().GetSeq_align_data().IsBundle())
  337.                 mimeData->SetGeneral().SetSeq_align_data().SetBundle().ResetStyle_dictionary();
  338.             else
  339.                 mimeData->SetGeneral().SetSeq_align_data().SetCdd().ResetStyle_dictionary();
  340.         }
  341.     } else
  342.         cddData->ResetStyle_dictionary();
  343. }
  344. const CCn3d_user_annotations * ASNDataManager::GetUserAnnotations(void) const
  345. {
  346.     if (mimeData.NotEmpty()) {
  347.         if (mimeData->IsAlignstruc() && mimeData->GetAlignstruc().IsSetUser_annotations())
  348.             return &(mimeData->GetAlignstruc().GetUser_annotations());
  349.         else if (mimeData->IsAlignseq() && mimeData->GetAlignseq().IsSetUser_annotations())
  350.             return &(mimeData->GetAlignseq().GetUser_annotations());
  351.         else if (mimeData->IsStrucseq() && mimeData->GetStrucseq().IsSetUser_annotations())
  352.             return &(mimeData->GetStrucseq().GetUser_annotations());
  353.         else if (mimeData->IsStrucseqs() && mimeData->GetStrucseqs().IsSetUser_annotations())
  354.             return &(mimeData->GetStrucseqs().GetUser_annotations());
  355.         else if (mimeData->IsGeneral()) {
  356.             if (mimeData->GetGeneral().GetSeq_align_data().IsBundle() &&
  357.                 mimeData->GetGeneral().GetSeq_align_data().GetBundle().IsSetUser_annotations())
  358.                 return &(mimeData->GetGeneral().GetSeq_align_data().GetBundle().GetUser_annotations());
  359.             else if (mimeData->GetGeneral().GetSeq_align_data().IsCdd() &&
  360.                      mimeData->GetGeneral().GetSeq_align_data().GetCdd().IsSetUser_annotations())
  361.                 return &(mimeData->GetGeneral().GetSeq_align_data().GetCdd().GetUser_annotations());
  362.         }
  363.     } else if (cddData->IsSetUser_annotations())
  364.         return &(cddData->GetUser_annotations());
  365.     return NULL;
  366. }
  367. void ASNDataManager::SetUserAnnotations(ncbi::objects::CCn3d_user_annotations& annots)
  368. {
  369.     if (mimeData.NotEmpty()) {
  370.         if (mimeData->IsAlignstruc()) mimeData->SetAlignstruc().SetUser_annotations(annots);
  371.         else if (mimeData->IsAlignseq()) mimeData->SetAlignseq().SetUser_annotations(annots);
  372.         else if (mimeData->IsStrucseq()) mimeData->SetStrucseq().SetUser_annotations(annots);
  373.         else if (mimeData->IsStrucseqs()) mimeData->SetStrucseqs().SetUser_annotations(annots);
  374.         else if (mimeData->IsGeneral()) {
  375.             if (mimeData->GetGeneral().GetSeq_align_data().IsBundle())
  376.                 mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetUser_annotations(annots);
  377.             else
  378.                 mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetUser_annotations(annots);
  379.         }
  380.     } else
  381.         cddData->SetUser_annotations(annots);
  382. }
  383. void ASNDataManager::RemoveUserAnnotations(void)
  384. {
  385.     if (mimeData.NotEmpty()) {
  386.         if (mimeData->IsAlignstruc()) mimeData->SetAlignstruc().ResetUser_annotations();
  387.         else if (mimeData->IsAlignseq()) mimeData->SetAlignseq().ResetUser_annotations();
  388.         else if (mimeData->IsStrucseq()) mimeData->SetStrucseq().ResetUser_annotations();
  389.         else if (mimeData->IsStrucseqs()) mimeData->SetStrucseqs().ResetUser_annotations();
  390.         else if (mimeData->IsGeneral()) {
  391.             if (mimeData->GetGeneral().GetSeq_align_data().IsBundle())
  392.                 mimeData->SetGeneral().SetSeq_align_data().SetBundle().ResetUser_annotations();
  393.             else
  394.                 mimeData->SetGeneral().SetSeq_align_data().SetCdd().ResetUser_annotations();
  395.         }
  396.     } else
  397.         cddData->ResetUser_annotations();
  398. }
  399. void ASNDataManager::SetStructureAlignments(ncbi::objects::CBiostruc_annot_set *strucAligns)
  400. {
  401.     if (mimeData.NotEmpty() && mimeData->IsGeneral() && mimeData->GetGeneral().GetSeq_align_data().IsBundle()) {
  402.         if (strucAligns)
  403.             mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetStrucaligns(*strucAligns);
  404.         else
  405.             mimeData->SetGeneral().SetSeq_align_data().SetBundle().ResetStrucaligns();
  406.     } else if (GetInternalCDDData()) {
  407.         if (strucAligns)
  408.             GetInternalCDDData()->SetFeatures(*strucAligns);
  409.         else
  410.             GetInternalCDDData()->ResetFeatures();
  411.     } else
  412.         ERRORMSG("ASNDataManager::SetStructureAlignments() - can't add to this data type");
  413.     structureAlignments = strucAligns;
  414. }
  415. bool ASNDataManager::AddBiostrucToASN(ncbi::objects::CBiostruc *biostruc)
  416. {
  417.     // if can't store add'l Biostrucs currently, try to convert to general mime if possible
  418.     if (!biostrucList && mimeData.NotEmpty() && !mimeData->IsGeneral())
  419.         ConvertMimeToGeneral();
  420.     // add structure to list if there is one
  421.     if (biostrucList) {
  422.         biostrucList->push_back(CRef<CBiostruc>(biostruc));
  423.         return true;
  424.     }
  425.     // if this is a CDD, we never store Biostrucs; but return true to pretend success
  426.     if (IsCDD()) return true;
  427.     return false;
  428. }
  429. bool ASNDataManager::ConvertMimeToGeneral(void)
  430. {
  431.     if (mimeData.Empty() || mimeData->IsGeneral()) {
  432.         ERRORMSG("ASNDataManager::ConvertMimeToGeneral() - can't convert to general mime type");
  433.         return false;
  434.     }
  435.     CNcbi_mime_asn1 *newMime = new CNcbi_mime_asn1();
  436.     // copy structures
  437.     if (biostrucList)
  438.         newMime->SetGeneral().SetStructures() = *biostrucList; // copy list
  439.     if (masterBiostruc) {
  440.         newMime->SetGeneral().SetStructures().push_front(CRef<CBiostruc>(masterBiostruc));
  441.         masterBiostruc = NULL;
  442.     }
  443.     biostrucList = (newMime->GetGeneral().GetStructures().size() > 0) ?
  444.         &(newMime->SetGeneral().SetStructures()) : NULL;
  445.     // copy alignment data into bundle
  446.     CBundle_seqs_aligns *bundle = new CBundle_seqs_aligns();
  447.     newMime->SetGeneral().SetSeq_align_data().SetBundle(*bundle);
  448.     if (seqEntryList) {
  449.         bundle->SetSequences() = *seqEntryList;
  450.         seqEntryList = &(bundle->SetSequences());
  451.     }
  452.     if (structureAlignments)
  453.         bundle->SetStrucaligns(*structureAlignments);
  454.     if (sequenceAlignments) {
  455.         bundle->SetSeqaligns() = *sequenceAlignments;
  456.         sequenceAlignments = &(bundle->SetSeqaligns());
  457.     }
  458.     // install new root mime structure
  459.     mimeData.Reset(newMime);
  460.     SetDataChanged(StructureSet::eOtherData);
  461.     return true;
  462. }
  463. void ASNDataManager::ReplaceUpdates(UpdateAlignList& newUpdates)
  464. {
  465.     // if necessary, convert mime data into general type that has a place for imports
  466.     if (mimeData.NotEmpty() && !mimeData->IsGeneral() && newUpdates.size() > 0)
  467.         ConvertMimeToGeneral();
  468.     // store new updates in asn data
  469.     if (mimeData.NotEmpty() && mimeData->IsGeneral()) {
  470.         if (mimeData->GetGeneral().GetSeq_align_data().IsCdd()) {
  471.             cddUpdates = &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetPending());
  472.             *cddUpdates = newUpdates;
  473.         } else {
  474.             bundleImportsFaked = newUpdates;
  475.             // convert to plain imports to store in mime data (some data loss...)
  476.             bundleImports = &(mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetImports());
  477.             bundleImports->clear();
  478.             UpdateAlignList::iterator u, ue = newUpdates.end();
  479.             for (u=newUpdates.begin(); u!=ue; ++u)
  480.                 if ((*u)->IsSetSeqannot())
  481.                     bundleImports->push_back(CRef < CSeq_annot > (&((*u)->SetSeqannot())));
  482.         }
  483.     } else if (cddData.NotEmpty()) {
  484.         cddUpdates = &(cddData->SetPending());
  485.         *cddUpdates = newUpdates;
  486.     } else if (newUpdates.size() > 0)
  487.         ERRORMSG("ASNDataManager::ReplaceUpdates() - can't put updates in this data type");
  488.     SetDataChanged(StructureSet::eUpdateData);
  489. }
  490. void ASNDataManager::RemoveUnusedSequences(const AlignmentSet *alignmentSet,
  491.     const SequenceList& updateSequences)
  492. {
  493.     if (!alignmentSet) return; // don't do this for single structures
  494.     if (!seqEntryList) {
  495.         ERRORMSG("ASNDataManager::RemoveUnusedSequences() - can't find sequence list");
  496.         return;
  497.     }
  498.     // update the asn sequences, keeping only those used in the multiple alignment and updates
  499.     seqEntryList->clear();
  500.     map < const MoleculeIdentifier *, bool > usedSeqs;
  501.     int nStructuredSlaves = 0;
  502. // macro to add the sequence to the list if not already present
  503. #define CONDITIONAL_ADD_SEQENTRY(seq) do { 
  504.     if (usedSeqs.find((seq)->identifier) == usedSeqs.end()) { 
  505.         seqEntryList->resize(seqEntryList->size() + 1); 
  506.         seqEntryList->back().Reset(new CSeq_entry); 
  507.         seqEntryList->back().GetObject().SetSeq((const_cast<Sequence*>(seq))->bioseqASN.GetObject()); 
  508.         usedSeqs[(seq)->identifier] = true; 
  509.     } } while (0)
  510.     // always add master first
  511.     CONDITIONAL_ADD_SEQENTRY(alignmentSet->master);
  512.     // add from alignmentSet slaves
  513.     AlignmentSet::AlignmentList::const_iterator a, ae = alignmentSet->alignments.end();
  514.     for (a=alignmentSet->alignments.begin(); a!=ae; ++a) {
  515.         CONDITIONAL_ADD_SEQENTRY((*a)->slave);
  516.         if ((*a)->slave->molecule) ++nStructuredSlaves;
  517.     }
  518.     // add from updates
  519.     SequenceList::const_iterator s, se = updateSequences.end();
  520.     for (s=updateSequences.begin(); s!=se; ++s)
  521.         CONDITIONAL_ADD_SEQENTRY((*s));
  522.     SetDataChanged(StructureSet::eSequenceData);
  523.     // warn user if # structured slaves != # structure alignments
  524. //    if (structureAlignments && nStructuredSlaves !=
  525. //            structureAlignments->GetFeatures().front().GetObject().GetFeatures().size())
  526. //        ERRORMSG("Warning: Structure alignment list does not contain one alignment per "
  527. //            "structured sequence!nYou should recompute structure alignments before saving "
  528. //            "in order to sync the lists.");
  529. }
  530. bool ASNDataManager::WriteDataToFile(const char *filename, bool isBinary,
  531.     string *err, ncbi::EFixNonPrint fixNonPrint) const
  532. {
  533.     if (mimeData.NotEmpty())
  534.         return WriteASNToFile(filename, mimeData.GetObject(), isBinary, err, fixNonPrint);
  535.     else
  536.         return WriteASNToFile(filename, cddData.GetObject(), isBinary, err, fixNonPrint);
  537. }
  538. ncbi::objects::CCdd * ASNDataManager::GetInternalCDDData(void)
  539. {
  540.     if (cddData.NotEmpty()) return cddData.GetPointer();
  541.     else if (mimeData.NotEmpty() && mimeData->IsGeneral() &&
  542.              mimeData->GetGeneral().GetSeq_align_data().IsCdd())
  543.         return &(mimeData->SetGeneral().SetSeq_align_data().SetCdd());
  544.     else
  545.         return NULL;
  546. }
  547. const ncbi::objects::CCdd * ASNDataManager::GetInternalCDDData(void) const
  548. {
  549.     if (cddData.NotEmpty()) return cddData.GetPointer();
  550.     else if (mimeData.NotEmpty() && mimeData->IsGeneral() &&
  551.              mimeData->GetGeneral().GetSeq_align_data().IsCdd())
  552.         return &(mimeData->GetGeneral().GetSeq_align_data().GetCdd());
  553.     else
  554.         return NULL;
  555. }
  556. bool ASNDataManager::IsCDD(void) const
  557. {
  558.     return (GetInternalCDDData() != NULL);
  559. }
  560. bool ASNDataManager::IsCDDInMime(void) const
  561. {
  562.     return (GetInternalCDDData() != NULL && mimeData.NotEmpty());
  563. }
  564. const string& ASNDataManager::GetCDDName(void) const
  565. {
  566.     static const string empty = "";
  567.     const CCdd *cdd = GetInternalCDDData();
  568.     if (cdd)
  569.         return cdd->GetName();
  570.     else
  571.         return empty;
  572. }
  573. bool ASNDataManager::SetCDDName(const string& name)
  574. {
  575.     CCdd *cdd = GetInternalCDDData();
  576.     if (!cdd || name.size() == 0) return false;
  577.     cdd->SetName(name);
  578.     SetDataChanged(StructureSet::eCDDData);
  579.     return true;
  580. }
  581. const string& ASNDataManager::GetCDDDescription(void) const
  582. {
  583.     static const string empty = "";
  584.     const CCdd *cdd = GetInternalCDDData();
  585.     if (!cdd) return empty;
  586.     // find first 'comment' in Cdd-descr-set, assume this is the "long description"
  587.     if (!cdd->IsSetDescription() || cdd->GetDescription().Get().size() == 0) return empty;
  588.     CCdd_descr_set::Tdata::const_iterator d, de = cdd->GetDescription().Get().end();
  589.     for (d=cdd->GetDescription().Get().begin(); d!=de; ++d)
  590.         if ((*d)->IsComment())
  591.             return (*d)->GetComment();
  592.     return empty;
  593. }
  594. bool ASNDataManager::SetCDDDescription(const string& descr)
  595. {
  596.     CCdd *cdd = GetInternalCDDData();
  597.     if (!cdd || descr.size() == 0) return false;
  598.     if (cdd->IsSetDescription() && cdd->GetDescription().Get().size() >= 0) {
  599.         // find first 'comment' in Cdd-descr-set, assume this is the "long description"
  600.         CCdd_descr_set::Tdata::iterator d, de = cdd->SetDescription().Set().end();
  601.         for (d=cdd->SetDescription().Set().begin(); d!=de; ++d) {
  602.             if ((*d)->IsComment()) {
  603.                 if ((*d)->GetComment() != descr) {
  604.                     (*d)->SetComment(descr);
  605.                     SetDataChanged(StructureSet::eCDDData);
  606.                 }
  607.                 return true;
  608.             }
  609.         }
  610.     }
  611.     // add new comment if not yet present
  612.     CRef < CCdd_descr > comment(new CCdd_descr);
  613.     comment->SetComment(descr);
  614.     cdd->SetDescription().Set().push_front(comment);
  615.     SetDataChanged(StructureSet::eCDDData);
  616.     return true;
  617. }
  618. bool ASNDataManager::GetCDDNotes(TextLines *lines) const
  619. {
  620.     const CCdd *cdd = GetInternalCDDData();
  621.     if (!lines || !cdd) return false;
  622.     lines->clear();
  623.     if (!cdd->IsSetDescription() || cdd->GetDescription().Get().size() == 0)
  624.         return true;
  625.     // find scrapbook item
  626.     CCdd_descr_set::Tdata::const_iterator d, de = cdd->GetDescription().Get().end();
  627.     for (d=cdd->GetDescription().Get().begin(); d!=de; ++d) {
  628.         if ((*d)->IsScrapbook()) {
  629.             // fill out lines from scrapbook string list
  630.             lines->resize((*d)->GetScrapbook().size());
  631.             CCdd_descr::TScrapbook::const_iterator l, le = (*d)->GetScrapbook().end();
  632.             int i = 0;
  633.             for (l=(*d)->GetScrapbook().begin(); l!=le; ++l)
  634.                 (*lines)[i++] = *l;
  635.             return true;
  636.         }
  637.     }
  638.     return true;
  639. }
  640. bool ASNDataManager::SetCDDNotes(const TextLines& lines)
  641. {
  642.     CCdd *cdd = GetInternalCDDData();
  643.     if (!cdd) return false;
  644.     CCdd_descr::TScrapbook *scrapbook = NULL;
  645.     // find an existing scrapbook item
  646.     if (cdd->IsSetDescription()) {
  647.         CCdd_descr_set::Tdata::iterator d, de = cdd->SetDescription().Set().end();
  648.         for (d=cdd->SetDescription().Set().begin(); d!=de; ++d) {
  649.             if ((*d)->IsScrapbook()) {
  650.                 if (lines.size() == 0) {
  651.                     cdd->SetDescription().Set().erase(d);   // if empty, remove scrapbook item
  652.                     SetDataChanged(StructureSet::eCDDData);
  653.                     TRACEMSG("removed scrapbook");
  654.                 } else
  655.                     scrapbook = &((*d)->SetScrapbook());
  656.                 break;
  657.             }
  658.         }
  659.     }
  660.     if (lines.size() == 0) return true;
  661.     // create a scrapbook item if doesn't exist already
  662.     if (!scrapbook) {
  663.         CRef < CCdd_descr > descr(new CCdd_descr());
  664.         scrapbook = &(descr->SetScrapbook());
  665.         cdd->SetDescription().Set().push_back(descr);
  666.     }
  667.     // fill out scrapbook lines
  668.     scrapbook->clear();
  669.     for (int i=0; i<lines.size(); ++i)
  670.         scrapbook->push_back(lines[i]);
  671.     SetDataChanged(StructureSet::eCDDData);
  672.     return true;
  673. }
  674. ncbi::objects::CCdd_descr_set * ASNDataManager::GetCDDDescrSet(void)
  675. {
  676.     CCdd *cdd = GetInternalCDDData();
  677.     if (cdd) {
  678.         // make a new descr set if not present
  679.         if (!cdd->IsSetDescription()) {
  680.             CRef < CCdd_descr_set > ref(new CCdd_descr_set());
  681.             cdd->SetDescription(*ref);
  682.         }
  683.         return &(cdd->SetDescription());
  684.     } else
  685.         return NULL;
  686. }
  687. ncbi::objects::CAlign_annot_set * ASNDataManager::GetCDDAnnotSet(void)
  688. {
  689.     CCdd *cdd = GetInternalCDDData();
  690.     if (cdd) {
  691.         // make a new annot set if not present
  692.         if (!cdd->IsSetAlignannot()) {
  693. CRef < CAlign_annot_set > ref(new CAlign_annot_set());
  694.             cdd->SetAlignannot(*ref);
  695.         }
  696.         return &(cdd->SetAlignannot());
  697.     } else
  698.         return NULL;
  699. }
  700. const ncbi::objects::CSeq_id * ASNDataManager::GetCDDMaster3d(void) const
  701. {
  702.     const CCdd *cdd = GetInternalCDDData();
  703.     if (cdd && cdd->IsSetMaster3d())
  704.         return cdd->GetMaster3d().front().GetPointer(); // just return the first one...
  705.     else
  706.         return NULL;
  707. }
  708. void ASNDataManager::AddReject(ncbi::objects::CReject_id *reject)
  709. {
  710.     CCdd *cdd = GetInternalCDDData();
  711.     if (!cdd) return;
  712.     cdd->SetRejects().push_back(CRef < CReject_id > (reject));
  713.     dataChanged |= StructureSet::eCDDData;
  714. }
  715. const StructureSet::RejectList * ASNDataManager::GetRejects(void) const
  716. {
  717.     const CCdd *cdd = GetInternalCDDData();
  718.     if (!cdd || !cdd->IsSetRejects())
  719.         return NULL;
  720.     return &(cdd->GetRejects());
  721. }
  722. END_SCOPE(Cn3D)
  723. /*
  724. * ---------------------------------------------------------------------------
  725. * $Log: data_manager.cpp,v $
  726. * Revision 1000.2  2004/06/01 18:28:33  gouriano
  727. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23
  728. *
  729. * Revision 1.23  2004/05/21 21:41:39  gorelenk
  730. * Added PCH ncbi_pch.hpp
  731. *
  732. * Revision 1.22  2004/05/21 17:29:51  thiessen
  733. * allow conversion of mime to cdd data
  734. *
  735. * Revision 1.21  2004/03/15 18:25:36  thiessen
  736. * prefer prefix vs. postfix ++/-- operators
  737. *
  738. * Revision 1.20  2004/02/19 17:04:55  thiessen
  739. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  740. *
  741. * Revision 1.19  2003/08/21 18:02:01  thiessen
  742. * change header order for Mac compilation
  743. *
  744. * Revision 1.18  2003/02/03 19:20:03  thiessen
  745. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  746. *
  747. * Revision 1.17  2003/01/27 15:52:22  thiessen
  748. * merge after highlighted row; show rejects; trim rejects from new reject list
  749. *
  750. * Revision 1.16  2002/11/22 19:48:14  thiessen
  751. * one more fix for const changes in objects API
  752. *
  753. * Revision 1.15  2002/11/19 21:19:44  thiessen
  754. * more const changes for objects; fix user vs default style bug
  755. *
  756. * Revision 1.14  2002/11/18 19:48:40  grichenk
  757. * Removed "const" from datatool-generated setters
  758. *
  759. * Revision 1.13  2002/11/06 00:18:10  thiessen
  760. * fixes for new CRef/const rules in objects
  761. *
  762. * Revision 1.12  2002/10/27 22:23:51  thiessen
  763. * save structure alignments from vastalign.cgi imports
  764. *
  765. * Revision 1.11  2002/07/03 13:39:39  thiessen
  766. * fix for redundant sequence removal
  767. *
  768. * Revision 1.10  2002/06/05 17:50:08  thiessen
  769. * title tweaks
  770. *
  771. * Revision 1.9  2002/03/19 18:47:58  thiessen
  772. * small bug fixes; remember PSSM weight
  773. *
  774. * Revision 1.8  2002/02/27 16:29:41  thiessen
  775. * add model type flag to general mime type
  776. *
  777. * Revision 1.7  2002/02/19 14:59:39  thiessen
  778. * add CDD reject and purge sequence
  779. *
  780. * Revision 1.6  2002/02/12 17:19:21  thiessen
  781. * first working structure import
  782. *
  783. * Revision 1.5  2002/01/19 02:34:40  thiessen
  784. * fixes for changes in asn serialization API
  785. *
  786. * Revision 1.4  2001/12/15 03:15:59  thiessen
  787. * adjustments for slightly changed object loader Set...() API
  788. *
  789. * Revision 1.3  2001/12/06 23:13:45  thiessen
  790. * finish import/align new sequences into single-structure data; many small tweaks
  791. *
  792. * Revision 1.2  2001/11/30 14:02:05  thiessen
  793. * progress on sequence imports to single structures
  794. *
  795. * Revision 1.1  2001/11/27 16:26:08  thiessen
  796. * major update to data management system
  797. *
  798. */