void HaploTree::SetupTraversal(IntArray & pointer, IntArray & state) const { pointer.Clear(); pointer.Push(0); state.Dimension(depth); state.Set(-1); }
bool Pedigree::TwinCheck() { bool fail = false; IntArray mzTwins; for (int f = 0; f < familyCount; f++) { mzTwins.Clear(); for (int i = families[f]->first, j; i <= families[f]->last; i++) // Is this person an identical twin? if (persons[i]->isMzTwin( *persons[i] )) { // Have we got another identical sib yet? for ( j = 0; j < mzTwins.Length(); j++) if ( persons[i]->isMzTwin( *persons[mzTwins[j]] ) ) break; // If not, add to list of twins if (j == mzTwins.Length()) { mzTwins.Push(i); continue; } // Check that their genotypes are compatible and // merge new twin's genotypes into original twin... Person * original = persons[mzTwins[j]]; Person * twin = persons[i]; for (int m = 0; m < Person::markerCount; m++) { if (!original->markers[m].isKnown()) original->markers[m] = twin->markers[m]; else if (twin->markers[m].isKnown() && twin->markers[m] != original->markers[m]) printf("MZ Twins %s and %s in family %s have " "different %s genotypes\n", (const char *) original->pid, (const char *) twin->pid, (const char *) original->famid, (const char *) Person::markerNames[m]), fail = true; if (twin->sex != original->sex) printf("MZ Twins %s and %s in family %s have " "different sexes\n", (const char *) original->pid, (const char *) twin->pid, (const char *) original->famid), fail = true; } } if (mzTwins.Length() == 0) continue; // In the second pass we copy merged twin genotypes // from original twin to other twins for (int i = families[f]->first, j; i <= families[f]->last; i++) if (persons[i]->isMzTwin( *persons[i] )) { for ( j = 0; j < mzTwins.Length(); j++) if ( persons[i]->isMzTwin( *persons[mzTwins[j]] ) ) break; if (mzTwins[j] == i) continue; Person * original = persons[mzTwins[j]]; Person * twin = persons[i]; for (int m = 0; m < Person::markerCount; m++) twin->markers[m] = original->markers[m]; } } return fail; }