59 SeqAnnotList::const_iterator
n,
ne = seqAnnots.end();
60 for (
n=seqAnnots.begin();
n!=
ne; ++
n) {
62 if (!
n->GetObject().GetData().IsAlign())
63 THROW_MESSAGE(
"AlignmentSet::AlignmentSet() - confused by Seq-annot data format");
64 if (
n != seqAnnots.begin())
67 CSeq_annot::C_Data::TAlign::const_iterator
68 a, ae =
n->GetObject().GetData().GetAlign().end();
69 for (
a=
n->GetObject().GetData().GetAlign().begin();
a!=ae; ++
a) {
73 !
a->GetObject().IsSetDim() ||
a->GetObject().GetDim() != 2 ||
74 (!
a->GetObject().GetSegs().IsDendiag() && !
a->GetObject().GetSegs().IsDenseg()))
75 THROW_MESSAGE(
"AlignmentSet::AlignmentSet() - confused by alignment type");
77 seqAligns.push_back(*
a);
80 if (seqAligns.size() == 0)
81 THROW_MESSAGE(
"AlignmentSet::AlignmentSet() - must have at least one Seq-align");
87 bool seq1PresentInAll =
true, seq2PresentInAll =
true;
90 const CSeq_id& frontSid = seqAligns.front()->GetSegs().IsDendiag() ?
91 seqAligns.front()->GetSegs().GetDendiag().front()->GetIds().front().GetObject() :
92 seqAligns.front()->GetSegs().GetDenseg().GetIds().front().GetObject();
93 const CSeq_id& backSid = seqAligns.front()->GetSegs().IsDendiag() ?
94 seqAligns.front()->GetSegs().GetDendiag().front()->GetIds().back().GetObject() :
95 seqAligns.front()->GetSegs().GetDenseg().GetIds().back().GetObject();
96 SequenceSet::SequenceList::const_iterator s, se = sequenceSet.m_sequences.end();
97 for (s=sequenceSet.m_sequences.begin(); s!=se; ++s) {
98 if ((*s)->MatchesSeqId(frontSid)) seq1 = *s;
99 if ((*s)->MatchesSeqId(backSid)) seq2 = *s;
100 if (seq1 && seq2)
break;
103 THROW_MESSAGE(
"AlignmentSet::AlignmentSet() - can't match first pair of Seq-ids to Sequences");
106 SeqAlignList::const_iterator
a = seqAligns.begin(), ae = seqAligns.end();
107 for (++
a;
a!=ae; ++
a) {
108 const CSeq_id& frontSid2 = (*a)->GetSegs().IsDendiag() ?
109 (*a)->GetSegs().GetDendiag().front()->GetIds().front().GetObject() :
110 (*a)->GetSegs().GetDenseg().GetIds().front().GetObject();
111 const CSeq_id& backSid2 = (*a)->GetSegs().IsDendiag() ?
112 (*a)->GetSegs().GetDendiag().front()->GetIds().back().GetObject() :
113 (*a)->GetSegs().GetDenseg().GetIds().back().GetObject();
115 seq1PresentInAll =
false;
116 if (!seq2->MatchesSeqId(frontSid2) && !seq2->MatchesSeqId(backSid2))
117 seq2PresentInAll =
false;
119 if (!seq1PresentInAll && !seq2PresentInAll)
121 "all pairwise sequence alignments must have a common master sequence");
122 else if (seq1PresentInAll && !seq2PresentInAll)
124 else if (seq2PresentInAll && !seq1PresentInAll)
126 else if (seq1PresentInAll && seq2PresentInAll && seq1 == seq2)
131 WARNING_MESSAGE(
"alignment master sequence is ambiguous - using the first one ("
135 TRACE_MESSAGE(
"determined master sequence: " << m_master->IdentifierString());
138 SeqAlignList::const_iterator l,
le = seqAligns.end();
139 for (l=seqAligns.begin(); l!=
le; ++l)
140 m_alignments.push_back(
143 TRACE_MESSAGE(
"number of alignments: " << m_alignments.size());
148 const SequenceSet& sequenceSet,
const vector < unsigned int > *rowOrder)
155 for (
unsigned int i=0;
i<rowOrder->size(); ++
i)
156 rowCheck[(*rowOrder)[
i]] =
i;
157 if (rowOrder->size() != multiple->
NRows() || rowCheck.
size() != multiple->
NRows() || (*rowOrder)[0] != 0) {
158 ERROR_MESSAGE(
"AlignmentSet::CreateFromMultiple() - bad row order vector");
166 newSeqAnnots.push_back(seqAnnot);
169 seqAligns.resize((multiple->
NRows() == 1) ? 1 : multiple->
NRows() - 1);
170 CSeq_annot::C_Data::TAlign::iterator sa = seqAligns.begin();
177 if (multiple->
NRows() > 1) {
178 for (
unsigned int row=1; row<multiple->
NRows(); ++row, ++sa) {
180 (rowOrder ? (*rowOrder)[row] : row)));
185 unique_ptr<AlignmentSet> newAlignmentSet;
187 newAlignmentSet.reset(
new AlignmentSet(newSeqAnnots, sequenceSet));
190 "AlignmentSet::CreateFromMultiple() - failed to create AlignmentSet from new asn object: "
196 return newAlignmentSet.release();
204 m_master(masterSequence), m_slave(
NULL)
211 const CSeq_id& frontSeqId = seqAlign.GetSegs().IsDendiag() ?
212 seqAlign.GetSegs().GetDendiag().front()->GetIds().front().GetObject() :
213 seqAlign.GetSegs().GetDenseg().GetIds().front().GetObject();
214 const CSeq_id& backSeqId = seqAlign.GetSegs().IsDendiag() ?
215 seqAlign.GetSegs().GetDendiag().front()->GetIds().back().GetObject() :
216 seqAlign.GetSegs().GetDenseg().GetIds().back().GetObject();
218 bool masterFirst =
true;
219 SequenceSet::SequenceList::const_iterator s, se = sequenceSet.
m_sequences.end();
220 for (s=sequenceSet.
m_sequences.begin(); s!=se; ++s) {
222 (*s)->MatchesSeqId(backSeqId)) {
224 }
else if ((*s)->MatchesSeqId(frontSeqId) &&
231 ERROR_MESSAGE(
"MasterSlaveAlignment::MasterSlaveAlignment() - couldn't find matching sequences; "
233 << backSeqId.
AsFastaString() <<
" must be in the sequence list for this file!");
239 int masterRes, slaveRes, blockNum = 0;
243 if (seqAlign.GetSegs().IsDendiag()) {
245 CSeq_align::C_Segs::TDendiag::const_iterator d , de = seqAlign.GetSegs().GetDendiag().end();
246 for (d=seqAlign.GetSegs().GetDendiag().begin(); d!=de; ++d, ++blockNum) {
250 THROW_MESSAGE(
"MasterSlaveAlignment::MasterSlaveAlignment() - incorrect dendiag block dimensions");
259 THROW_MESSAGE(
"MasterSlaveAlignment::MasterSlaveAlignment() - mismatched Seq-id in dendiag block");
271 THROW_MESSAGE(
"MasterSlaveAlignment::MasterSlaveAlignment() - seqloc in dendiag block > length of sequence!");
279 else if (seqAlign.GetSegs().IsDenseg()) {
281 const CDense_seg& block = seqAlign.GetSegs().GetDenseg();
284 block.
GetIds().size() != 2 ||
287 THROW_MESSAGE(
"MasterSlaveAlignment::MasterSlaveAlignment() - incorrect denseg block dimension");
296 THROW_MESSAGE(
"MasterSlaveAlignment::MasterSlaveAlignment() - mismatched Seq-id in denseg block");
299 CDense_seg::TStarts::const_iterator starts = block.
GetStarts().begin();
300 CDense_seg::TLens::const_iterator lens,
le = block.
GetLens().end();
301 for (lens=block.
GetLens().begin(); lens!=
le; ++lens) {
303 masterRes = *(starts++);
304 slaveRes = *(starts++);
306 slaveRes = *(starts++);
307 masterRes = *(starts++);
309 if (masterRes != -1 && slaveRes != -1) {
312 THROW_MESSAGE(
"MasterSlaveAlignment::MasterSlaveAlignment() - "
313 "seqloc in denseg block > length of sequence!");
314 for (
i=0;
i<*lens; ++
i) {
User-defined methods of the data storage class.
list< const CSeq_align * > SeqAlignList
#define WARNING_MESSAGE(s)
AlignmentSet(SequenceSet *seqSet, const SeqAnnotList &seqAnnots, bool ignoreBadPairwiseAlignments=false)
SeqAnnotList * newAsnAlignmentData
std::list< ncbi::CRef< ncbi::objects::CSeq_annot > > SeqAnnotList
static AlignmentSet * CreateFromMultiple(const BlockMultipleAlignment *multiple, SeqAnnotList *newAsnAlignmentData, const SequenceSet &sequenceSet, const std::vector< unsigned int > *rowOrder=NULL)
std::vector< const UngappedAlignedBlock * > UngappedAlignedBlockList
void GetUngappedAlignedBlocks(UngappedAlignedBlockList *blocks) const
unsigned int NRows(void) const
ResidueVector m_blockStructure
MasterSlaveAlignment(const SequenceSet *sequenceSet, const Sequence *masterSequence, const objects::CSeq_align &seqAlign)
const Sequence * m_master
ResidueVector m_masterToSlave
unsigned int Length(void) const
bool MatchesSeqId(const ncbi::objects::CSeq_id &seqID) const
std::string IdentifierString(void) const
const string & GetMsg(void) const
Get message string.
const string AsFastaString(void) const
#define END_SCOPE(ns)
End the previously defined scope.
#define BEGIN_SCOPE(ns)
Define a new scope.
bool IsSetDim(void) const
dimensionality Check if a value has been assigned to Dim data member.
const TStarts & GetStarts(void) const
Get the Starts member data.
const TLens & GetLens(void) const
Get the Lens member data.
TLen GetLen(void) const
Get the Len member data.
TDim GetDim(void) const
Get the Dim member data.
const TIds & GetIds(void) const
Get the Ids member data.
TDim GetDim(void) const
Get the Dim member data.
const TIds & GetIds(void) const
Get the Ids member data.
const TStarts & GetStarts(void) const
Get the Starts member data.
TNumseg GetNumseg(void) const
Get the Numseg member data.
@ eType_partial
mapping pieces together
@ eType_diags
unbroken, but not ordered, diagonals
void SetData(TData &value)
Assign a value to Data data member.
list< CRef< CSeq_align > > TAlign
The NCBI C++/STL use hints.
bool le(T x_, T y_, T round_)
bool ne(T x_, T y_, T round_)
static DP_BlockInfo * blocks
ncbi::objects::CSeq_align * CreatePairwiseSeqAlignFromMultipleRow(const BlockMultipleAlignment *multiple, const BlockMultipleAlignment::UngappedAlignedBlockList &blocks, unsigned int slaveRow)
#define THROW_MESSAGE(str)