20void Pedigree::ShowTrimHeader(
bool & flag)
24 printf(
"Trimming uninformative individuals...\n");
29void Pedigree::Trim(
bool quiet,
int * informative)
41 bool showHeader =
true;
42 IntArray discardable, offspring, mates, haveData;
44 for (
int f = 0; f < familyCount; f++)
46 Family * fam = families[f];
50 haveData.Dimension(fam->count);
54 for (
int i = fam->first; i <= fam->last; i++)
55 if (informative == NULL)
56 hasData |= haveData[persons[i]->traverse] = persons[i]->haveData();
58 hasData |= haveData[persons[i]->traverse] = informative[i];
64 ShowTrimHeader(showHeader);
65 printf(
" Removing family %s: No data\n", (
const char *) fam->famid);
68 for (
int i = fam->first; i <= fam->last; i++)
75 discardable.Dimension(fam->count);
85 offspring.Dimension(fam->count);
89 mates.Dimension(fam->count);
95 for (
int i = fam->count - 1; i >= fam->founders; i--)
97 if (discardable[i])
continue;
99 Person & p = *(persons[fam->path[i]]);
101 if (discardable[p.father->traverse])
104 if (offspring[i] == 0 && !haveData[p.traverse])
107 discardable[i] =
true;
111 int father = p.father->traverse;
112 int mother = p.mother->traverse;
114 if (mates[father] == -1 && mates[mother] == -1)
116 mates[father] = mother,
117 mates[mother] = father;
119 else if (mates[father] != mother)
121 if (mates[father] >= 0)
122 mates[mates[father]] = -2;
124 if (mates[mother] >= 0)
125 mates[mates[mother]] = -2;
138 for (
int i = fam->count - 1; i >= 0; i--)
140 if (discardable[i])
continue;
142 Person & p = *(persons[fam->path[i]]);
144 if (p.isFounder() || discardable[p.father->traverse])
146 if (mates[i] == -2 ||
148 (mates[i] >= fam->founders &&
149 !discardable[persons[fam->path[mates[i]]]->father->traverse]) ||
150 haveData[p.traverse] ||
151 (mates[i] != -1 && haveData[mates[i]]))
155 discardable[i] =
true;
161 for (
int i = fam->count - 1; i >= 0; i--)
166 ShowTrimHeader(showHeader);
167 printf(
" Removing person %s->%s: No data\n",
168 (
const char *) fam->famid,
169 (
const char *) persons[fam->path[i]]->pid);
171 delete persons[fam->path[i]];
174 newPersons[newCount++] = persons[fam->path[i]];
182 persons = newPersons;