23 bool Pedigree::TwinCheck()
28 for (
int f = 0; f < familyCount; f++)
32 for (
int i = families[f]->first, j; i <= families[f]->last; i++)
34 if (persons[i]->isMzTwin(*persons[i]))
37 for (j = 0; j < mzTwins.Length(); j++)
38 if (persons[i]->isMzTwin(*persons[mzTwins[j]]))
42 if (j == mzTwins.Length())
50 Person * original = persons[mzTwins[j]];
51 Person * twin = persons[i];
53 for (
int m = 0; m < Person::markerCount; m++)
55 if (!original->markers[m].isKnown())
56 original->markers[m] = twin->markers[m];
57 else if (twin->markers[m].isKnown() &&
58 twin->markers[m] != original->markers[m])
59 printf(
"MZ Twins %s and %s in family %s have " 60 "different %s genotypes\n",
61 (
const char *) original->pid,
62 (
const char *) twin->pid,
63 (
const char *) original->famid,
64 (
const char *) Person::markerNames[m]),
67 if (twin->sex != original->sex)
68 printf(
"MZ Twins %s and %s in family %s have " 70 (
const char *) original->pid,
71 (
const char *) twin->pid,
72 (
const char *) original->famid),
77 if (mzTwins.Length() == 0)
continue;
81 for (
int i = families[f]->first, j; i <= families[f]->last; i++)
82 if (persons[i]->isMzTwin(*persons[i]))
84 for (j = 0; j < mzTwins.Length(); j++)
85 if (persons[i]->isMzTwin(*persons[mzTwins[j]]))
88 if (mzTwins[j] == i)
continue;
90 Person * original = persons[mzTwins[j]];
91 Person * twin = persons[i];
93 for (
int m = 0; m < Person::markerCount; m++)
94 twin->markers[m] = original->markers[m];
100 void Pedigree::MergeTwins()
102 if (!haveTwins)
return;
106 printf(
"Merging MZ twins into a single individual...\n");
108 for (
int f = 0; f < familyCount; f++)
112 for (
int i = families[f]->first, j; i <= families[f]->last; i++)
113 if (persons[i]->isMzTwin(*persons[i]))
116 for (j = 0; j < mzTwins.Length(); j++)
117 if (persons[i]->isMzTwin(*persons[mzTwins[j]]))
121 if (j == mzTwins.Length())
128 persons[mzTwins[j]]->pid += ((char)
'$') + persons[i]->pid;
131 for (
int j = 0; j < affectionCount; j++)
132 if (persons[i]->affections[j] == 2)
133 persons[mzTwins[j]]->affections[j] = 2;
139 if (surplus.Length())
142 for (
int i = families[f]->first, j; i < families[f]->last; i++)
143 if (!persons[i]->isFounder())
145 if (persons[i]->father->isMzTwin(*persons[i]->father))
147 for (j = 0; j < mzTwins.Length(); j++)
148 if (persons[i]->father->isMzTwin(*persons[mzTwins[j]]))
150 persons[i]->fatid = persons[mzTwins[j]]->pid;
152 if (persons[i]->mother->isMzTwin(*persons[i]->mother))
154 for (j = 0; j < mzTwins.Length(); j++)
155 if (persons[i]->mother->isMzTwin(*persons[mzTwins[j]]))
157 persons[i]->motid = persons[mzTwins[j]]->pid;
162 while (surplus.Length())
164 int serial = surplus.Pop();
166 delete persons[serial];
168 for (count--; serial < count; serial++)
169 persons[serial] = persons[serial + 1];