validerror_align.cpp
来自「ncbi源码」· C++ 代码 · 共 1,121 行 · 第 1/3 页
CPP
1,121 行
/* * =========================================================================== * PRODUCTION $Log: validerror_align.cpp,v $ * PRODUCTION Revision 1000.1 2004/06/01 19:47:45 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8 * PRODUCTION * =========================================================================== *//* $Id: validerror_align.cpp,v 1000.1 2004/06/01 19:47:45 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. * * =========================================================================== * * Author: Jonathan Kans, Clifford Clausen, Aaron Ucko...... * * File Description: * validation of seq_align * ....... * */#include <ncbi_pch.hpp>#include <corelib/ncbistd.hpp>#include <objects/seqalign/Seq_align.hpp>#include <objects/seqalign/Dense_diag.hpp>#include <objects/seqalign/Dense_seg.hpp>#include <objects/seqalign/Packed_seg.hpp>#include <objects/seqalign/Seq_align_set.hpp>#include <objects/seqalign/Std_seg.hpp>#include <objmgr/util/sequence.hpp>#include <map>#include <vector>#include <algorithm>#include "validatorp.hpp"BEGIN_NCBI_SCOPEBEGIN_SCOPE(objects)BEGIN_SCOPE(validator)USING_SCOPE(sequence);// ================================ Public ================================CValidError_align::CValidError_align(CValidError_imp& imp) : CValidError_base(imp){}CValidError_align::~CValidError_align(void){}void CValidError_align::ValidateSeqAlign(const CSeq_align& align){ const CSeq_align::TSegs& segs = align.GetSegs(); CSeq_align::C_Segs::E_Choice segtype = segs.Which(); switch ( segtype ) { case CSeq_align::C_Segs::e_Dendiag: x_ValidateDendiag(segs.GetDendiag(), align); break; case CSeq_align::C_Segs::e_Denseg: x_ValidateDenseg(segs.GetDenseg(), align); break; case CSeq_align::C_Segs::e_Std: x_ValidateStd(segs.GetStd(), align); break; case CSeq_align::C_Segs::e_Packed: x_ValidatePacked(segs.GetPacked(), align); break; case CSeq_align::C_Segs::e_Disc: // call recursively ITERATE(CSeq_align_set::Tdata, sali, segs.GetDisc().Get()) { ValidateSeqAlign(**sali); } return; case CSeq_align::C_Segs::e_not_set: default: PostErr(eDiag_Error, eErr_SEQ_ALIGN_Segtype, "This alignment has undefined or unsupported Seq_align" "segtype " + NStr::IntToString(segtype) + ".", align); break; } // end of switch statement}// ================================ Private ===============================void CValidError_align::x_ValidateDenseg(const TDenseg& denseg, const CSeq_align& align){ bool cont = true; // assert dim >= 2 if ( !x_ValidateDim(denseg, align) ) { return; } size_t dim = denseg.GetDim(); size_t numseg = denseg.GetNumseg(); // assert dim == Ids.size() if ( dim != denseg.GetIds().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsDimMismatch, "Mismatch between specified dimension (" + NStr::UIntToString(dim) + ") and number of Seq-ids (" + NStr::UIntToString(denseg.GetIds().size()) + ")", align); cont = false; } // assert numseg == Lens.size() if ( numseg != denseg.GetLens().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsNumsegMismatch, "Mismatch between specified numseg (" + NStr::UIntToString(numseg) + ") and number of Lens (" + NStr::UIntToString(denseg.GetLens().size()) + ")", align); cont = false; } // assert dim * numseg == Starts.size() if ( dim * numseg != denseg.GetStarts().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsStartsMismatch, "The number of Starts (" + NStr::UIntToString(denseg.GetStarts().size()) + ") does not match the expected size of dim * numseg (" + NStr::UIntToString(dim * numseg) + ")", align); cont = false; } if( cont ) { x_ValidateStrand(denseg, align); x_ValidateFastaLike(denseg, align); x_ValidateSegmentGap(denseg, align); if ( m_Imp.IsRemoteFetch() ) { x_ValidateSeqId(align); x_ValidateSeqLength(denseg, align); } }}void CValidError_align::x_ValidatePacked(const TPacked& packed, const CSeq_align& align){ bool cont = true; // assert dim >= 2 if ( !x_ValidateDim(packed, align) ) { return; } size_t dim = packed.GetDim(); size_t numseg = packed.GetNumseg(); // assert dim == Ids.size() if ( dim != packed.GetIds().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsDimMismatch, "Mismatch between specified dimension (" + NStr::UIntToString(dim) + ") and number of Seq-ids (" + NStr::UIntToString(packed.GetIds().size()) + ")", align); cont = false; } // assert numseg == Lens.size() if ( numseg != packed.GetLens().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsDimMismatch, "Mismatch between specified numseg (" + NStr::UIntToString(numseg) + ") and number of Lens (" + NStr::UIntToString(packed.GetLens().size()) + ")", align); cont = false; } // assert dim * numseg == Present.size() if ( dim * numseg != packed.GetPresent().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsPresentMismatch, "The number of Present (" + NStr::UIntToString(packed.GetPresent().size()) + ") does not match the expected size of dim * numseg (" + NStr::UIntToString(dim * numseg) + ")", align); cont = false; } else { // assert # of '1' bits in present == Starts.size() size_t bits = x_CountBits(packed.GetPresent()); if ( bits != packed.GetStarts().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsPresentStartsMismatch, "Starts does not have the same number of elements (" + NStr::UIntToString(packed.GetStarts().size()) + ") as specified by Present (" + NStr::UIntToString(bits) + ")", align); cont = false; } // assert # of '1' bits in present == Strands.size() (if exists) if ( packed.IsSetStrands() ) { if ( bits != packed.GetStarts().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsPresentStrandsMismatch, "Strands does not have the same number of elements (" + NStr::UIntToString(packed.GetStrands().size()) + ") as specified by Present (" + NStr::UIntToString(bits) + ")", align); cont = false; } } } if( cont ) { x_ValidateStrand(packed, align); x_ValidateFastaLike(packed, align); x_ValidateSegmentGap(packed, align); if ( m_Imp.IsRemoteFetch() ) { x_ValidateSeqId(align); x_ValidateSeqLength(packed, align); } }}size_t CValidError_align::x_CountBits(const CPacked_seg::TPresent& present){ size_t bits = 0; ITERATE( CPacked_seg::TPresent, iter, present ) { if ( *iter != 0 ) { Uchar mask = 0x01; for ( size_t i = 0; i < 7; ++i ) { bits += (*iter & mask) ? 1 : 0; mask = mask << 1; } } } return bits;}void CValidError_align::x_ValidateDendiag(const TDendiag& dendiags, const CSeq_align& align){ size_t num_dendiag = 0; ITERATE( TDendiag, dendiag_iter, dendiags ) { bool cont = true; ++num_dendiag; const CDense_diag& dendiag = **dendiag_iter; size_t dim = dendiag.GetDim(); // assert dim >= 2 if ( !x_ValidateDim(dendiag, align, num_dendiag) ) { continue; } // assert dim == Ids.size() if ( dim != dendiag.GetIds().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsDimMismatch, "Mismatch between specified dimension (" + NStr::UIntToString(dim) + ") and number of Seq-ids (" + NStr::UIntToString(dendiag.GetIds().size()) + ") in dendiag " + NStr::UIntToString(num_dendiag), align); cont = false; } // assert dim == Starts.size() if ( dim != dendiag.GetStarts().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsDimMismatch, "Mismatch between specified dimension (" + NStr::UIntToString(dim) + ") and number ofStarts (" + NStr::UIntToString(dendiag.GetStarts().size()) + ") in dendiag " + NStr::UIntToString(num_dendiag), align); cont = false; } // assert dim == Strands.size() (if exist) if ( dendiag.IsSetStrands() ) { if ( dim != dendiag.GetStrands().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsDimMismatch, "Mismatch between specified dimension (" + NStr::UIntToString(dim) + ") and number of Strands (" + NStr::UIntToString(dendiag.GetStrands().size()) + ") in dendiag " + NStr::UIntToString(num_dendiag), align); cont = false; } } if ( cont ) { if ( m_Imp.IsRemoteFetch() ) { x_ValidateSeqId(align); x_ValidateSeqLength(dendiag, num_dendiag, align); } } }}void CValidError_align::x_ValidateStd(const TStd& std_segs, const CSeq_align& align){ bool cont = true; size_t num_stdseg = 0; ITERATE( TStd, stdseg_iter, std_segs) { ++num_stdseg; const CStd_seg& stdseg = **stdseg_iter; size_t dim = stdseg.GetDim(); // assert dim >= 2 if ( !x_ValidateDim(stdseg, align, num_stdseg) ) { cont = false; continue; } // assert dim == Loc.size() if ( dim != stdseg.GetLoc().size() ) { PostErr(eDiag_Error, eErr_SEQ_ALIGN_SegsDimMismatch, "Mismatch between specified dimension (" + NStr::UIntToString(dim) + ") and number of Seq-locs (" + NStr::UIntToString(stdseg.GetLoc().size()) + ") in stdseg " + NStr::UIntToString(num_stdseg), align); cont = false; continue; } // assert dim == Ids.size()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?