bool Alignment::init(const LcbList & lcbList, const VariantList & variantList, const ReferenceList & referenceList, const TrackList & trackList) { totalLength = 0; filterFlags = 0; filterPass = true; filterPassScale = true; filterShow = false; trackReference = 0; destroyRegions(); lcbs.resize(lcbList.getLcbCount()); tracks.resize(trackList.getTrackCount()); for ( int i = 0; i < tracks.size(); i++ ) { tracks[i] = new QVector<Region *>(lcbList.getLcbCount()); } for ( int i = 0; i < lcbList.getLcbCount(); i++ ) { const LcbList::Lcb & lcb = lcbList.getLcb(i); int id = i; lcbs[id].concordance = 1 - lcb.concordance; //lcbs[id].number = atoi(lcb.name().c_str()); QVector<Region *> * regions = new QVector<Region *>(lcb.regions.size()); for ( int j = 0; j < lcb.regions.size(); j++ ) { const LcbList::Region & lcbRegion = lcb.regions.at(j); int track = j; char * snps = 0; Region * region = new Region ( id, lcbRegion.position, lcbRegion.length, lcbRegion.reverse, snps ); (*regions)[track] = region; (*tracks[track])[id] = region; if ( track == 0 ) { totalLength += region->getLength(); } } lcbs[id].regions = regions; } for ( int i = 0; i < tracks.size(); i++ ) { qSort(tracks[i]->begin(), tracks[i]->end(), Region::lessThan); // determine total length // unsigned int length = 0; // for ( int j = 0; j < tracks[i]->size(); j++ ) { length += (*tracks[i])[j]->getLength(); } // assigned scaled // unsigned int position = 0; // for ( int j = 0; j < tracks[i]->size(); j++ ) { (*tracks[i])[j]->setScaled ( (float)position / length, (float)(position + (*tracks[i])[j]->getLength()) / length ); position += (*tracks[i])[j]->getLength(); } } snpMap.clear(); filters.resize(variantList.getFilterCount()); for ( int i = 0; i < variantList.getFilterCount(); i++ ) { const VariantList::Filter & msgFilter = variantList.getFilter(i); Filter & filter = filters[i]; filter.flag = msgFilter.flag; filter.name = QString::fromStdString(msgFilter.name); filter.description = QString::fromStdString(msgFilter.description); } snpCount = 0; char refLast = 0; int posLast; gapsTotal = 0; Gap gap; snpColumns.resize(0); gaps.resize(0); for ( int i = 0; i < variantList.getVariantCount(); i++ ) { const VariantList::Variant & msgSnp = variantList.getVariant(i); long int refOffset = 0; int refIndex = 0; int position = msgSnp.position; char charRef = msgSnp.reference; // TODO: fixed? //char charRef = posLast == position ? '-' : referenceList.getReference(msgSnp.sequence).sequence[msgSnp.position]; while ( msgSnp.sequence > refIndex ) // - 1 OLD ) { refOffset += referenceList.getReference(refIndex).sequence.length(); refIndex++; } position += refOffset; if ( refLast == '-' && ( charRef != '-' || posLast != position ) ) { gap.end = gap.startAbs + gapsTotal; gap.offset = gapsTotal; gaps.push_back(gap); //gapsTotal += gap.end - gap.start + 1; } unsigned int filters = msgSnp.filters; if ( charRef == '-' ) { if ( refLast != '-' || posLast != position ) { gap.start = position + gapsTotal + 1; gap.startAbs = position; } gapsTotal++; } snpCount++; snpColumns.resize(snpColumns.size() + 1); snpMap.insert(snpMap.end(), std::pair<long long int, int>(position + gapsTotal, snpColumns.size() - 1)); SnpColumn & snpColumn = snpColumns[snpColumns.size() - 1]; snpColumn.position = position + gapsTotal; // HACK for vcf; (fixed?) // snpColumn.ref = charRef; snpColumn.filters = filters; for ( unsigned int i = 0; i < msgSnp.alleles.length(); i++ ) { char charQry = msgSnp.alleles.c_str()[i]; if ( charQry != snpColumn.ref ) { Snp snp; snp.track = i; snp.snp = charQry; snpColumn.snps.push_back(snp); } } posLast = position; refLast = charRef; } //totalLength = (*tracks[0])[tracks[0]->size() - 1]->getStart() + (*tracks[0])[tracks[0]->size() - 1]->getLength() + gapsTotal; QString refSeq; for ( int i = 0; i < referenceList.getReferenceCount(); i++ ) { refSeq.append(QString::fromStdString(referenceList.getReference(i).sequence)); } int coreSize = 0; for ( int i = 0; i < lcbs.size(); i++ ) { const Region * regionRef = (*lcbs[i].regions)[0]; int startGapped = getPositionGapped(regionRef->getStart() - 1) + 1; int endGapped = getPositionGapped(regionRef->getStart() + regionRef->getLength()) - 1; lcbs[i].startGapped = startGapped; lcbs[i].lengthGapped = endGapped - startGapped + 1; coreSize += regionRef->getLength(); } core = (float)coreSize / refSeq.length(); qSort(lcbs.begin(), lcbs.end(), lcbLessThan); totalLength = refSeq.length() + gapsTotal; refSeqCount = referenceList.getReferenceCount(); if ( refSeqStarts ) { delete [] refSeqStarts; } refSeqStarts = new long long int[refSeqCount]; long long int total = 0; for ( int i = 0; i < refSeqCount; i++ ) { refSeqStarts[i] = getPositionGapped(total); total += referenceList.getReference(i).sequence.length(); } if ( refSeqGapped ) { delete [] refSeqGapped; } refSeqGapped = new char[totalLength]; int gapId = 0; gapsTotal = 0; for ( int i = 0; i < totalLength; i++ ) { if ( gaps.size() && i == gaps[gapId].start ) { while( i <= gaps[gapId].end ) { refSeqGapped[i] = '-'; i++; } gapsTotal = gaps[gapId].offset; if ( gapId < gaps.size() - 1 ) { gapId++; } } if ( i - gapsTotal < refSeq.length() ) { refSeqGapped[i] = refSeq.at(i - gapsTotal).toLatin1(); // TODO: gap at pos 0? } } if ( trackList.getTrackReference() > 0 ) { setTrackReference(trackList.getTrackReference()); } setFilterScale(); return true; }