Example #1
0
void HaploTree::SetupTraversal(IntArray & pointer, IntArray & state) const
   {
   pointer.Clear();
   pointer.Push(0);

   state.Dimension(depth);
   state.Set(-1);
   }
Example #2
0
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;
   }