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

📄 structure_set.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    dataManager->SetDataUnchanged();}StructureSet::~StructureSet(void){    delete dataManager;    delete showHideManager;    delete styleManager;    if (alignmentManager) delete alignmentManager;    GlobalMessenger()->RemoveAllHighlights(false);    MoleculeIdentifier::ClearIdentifiers();    BioseqMap::iterator i, ie = bioseqs.end();    for (i=bioseqs.begin(); i!=ie; ++i) BioseqFree(i->second);}BioseqPtr StructureSet::GetOrCreateBioseq(const Sequence *sequence){    if (!sequence || !sequence->isProtein) {        ERRORMSG("StructureSet::GetOrCreateBioseq() - got non-protein or NULL Sequence");        return NULL;    }    // if already done    BioseqMap::const_iterator b = bioseqs.find(sequence);    if (b != bioseqs.end()) return b->second;    // create new Bioseq and fill it in from Sequence data    BioseqPtr bioseq = BioseqNew();    bioseq->mol = Seq_mol_aa;    bioseq->seq_data_type = Seq_code_ncbieaa;    bioseq->repr = Seq_repr_raw;    bioseq->length = sequence->Length();    bioseq->seq_data = BSNew(bioseq->length);    BSWrite(bioseq->seq_data, const_cast<char*>(sequence->sequenceString.c_str()), bioseq->length);    // create Seq-id    sequence->AddCSeqId(&(bioseq->id), true);    // store Bioseq    bioseqs[sequence] = bioseq;    return bioseq;}void StructureSet::CreateAllBioseqs(const BlockMultipleAlignment *multiple){    for (int row=0; row<multiple->NRows(); ++row)        GetOrCreateBioseq(multiple->GetSequenceOfRow(row));}bool StructureSet::AddBiostrucToASN(ncbi::objects::CBiostruc *biostruc){    bool added = dataManager->AddBiostrucToASN(biostruc);    if (added && objects.size() == 1)        InitStructureAlignments(objects.front()->mmdbID);    return added;}static const int NO_DOMAIN = -1, MULTI_DOMAIN = 0;void StructureSet::InitStructureAlignments(int masterMMDBID){    // create or empty the Biostruc-annot-set that will contain these alignments    // in the asn data, erasing any structure alignments currently stored there    CBiostruc_annot_set *structureAlignments = dataManager->GetStructureAlignments();    if (structureAlignments) {        structureAlignments->SetId().clear();        structureAlignments->SetDescr().clear();        structureAlignments->SetFeatures().clear();    } else {        structureAlignments = new CBiostruc_annot_set();        dataManager->SetStructureAlignments(structureAlignments);    }    // set up the skeleton of the new Biostruc-annot-set    // new Mmdb-id    structureAlignments->SetId().resize(1);    structureAlignments->SetId().front().Reset(new CBiostruc_id());    CMmdb_id *mid = new CMmdb_id(masterMMDBID);    structureAlignments->SetId().front().GetObject().SetMmdb_id(*mid);    // new Biostruc-feature-set    CRef<CBiostruc_feature_set> featSet(new CBiostruc_feature_set());    featSet->SetId().Set(NO_DOMAIN);    featSet->SetFeatures();    // just create an empty list    structureAlignments->SetFeatures().resize(1, featSet);    // flag a change in data    SetDataChanged(eStructureAlignmentData);}void StructureSet::AddStructureAlignment(CBiostruc_feature *feature,    int masterDomainID, int slaveDomainID){    CBiostruc_annot_set *structureAlignments = dataManager->GetStructureAlignments();    if (!structureAlignments) {        WARNINGMSG("StructureSet::AddStructureAlignment() - creating new structure alignment list");        InitStructureAlignments(objects.front()->mmdbID);        structureAlignments = dataManager->GetStructureAlignments();    }    // check master domain ID, to see if alignments have crossed master's domain boundaries    int *currentMasterDomainID = &(structureAlignments->SetFeatures().front().GetObject().SetId().Set());    if (*currentMasterDomainID == NO_DOMAIN)        *currentMasterDomainID = masterDomainID;    else if ((*currentMasterDomainID % 100) != (masterDomainID % 100))        *currentMasterDomainID = (*currentMasterDomainID / 100) * 100;    // check to see if this slave domain already has an alignment; if so, increment alignment #    CBiostruc_feature_set::TFeatures::const_iterator        f, fe = structureAlignments->GetFeatures().front().GetObject().GetFeatures().end();    for (f=structureAlignments->GetFeatures().front().GetObject().GetFeatures().begin(); f!=fe; ++f) {        if ((f->GetObject().GetId().Get() / 10) == (slaveDomainID / 10))            ++slaveDomainID;    }    CBiostruc_feature_id id(slaveDomainID);    feature->SetId(id);    CRef<CBiostruc_feature> featureRef(feature);    structureAlignments->SetFeatures().front().GetObject().SetFeatures().resize(        structureAlignments->GetFeatures().front().GetObject().GetFeatures().size() + 1, featureRef);    // flag a change in data    SetDataChanged(eStructureAlignmentData);}void StructureSet::RemoveStructureAlignments(void){    dataManager->SetStructureAlignments(NULL);    // flag a change in data    SetDataChanged(eStructureAlignmentData);}void StructureSet::ReplaceAlignmentSet(AlignmentSet *newAlignmentSet){    ASNDataManager::SeqAnnotList *seqAnnots = dataManager->GetOrCreateSequenceAlignments();    if (!seqAnnots) {        ERRORMSG("StructureSet::ReplaceAlignmentSet() - "            << "can't figure out where in the asn the alignments are to go");        return;    }    // update the AlignmentSet    if (alignmentSet) {        _RemoveChild(alignmentSet);        delete alignmentSet;    }    alignmentSet = newAlignmentSet;    // update the asn alignments    seqAnnots->resize(alignmentSet->newAsnAlignmentData->size());    ASNDataManager::SeqAnnotList::iterator o = seqAnnots->begin();    ASNDataManager::SeqAnnotList::iterator n, ne = alignmentSet->newAsnAlignmentData->end();    for (n=alignmentSet->newAsnAlignmentData->begin(); n!=ne; ++n, ++o)        o->Reset(n->GetPointer());   // copy each Seq-annot CRef    // don't set data PSSM/row order flags here; done by AlignmentManager::SavePairwiseFromMultiple()    SetDataChanged(eAnyAlignmentData);}void StructureSet::ReplaceUpdates(ncbi::objects::CCdd::TPending& newUpdates){    dataManager->ReplaceUpdates(newUpdates);}void StructureSet::RemoveUnusedSequences(void){	ASNDataManager::SequenceList updateSequences;    if (alignmentManager) alignmentManager->GetUpdateSequences(&updateSequences);    dataManager->RemoveUnusedSequences(alignmentSet, updateSequences);}bool StructureSet::SaveASNData(const char *filename, bool doBinary, unsigned int *changeFlags){    // force a save of any edits to alignment and updates first (it's okay if this has already been done)    GlobalMessenger()->SequenceWindowsSave(true);    /*if (dataManager->HasDataChanged())*/ RemoveUnusedSequences();    // create and temporarily attach a style dictionary, and annotation set + camera info    // to the data (and then remove it again, so it's never out of date)    CRef < CCn3d_style_dictionary > styleDictionary(styleManager->CreateASNStyleDictionary());    dataManager->SetStyleDictionary(*styleDictionary);    CRef < CCn3d_user_annotations > userAnnotations(new CCn3d_user_annotations());    if (!styleManager->SaveToASNUserAnnotations(userAnnotations.GetPointer()) ||        (objects.size() >= 1 && !renderer->SaveToASNViewSettings(userAnnotations.GetPointer()))) {        ERRORMSG("StructureSet::SaveASNData() - error creating user annotations blob");        return false;    }    if (userAnnotations->IsSetAnnotations() || userAnnotations->IsSetView())        dataManager->SetUserAnnotations(*userAnnotations);    string err;    bool writeOK = dataManager->WriteDataToFile(filename, doBinary, &err, eFNP_Replace);    // remove style dictionary and annotations from asn    dataManager->RemoveStyleDictionary();    dataManager->RemoveUserAnnotations();    if (writeOK) {        *changeFlags = dataManager->GetDataChanged();        dataManager->SetDataUnchanged();    } else {        ERRORMSG("Write failed: " << err);    }    return writeOK;}// because the frame map (for each frame, a list of diplay lists) is complicated// to create, this just verifies that all display lists occur exactly once// in the map. Also, make sure that total # display lists in all frames adds up.void StructureSet::VerifyFrameMap(void) const{    for (unsigned int l=OpenGLRenderer::FIRST_LIST; l<=lastDisplayList; ++l) {        bool found = false;        for (unsigned int f=0; f<frameMap.size(); ++f) {            DisplayLists::const_iterator d, de=frameMap[f].end();            for (d=frameMap[f].begin(); d!=de; ++d) {                if (*d == l) {                    if (!found)                        found = true;                    else                        ERRORMSG("frameMap: repeated display list " << l);                }            }        }        if (!found)            ERRORMSG("display list " << l << " not in frameMap");    }    unsigned int nLists = 0;    for (unsigned int f=0; f<frameMap.size(); ++f) {        DisplayLists::const_iterator d, de=frameMap[f].end();        for (d=frameMap[f].begin(); d!=de; ++d) ++nLists;    }    if (nLists != lastDisplayList)        ERRORMSG("frameMap has too many display lists");}void StructureSet::SetCenter(const Vector *given){    Vector siteSum;    int nAtoms = 0;    double dist;    maxDistFromCenter = 0.0;    // set new center if given one    if (given) center = *given;    // loop trough all atoms twice - once to get average center, then once to    // find max distance from this center    for (int i=0; i<2; ++i) {        if (given && i==0) continue; // skip center calculation if given one        ObjectList::const_iterator o, oe=objects.end();        for (o=objects.begin(); o!=oe; ++o) {            StructureObject::CoordSetList::const_iterator c, ce=(*o)->coordSets.end();            for (c=(*o)->coordSets.begin(); c!=ce; ++c) {                AtomSet::AtomMap::const_iterator a, ae=(*c)->atomSet->atomMap.end();                for (a=(*c)->atomSet->atomMap.begin(); a!=ae; ++a) {                    Vector site(a->second.front()->site);                    if ((*o)->IsSlave() && (*o)->transformToMaster)                        ApplyTransformation(&site, *((*o)->transformToMaster));                    if (i==0) {                        siteSum += site;                        ++nAtoms;                    } else {                        dist = (site - center).length();                        if (dist > maxDistFromCenter)                            maxDistFromCenter = dist;                    }                }            }        }        if (i==0) {            if (nAtoms == 0) {                center.Set(0.0, 0.0, 0.0);                break;            }            center = siteSum / nAtoms;        }    }    TRACEMSG("center: " << center << ", maxDistFromCenter " << maxDistFromCenter);    rotationCenter = center;}void StructureSet::CenterViewOnAlignedResidues(void){    const BlockMultipleAlignment *alignment = alignmentManager->GetCurrentMultipleAlignment();    if (!alignment || !alignment->GetSequenceOfRow(0) || !alignment->GetSequenceOfRow(0))        return;                     // no alignment    const Molecule *masterMolecule = alignment->GetSequenceOfRow(0)->molecule;    if (!masterMolecule) return;    // no structured master    const StructureObject *masterObject;    if (!masterMolecule->GetParentOfType(&masterObject)) return;    // get coords of all aligned c-alphas    deque < Vector > coords;    Molecule::ResidueMap::const_iterator r, re = masterMolecule->residues.end();    for (r=masterMolecule->residues.begin(); r!=re; ++r) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -