⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data_manager.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* * =========================================================================== * 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 + -