public RParentChild( LinksDataSet dsLinks, LinksDataSet.tblRelatedStructureRow drLeft )
        {
            //ImportDataSet dsImport, , LinksDataSet.tblRelatedStructureRow drRight
            if ( dsLinks == null ) throw new ArgumentNullException("dsLinks");
            if ( drLeft == null ) throw new ArgumentNullException("drLeft");
            if ( dsLinks.tblSubject.Count == 0 ) throw new InvalidOperationException("tblSubject must NOT be empty before assigning R values from it.");
            _dsLinks = dsLinks;
            _drLeft = drLeft;
            _idRelatedLeft = _drLeft.ID;
            _drBare1 = _dsLinks.tblSubject.FindBySubjectTag(drLeft.SubjectTag_S1);
            _drBare2 = _dsLinks.tblSubject.FindBySubjectTag(drLeft.SubjectTag_S2);
            Trace.Assert(_drBare1.Generation != _drBare2.Generation, "The generation should not be the same for a parent-child relationship.");

            _multipleBirth = MultipleBirth.No;
            _isMZ = Tristate.No;

            //For IAssignPass1
            _rImplicitPass1 = RCoefficients.ParentChild;
            _rImplicit2004 = RCoefficients.ParentChild;
            _rExplicitOldestSibVersion = null;
            _rExplicitYoungestSibVersion = null;
            _rExplicitPass1 = RCoefficients.ParentChild;
            _rPass1 = RCoefficients.ParentChild;

            //For IAssignPass2
            _rImplicit = RCoefficients.ParentChild;
            _rImplicitSubject = RCoefficients.ParentChild;
            _rImplicitMother = RCoefficients.ParentChild;
            _rExplicit = RCoefficients.ParentChild;
            _rFull = RCoefficients.ParentChild;
            _rPeek = RCoefficients.ParentChild;
        }
        public RGen2Cousins( LinksDataSet dsLinks, LinksDataSet.tblRelatedStructureRow drLeft )
        {
            //ImportDataSet dsImport, , LinksDataSet.tblRelatedStructureRow drRight
            if ( dsLinks == null ) throw new ArgumentNullException("dsLinks");
            if ( drLeft == null ) throw new ArgumentNullException("drLeft");
            if ( dsLinks.tblSubject.Count == 0 ) throw new InvalidOperationException("tblSubject must NOT be empty before assigning R values from it.");
            _dsLinks = dsLinks;
            _idRelatedLeft = drLeft.ID;

            _drBare1 = _dsLinks.tblSubject.FindBySubjectTag(drLeft.SubjectTag_S1);
            _drBare2 = _dsLinks.tblSubject.FindBySubjectTag(drLeft.SubjectTag_S2);
            Trace.Assert(_drBare1.Generation == (byte)Generation.Gen2, "The generation should be Gen2.");
            Trace.Assert(_drBare2.Generation == (byte)Generation.Gen2, "The generation should be Gen2.");

            _multipleBirth = MultipleBirth.No;
            _isMZ = Tristate.No;

            LinksDataSet.tblRelatedValuesRow drValuesOfGen1Housemates = Gen1HousematesValues(_drBare1.SubjectTag, _drBare2.SubjectTag);//RelatedValues.Retrieve(_dsLinks, _path,
            //For IAssignPass1
            if ( drValuesOfGen1Housemates.IsRImplicitPass1Null() ) _rImplicitPass1 = null;
            else _rImplicitPass1 = (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.RImplicitPass1);

            if ( drValuesOfGen1Housemates.IsRImplicit2004Null() ) _rImplicit2004 = null;
            else _rImplicit2004 = (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.RImplicit2004);

            _rExplicitOldestSibVersion = null;
            _rExplicitYoungestSibVersion = null;

            if ( drValuesOfGen1Housemates.IsRExplicitPass1Null() ) _rExplicitPass1 = null;
            else _rExplicitPass1 = (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.RExplicitPass1);

            if ( drValuesOfGen1Housemates.IsRPass1Null() ) _rPass1 = null;
            else _rPass1 = (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.RPass1); ;

            //For IAssignPass2
            if ( drValuesOfGen1Housemates.IsRImplicitNull() ) _rImplicit = null;
            else _rImplicit = (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.RImplicit);

            if ( drValuesOfGen1Housemates.IsRImplicitSubjectNull() ) _rImplicitSubject = null;
            else _rImplicitSubject = (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.RImplicitSubject);

            if ( drValuesOfGen1Housemates.IsRImplicitMotherNull() ) _rImplicitMother = null;
            else _rImplicitMother = (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.RImplicitMother);

            if ( drValuesOfGen1Housemates.IsRExplicitNull() ) _rExplicit = null;
            else _rExplicit = (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.RExplicit);

            if ( drValuesOfGen1Housemates.IsRNull() ) _r= null;
            else _r= (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.R);

            if ( drValuesOfGen1Housemates.IsRFullNull() ) _rFull = null;
            else _rFull = (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.RFull);

            if ( drValuesOfGen1Housemates.IsRPeekNull() ) _rPeek = null;
            else _rPeek = (float)(RCoefficients.ParentChild * RCoefficients.ParentChild * drValuesOfGen1Housemates.RPeek);
        }
        public RGen2Pass1( ImportDataSet dsImport, LinksDataSet dsLinks, LinksDataSet.tblRelatedStructureRow drLeft, LinksDataSet.tblRelatedStructureRow drRight )
        {
            if ( dsImport == null ) throw new ArgumentNullException("dsImport");
            if ( dsLinks == null ) throw new ArgumentNullException("dsLinks");
            if ( drLeft == null ) throw new ArgumentNullException("drLeft");
            if ( drRight == null ) throw new ArgumentNullException("drRight");
            if ( dsImport.tblLinks2004Gen2.Count == 0 ) throw new InvalidOperationException("tblLinks2004Gen2 must NOT be empty before assigning R values from it.");
            if ( dsLinks.tblMzManual.Count == 0 ) throw new InvalidOperationException("tblMzManual must NOT be empty before assigning R values from it.");
            if ( dsLinks.tblSubject.Count == 0 ) throw new InvalidOperationException("tblSubject must NOT be empty before assigning R values from it.");
            if ( dsLinks.tblSubjectDetails.Count == 0 ) throw new InvalidOperationException("tblSubjectDetails must NOT be empty before assigning R values from it.");
            if ( dsLinks.tblMarkerGen2.Count == 0 ) throw new InvalidOperationException("tblMarkerGen2 must NOT be empty before assigning R values from it.");
            _dsImport = dsImport;
            _dsLinks = dsLinks;
            _drLeft = drLeft;
            _drRight = drRight;
            _idRelatedLeft = _drLeft.ID;
            _idRelatedRight = _drRight.ID;
            _drBare1 = _dsLinks.tblSubject.FindBySubjectTag(drLeft.SubjectTag_S1);
            _drBare2 = _dsLinks.tblSubject.FindBySubjectTag(drLeft.SubjectTag_S2);
            _drSubjectDetails1 = _dsLinks.tblSubjectDetails.FindBySubjectTag(drLeft.SubjectTag_S1);
            _drSubjectDetails2 = _dsLinks.tblSubjectDetails.FindBySubjectTag(drLeft.SubjectTag_S2);
            _extendedID = _drLeft.tblSubjectRowByFK_tblRelatedStructure_tblSubject_Subject1.ExtendedID;

            if ( _drSubjectDetails1.BirthOrderInNls <= _drSubjectDetails2.BirthOrderInNls ) {//This is the way it usually is.  Recall twins were assigned tied birth orders
                _idRelatedOlderAboutYounger = _idRelatedLeft;
                _idRelatedYoungerAboutOlder = _idRelatedRight;
            }
            else if ( _drSubjectDetails1.BirthOrderInNls > _drSubjectDetails2.BirthOrderInNls ) {
                _idRelatedOlderAboutYounger = _idRelatedRight;
                _idRelatedYoungerAboutOlder = _idRelatedLeft;
            }

            _dtMarkersGen2 = MarkerGen2.PairRelevantMarkerRows(_idRelatedLeft, _idRelatedRight, _dsLinks, _extendedID);

            LinksDataSet.tblMzManualRow drMzManual = Retrieve.MzManualRecord(_drBare1, _drBare2, _dsLinks);
            if ( drMzManual == null ) {
                _multipleBirth = MultipleBirth.No;
                _isMZ = Tristate.No;
            }
            else {
                _multipleBirth = (MultipleBirth)drMzManual.MultipleBirthIfSameSex;
                _isMZ = (Tristate)drMzManual.IsMz;
            }
            MarkerEvidence babyDaddyDeathDate = MarkerGen2.RetrieveBiodadMarkerFromGen1(_idRelatedOlderAboutYounger, MarkerType.BabyDaddyDeathDate, _dtMarkersGen2);
            MarkerEvidence babyDaddyAlive = MarkerGen2.RetrieveBiodadMarkerFromGen1(_idRelatedOlderAboutYounger, MarkerType.BabyDaddyAlive, _dtMarkersGen2);
            MarkerEvidence babyDaddyInHH = MarkerGen2.RetrieveBiodadMarkerFromGen1(_idRelatedOlderAboutYounger, MarkerType.BabyDaddyInHH, _dtMarkersGen2);
            MarkerEvidence babyDaddyLeftHHDate = MarkerGen2.RetrieveBiodadMarkerFromGen1(_idRelatedOlderAboutYounger, MarkerType.BabyDaddyLeftHHDate, _dtMarkersGen2);
            MarkerEvidence babyDaddyDistanceFromHH = MarkerGen2.RetrieveBiodadMarkerFromGen1(_idRelatedOlderAboutYounger, MarkerType.BabyDaddyDistanceFromHH, _dtMarkersGen2);
            MarkerEvidence babyDaddyAsthma = MarkerGen2.RetrieveBiodadMarkerFromGen1(_idRelatedOlderAboutYounger, MarkerType.BabyDaddyAsthma, _dtMarkersGen2);

            _rImplicitPass1 = CalculateRImplicitPass1(babyDaddyDeathDate, babyDaddyAlive, babyDaddyInHH, babyDaddyLeftHHDate, babyDaddyDistanceFromHH, babyDaddyAsthma);
            //_rImplicit not set;
            _rImplicit2004 = RetrieveRImplicit2004();
            _rExplicitOldestSibVersion = CalculateRExplicitOldestSibVersion();
            _rExplicitYoungestSibVersion = CalculateRExplicitYoungestSibVersion();
            _rExplicitPass1 = CalculateRExplicitPass1(_isMZ, _multipleBirth);
            //_rExplicit not set;
            _rPass1 = CalculateRPass1();
            //_r not set;
            //_rPeek not set;
        }