libStatGen Software  1
PedigreePerson.h
00001 /*
00002  *  Copyright (C) 2010  Regents of the University of Michigan
00003  *
00004  *   This program is free software: you can redistribute it and/or modify
00005  *   it under the terms of the GNU General Public License as published by
00006  *   the Free Software Foundation, either version 3 of the License, or
00007  *   (at your option) any later version.
00008  *
00009  *   This program is distributed in the hope that it will be useful,
00010  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *   GNU General Public License for more details.
00013  *
00014  *   You should have received a copy of the GNU General Public License
00015  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
00016  */
00017 
00018 #ifndef __PEDPERSON_H__
00019 #define __PEDPERSON_H__
00020 
00021 #include "Constant.h"
00022 #include "PedigreeAlleles.h"
00023 #include "PedigreeGlobals.h"
00024 #include "StringArray.h"
00025 #include "IntArray.h"
00026 
00027 #define  SEX_MALE       1
00028 #define  SEX_FEMALE     2
00029 #define  SEX_UNKNOWN    0
00030 
00031 class Person : public PedigreeGlobals
00032 {
00033 public:
00034     String      famid;
00035     String      pid;
00036     String      motid;
00037     String      fatid;
00038     int         sex;
00039     int         zygosity;
00040     int         serial, traverse;
00041 
00042     Alleles *   markers;
00043     double *    traits;
00044     char *      affections;
00045     double *    covariates;
00046     String *    strings;
00047 
00048     Person *    father;
00049     Person *    mother;
00050 
00051     int         sibCount;
00052     Person **   sibs;
00053 
00054     int         ngeno;
00055 
00056     bool        filter;
00057 
00058     Person();
00059     ~Person();
00060 
00061     bool isHalfSib(Person & sib)
00062     {
00063         return hasBothParents &&
00064                ((sib.father == father) ^(sib.mother == mother));
00065     }
00066 
00067     bool isSib(Person & sib)
00068     {
00069         return hasBothParents &&
00070                (sib.father == father) && (sib.mother == mother);
00071     }
00072 
00073     bool isTwin(Person & twin)
00074     {
00075         return (zygosity != 0) && (zygosity == twin.zygosity) && isSib(twin);
00076     }
00077 
00078     bool isMzTwin(Person & mzTwin)
00079     {
00080         return (zygosity & 1) && (zygosity == mzTwin.zygosity) && isSib(mzTwin);
00081     }
00082 
00083     // Check that both parents or none are available
00084     // Verify that fathers are male and mothers are female
00085     bool CheckParents();
00086 
00087     // Assess status before using quick diagnostics functions
00088     void AssessStatus();
00089 
00090     // Quick diagnostics
00091     bool isFounder()
00092     {
00093         return !hasBothParents;
00094     }
00095     bool isSexed()
00096     {
00097         return sex != 0;
00098     }
00099     bool isGenotyped(int m)
00100     {
00101         return markers[m].isKnown();
00102     }
00103     bool isFullyGenotyped()
00104     {
00105         return ngeno == markerCount;
00106     }
00107     bool isControlled(int c)
00108     {
00109         return covariates[c] != _NAN_;
00110     }
00111     bool isFullyControlled()
00112     {
00113         return hasAllCovariates;
00114     }
00115     bool isPhenotyped(int t)
00116     {
00117         return traits[t] != _NAN_;
00118     }
00119     bool isFullyPhenotyped()
00120     {
00121         return hasAllTraits;
00122     }
00123     bool isDiagnosed(int a)
00124     {
00125         return affections[a] != 0;
00126     }
00127     bool isFullyDiagnosed()
00128     {
00129         return hasAllAffections;
00130     }
00131     bool haveData();
00132     bool isAncestor(Person * descendant);
00133 
00134     int GenotypedMarkers();
00135 
00136     static void Order(Person * & p1, Person * & p2);
00137 
00138     void Copy(Person & rhs);
00139     void CopyIDs(Person & rhs);
00140     void CopyPhenotypes(Person & rhs);
00141     void WipePhenotypes(bool remove_genotypes = true);
00142 
00143 private:
00144 
00145     bool hasAllCovariates, hasAllTraits,
00146     hasAllAffections, hasBothParents;
00147 };
00148 
00149 #endif
00150 
00151 
00152 
00153 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends