📄 data_manager.cpp
字号:
/* * =========================================================================== * PRODUCTION $Log: data_manager.cpp,v $ * PRODUCTION Revision 1000.2 2004/06/01 18:28:33 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23 * PRODUCTION * =========================================================================== *//* $Id: data_manager.cpp,v 1000.2 2004/06/01 18:28:33 gouriano Exp $* ===========================================================================** PUBLIC DOMAIN NOTICE* National Center for Biotechnology Information** This software/database is a "United States Government Work" under the* terms of the United States Copyright Act. It was written as part of* the author's official duties as a United States Government employee and* thus cannot be copyrighted. This software/database is freely available* to the public for use. The National Library of Medicine and the U.S.* Government have not placed any restriction on its use or reproduction.** Although all reasonable efforts have been taken to ensure the accuracy* and reliability of the software and data, the NLM and the U.S.* Government do not and cannot warrant the performance or results that* may be obtained by using this software or data. The NLM and the U.S.* Government disclaim all warranties, express or implied, including* warranties of performance, merchantability or fitness for any particular* purpose.** Please cite the author in any work or product based on this material.** ===========================================================================** Authors: Paul Thiessen** File Description:* class to manage different root ASN data types** ===========================================================================*/#ifdef _MSC_VER#pragma warning(disable:4018) // disable signed/unsigned mismatch warning in MSVC#endif#include <ncbi_pch.hpp>#include <corelib/ncbistd.hpp>#include <objects/ncbimime/Entrez_general.hpp>#include <objects/ncbimime/Biostruc_align.hpp>#include <objects/ncbimime/Biostruc_align_seq.hpp>#include <objects/ncbimime/Biostruc_seq.hpp>#include <objects/ncbimime/Biostruc_seqs.hpp>#include <objects/ncbimime/Biostruc_seqs_aligns_cdd.hpp>#include <objects/ncbimime/Bundle_seqs_aligns.hpp>#include <objects/seqset/Bioseq_set.hpp>#include <objects/mmdb3/Biostruc_feature_set.hpp>#include <objects/cdd/Cdd_descr_set.hpp>#include <objects/cdd/Cdd_descr.hpp>#include <objects/cdd/Cdd_id.hpp>#include <objects/cdd/Global_id.hpp>#include <objects/cdd/Cdd_id_set.hpp>#include "asn_reader.hpp"#include "data_manager.hpp"#include "structure_set.hpp"#include "sequence_set.hpp"#include "alignment_set.hpp"#include "cn3d_tools.hpp"#include "asn_converter.hpp"USING_NCBI_SCOPE;USING_SCOPE(objects);BEGIN_SCOPE(Cn3D)ASNDataManager::ASNDataManager(ncbi::objects::CNcbi_mime_asn1 *mime){ mimeData.Reset(mime); Load();}ASNDataManager::ASNDataManager(ncbi::objects::CCdd *cdd){ cddData.Reset(cdd); Load();}ASNDataManager::~ASNDataManager(void){}void ASNDataManager::Load(void){ // initialization seqEntryList = NULL; masterBiostruc = NULL; biostrucList = NULL; biostrucModelType = eModel_type_ncbi_all_atom; // default, for CDD's sequenceAlignments = NULL; structureAlignments = NULL; bundleImports = NULL; cddUpdates = NULL; dataChanged = 0; // mime if (mimeData.NotEmpty()) { if (mimeData->IsEntrez()) { if (mimeData->GetEntrez().GetData().IsStructure()) masterBiostruc = &(mimeData->SetEntrez().SetData().SetStructure()); } else if (mimeData->IsAlignstruc()) { seqEntryList = &(mimeData->SetAlignstruc().SetSequences()); masterBiostruc = &(mimeData->SetAlignstruc().SetMaster()); biostrucList = &(mimeData->SetAlignstruc().SetSlaves()); structureAlignments = &(mimeData->SetAlignstruc().SetAlignments()); sequenceAlignments = &(mimeData->SetAlignstruc().SetSeqalign()); } else if (mimeData->IsAlignseq()) { seqEntryList = &(mimeData->SetAlignseq().SetSequences()); sequenceAlignments = &(mimeData->SetAlignseq().SetSeqalign()); } else if (mimeData->IsStrucseq()) { seqEntryList = &(mimeData->SetStrucseq().SetSequences()); masterBiostruc = &(mimeData->SetStrucseq().SetStructure()); } else if (mimeData->IsStrucseqs()) { seqEntryList = &(mimeData->SetStrucseqs().SetSequences()); masterBiostruc = &(mimeData->SetStrucseqs().SetStructure()); sequenceAlignments = &(mimeData->SetStrucseqs().SetSeqalign()); } else if (mimeData->IsGeneral()) { if (mimeData->GetGeneral().IsSetStructures()) biostrucList = &(mimeData->SetGeneral().SetStructures()); if (mimeData->GetGeneral().IsSetStructure_type()) // assume structure-type values match MMDB's Model-type biostrucModelType = (EModel_type) mimeData->GetGeneral().GetStructure_type(); if (mimeData->GetGeneral().GetSeq_align_data().IsBundle()) { if (mimeData->GetGeneral().GetSeq_align_data().GetBundle().IsSetSequences()) seqEntryList = &(mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetSequences()); if (mimeData->GetGeneral().GetSeq_align_data().GetBundle().IsSetStrucaligns()) structureAlignments = &(mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetStrucaligns()); if (mimeData->GetGeneral().GetSeq_align_data().GetBundle().IsSetSeqaligns()) sequenceAlignments = &(mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetSeqaligns()); if (mimeData->GetGeneral().GetSeq_align_data().GetBundle().IsSetImports()) { bundleImports = &(mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetImports()); // make "fake" Update-aligns from imports (to pass to alignment manager) SeqAnnotList::iterator i, ie = mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetImports().end(); for (i=mimeData->SetGeneral().SetSeq_align_data().SetBundle().SetImports().begin(); i!= ie; ++i) { CRef < CUpdate_align > update(new CUpdate_align()); update->SetSeqannot(**i); update->SetType(CUpdate_align::eType_other); bundleImportsFaked.push_back(update); } } } else { // cdd if (mimeData->GetGeneral().GetSeq_align_data().GetCdd().IsSetSequences()) { if (mimeData->GetGeneral().GetSeq_align_data().GetCdd().GetSequences().IsSeq()) { // convert Seq-entry type from seq to set CRef < CSeq_entry > seqEntry( &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetSequences())); mimeData->SetGeneral().SetSeq_align_data().SetCdd().ResetSequences(); mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetSequences(). SetSet().SetSeq_set().push_back(seqEntry); } seqEntryList = &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetSequences().SetSet().SetSeq_set()); } if (mimeData->GetGeneral().GetSeq_align_data().GetCdd().IsSetFeatures()) structureAlignments = &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetFeatures()); if (mimeData->GetGeneral().GetSeq_align_data().GetCdd().IsSetSeqannot()) sequenceAlignments = &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetSeqannot()); if (mimeData->GetGeneral().GetSeq_align_data().GetCdd().IsSetPending()) cddUpdates = &(mimeData->SetGeneral().SetSeq_align_data().SetCdd().SetPending()); } } else ERRORMSG("Unrecognized mime type!"); } // CDD else { if (cddData->IsSetSequences()) { if (cddData->GetSequences().IsSeq()) { // convert Seq-entry type from seq to set CRef < CSeq_entry > seqEntry(&(cddData->SetSequences())); cddData->ResetSequences(); cddData->SetSequences().SetSet().SetSeq_set().push_back(seqEntry); } seqEntryList = &(cddData->SetSequences().SetSet().SetSeq_set()); } if (cddData->IsSetFeatures()) structureAlignments = &(cddData->SetFeatures()); if (cddData->IsSetSeqannot()) sequenceAlignments = &(cddData->SetSeqannot()); if (cddData->IsSetPending()) cddUpdates = &(cddData->SetPending()); } // sequence list is interpreted differently for single structure isSingleStructure = (mimeData.NotEmpty() && (mimeData->IsStrucseq() || (mimeData->IsGeneral() && !sequenceAlignments && !structureAlignments && biostrucList && biostrucList->size() == 1))); TRACEMSG("is single structure: " << (isSingleStructure ? "yes" : "no")); // pre-screen sequence alignments to make sure they're all a type we can deal with if (sequenceAlignments) { list < CRef < CSeq_align > > validAlignments; SeqAnnotList::const_iterator n, ne = sequenceAlignments->end(); for (n=sequenceAlignments->begin(); n!=ne; ++n) { if (!n->GetObject().GetData().IsAlign()) { ERRORMSG("Warning - confused by seqannot data format"); continue; } if (n != sequenceAlignments->begin()) TRACEMSG("multiple Seq-annots"); CSeq_annot::C_Data::TAlign::const_iterator a, ae = n->GetObject().GetData().GetAlign().end(); for (a=n->GetObject().GetData().GetAlign().begin(); a!=ae; ++a) { // verify this is a type of alignment we can deal with if (!(a->GetObject().GetType() != CSeq_align::eType_partial || a->GetObject().GetType() != CSeq_align::eType_diags) || !a->GetObject().IsSetDim() || a->GetObject().GetDim() != 2 || (!a->GetObject().GetSegs().IsDendiag() && !a->GetObject().GetSegs().IsDenseg())) { ERRORMSG("Warning - confused by alignment type"); continue; } validAlignments.push_back(*a); } } sequenceAlignments->clear(); if (validAlignments.size() == 0) { ERRORMSG("Warning - no valid Seq-aligns present"); sequenceAlignments = NULL; } else { sequenceAlignments->push_back(CRef < CSeq_annot > (new CSeq_annot())); // copy list of valid alignments only sequenceAlignments->front()->SetData().SetAlign() = validAlignments; } }}bool ASNDataManager::ConvertMimeDataToCDD(const std::string& cddName){ // if we have CDD data already, this is really easy if (IsCDDInMime()) { cddData.Reset(GetInternalCDDData()); } else if (IsCDD()){ return true; // nothing to do } // otherwise, splice together from mime data else { CRef < CCdd > cdd(new CCdd()); cdd->SetName(cddName); // make up a local id static int localID = 1; CRef < CCdd_id > id(new CCdd_id()); cdd->SetId().Set().push_back(id); CNcbiOstrstream oss; oss << "loc" << localID++ << '\0'; auto_ptr<char> accession(oss.str()); id->SetGid().SetAccession(accession.get()); // fill in data if (!seqEntryList) { ERRORMSG("can't find sequences to put into new Cdd"); return false; } cdd->SetSequences().SetSet().SetSeq_set() = *seqEntryList; if (!sequenceAlignments) { ERRORMSG("can't find sequence alignments to put into new Cdd"); return false; } cdd->SetSeqannot() = *sequenceAlignments; if (structureAlignments)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -