internal static MarkerGen1Summary RetrieveSummary( Int32 relatedIDLeft, LinksDataSet.tblRosterGen1DataTable dtRoster )
        {
            if ( dtRoster == null ) throw new ArgumentNullException("dtRoster");
            LinksDataSet.tblRosterGen1Row dr = dtRoster.FindByRelatedID(relatedIDLeft);

            MarkerEvidence sameGeneration = Assign.EvidenceGen1.RosterSameGeneration((Tristate)dr.SameGeneration);
            MarkerEvidence shareBiodad = Assign.EvidenceGen1.RosterShareBioParentOrGrandparent((Tristate)dr.ShareBiodad);
            MarkerEvidence shareBiomom = Assign.EvidenceGen1.RosterShareBioParentOrGrandparent((Tristate)dr.ShareBiomom);
            MarkerEvidence shareBiograndparent = Assign.EvidenceGen1.RosterShareBioParentOrGrandparent((Tristate)dr.ShareBiograndparent);

            return new MarkerGen1Summary(sameGeneration, shareBiomom, shareBiodad, shareBiograndparent);
        }
        public static float? CalculateRRoster( Int32 idRelated, LinksDataSet.tblRosterGen1DataTable dtRoster )
        {
            //TODO: Check overrides first.

            LinksDataSet.tblRosterGen1Row dr = dtRoster.FindByRelatedID(idRelated);
            Trace.Assert(dr != null, "Exactly one row should be retrieved from tblRosterGen1.");
            if ( dr.Resolved ) {
                Trace.Assert(!dr.IsRNull(), "If R is resolved by the roster, then R shouldn't be NaN.");
                return (float)dr.R;
            }
            else {
                return null;
            }
        }