コード例 #1
0
int Ladder :: MergeThisLadderInto (Ladder* ladder) {

	list <Locus*>::const_iterator locusIterator;
	Locus* nextLocus;
	Locus* prevLocus = NULL;
	double prevMax;
	double nextMin;
	double nextOriginal;
	double prevOriginal;

	for (locusIterator = mLocusList.begin(); locusIterator != mLocusList.end(); locusIterator++) {

		nextLocus = *locusIterator;
		ladder->MergeLocusIntoLadder (nextLocus);
	}

	// To do:  test that search regions do not overlap neighboring loci

	for (locusIterator = mLocusList.begin(); locusIterator != mLocusList.end(); locusIterator++) {

		nextLocus = *locusIterator;
		
		if (prevLocus == NULL) {

			prevLocus = nextLocus;
			continue;
		}

		if (nextLocus->GetChannel () != prevLocus->GetChannel ()) {

			prevLocus = nextLocus;
			continue;
		}

		prevMax = prevLocus->GetMaxSearchILSBP ();
		nextMin = nextLocus->GetMinSearchILSBP ();

		if (prevMax <= nextMin) {

			prevLocus = nextLocus;
			continue;
		}

		nextOriginal = nextLocus->GetOriginalMinSearchILSBP () - 0.55;
		prevOriginal = prevLocus->GetOriginalMaxSearchILSBP () + 0.55;

		if (prevOriginal > nextOriginal)
			prevOriginal = nextOriginal = 0.5 * (prevOriginal + nextOriginal);

		if (prevMax >= nextOriginal)
			prevLocus->SetMaxSearhILSBP (nextOriginal);

		if (nextMin <= prevOriginal)
			nextLocus->SetMinSearhILSBP (prevOriginal);

		prevLocus = nextLocus;
	}

	return 0;
}