public POPDO(POPDO obj) : this()
		{
		    SetValues(obj);
		}
		public void SetValues(POPDO obj)
		{
			if(obj == null) { return; }
			CutLeave = obj.CutLeave;
			Stratum = obj.Stratum;
			SampleGroup = obj.SampleGroup;
			PrimaryProduct = obj.PrimaryProduct;
			SecondaryProduct = obj.SecondaryProduct;
			STM = obj.STM;
			UOM = obj.UOM;
			FirstStageTrees = obj.FirstStageTrees;
			MeasuredTrees = obj.MeasuredTrees;
			TalliedTrees = obj.TalliedTrees;
			SumKPI = obj.SumKPI;
			SumMeasuredKPI = obj.SumMeasuredKPI;
			StageOneSamples = obj.StageOneSamples;
			StageTwoSamples = obj.StageTwoSamples;
			Stg1GrossXPP = obj.Stg1GrossXPP;
			Stg1GrossXsqrdPP = obj.Stg1GrossXsqrdPP;
			Stg1NetXPP = obj.Stg1NetXPP;
			Stg1NetXsqrdPP = obj.Stg1NetXsqrdPP;
			Stg1ValueXPP = obj.Stg1ValueXPP;
			Stg1ValueXsqrdPP = obj.Stg1ValueXsqrdPP;
			Stg2GrossXPP = obj.Stg2GrossXPP;
			Stg2GrossXsqrdPP = obj.Stg2GrossXsqrdPP;
			Stg2NetXPP = obj.Stg2NetXPP;
			Stg2NetXsqrdPP = obj.Stg2NetXsqrdPP;
			Stg2ValueXPP = obj.Stg2ValueXPP;
			Stg2ValueXsqrdPP = obj.Stg2ValueXsqrdPP;
			Stg1GrossXSP = obj.Stg1GrossXSP;
			Stg1GrossXsqrdSP = obj.Stg1GrossXsqrdSP;
			Stg1NetXSP = obj.Stg1NetXSP;
			Stg1NetXsqrdSP = obj.Stg1NetXsqrdSP;
			Stg1ValueXSP = obj.Stg1ValueXSP;
			Stg1ValueXsqrdSP = obj.Stg1ValueXsqrdSP;
			Stg2GrossXSP = obj.Stg2GrossXSP;
			Stg2GrossXsqrdSP = obj.Stg2GrossXsqrdSP;
			Stg2NetXSP = obj.Stg2NetXSP;
			Stg2NetXsqrdSP = obj.Stg2NetXsqrdSP;
			Stg2ValueXSP = obj.Stg2ValueXSP;
			Stg2ValueXsqrdSP = obj.Stg2ValueXsqrdSP;
			Stg1GrossXRP = obj.Stg1GrossXRP;
			Stg1GrossXsqrdRP = obj.Stg1GrossXsqrdRP;
			Stg1NetXRP = obj.Stg1NetXRP;
			Stg1NetXRsqrdRP = obj.Stg1NetXRsqrdRP;
			Stg1ValueXRP = obj.Stg1ValueXRP;
			Stg1ValueXsqrdRP = obj.Stg1ValueXsqrdRP;
			Stg2GrossXRP = obj.Stg2GrossXRP;
			Stg2GrossXsqrdRP = obj.Stg2GrossXsqrdRP;
			Stg2NetXRP = obj.Stg2NetXRP;
			Stg2NetXsqrdRP = obj.Stg2NetXsqrdRP;
			Stg2ValueXRP = obj.Stg2ValueXRP;
			Stg2ValueXsqrdRP = obj.Stg2ValueXsqrdRP;
		}
        //---------------------------------------------------------------------------------------------------------
        private int getSampleGroupStats(StratumDO currentStratum, StratumStatsDO currentStratumStats, float totalAcres)
        {
            int n1, n2, measTrees, sumKpi, talliedTrees, freq, kz, insTrees;
             double st1x, st1x2, st2x, st2x2, cv1, cv2, sampErr, sumNetVol;
             float treesPerAcre;
             double comberr2 = 0;
             double totalVolume = 0;
             // for each sample group
             sampleGroups = new List<SampleGroupDO>(cdDAL.Read<SampleGroupDO>("SampleGroup", "Where Stratum_CN = ?", currentStratum.Stratum_CN));

             foreach (SampleGroupDO sg in sampleGroups)
             {
            // create samplegroupstats
            currentSgStats = new SampleGroupStatsDO(cdDAL);
            //set foriegn key
            currentSgStats.StratumStats = currentStratumStats;
            currentSgStats.SgSet = 1;
            currentSgStats.Code = sg.Code;
            currentSgStats.CutLeave = sg.CutLeave;
            currentSgStats.UOM = sg.UOM;
            currentSgStats.PrimaryProduct = sg.PrimaryProduct;
            currentSgStats.SecondaryProduct = sg.SecondaryProduct;
            currentSgStats.DefaultLiveDead = sg.DefaultLiveDead;
            currentSgStats.Description = sg.Description;
            // get POP data
            selectedPOP = cdDAL.ReadSingleRow<POPDO>("POP", "WHERE Stratum = ? AND SampleGroup = ?", currentStratum.Code, sg.Code);

            // calculate statistics (based on method)
            if (selectedPOP == null)
            {
               MessageBox.Show("Cruise Not Processed. Please Process Cruise Before Continuing.", "Warning");
               return(-1);
            }
            n1 = Convert.ToInt32(selectedPOP.StageOneSamples);
            n2 = Convert.ToInt32(selectedPOP.StageTwoSamples);
            measTrees = Convert.ToInt32(selectedPOP.MeasuredTrees);
            talliedTrees = Convert.ToInt32(selectedPOP.TalliedTrees);
            sumKpi = Convert.ToInt32(selectedPOP.SumKPI);
            st1x = selectedPOP.Stg1NetXPP;
            st1x2 = selectedPOP.Stg1NetXsqrdPP;
            st2x = selectedPOP.Stg2NetXPP;
            st2x2 = selectedPOP.Stg2NetXsqrdPP;
            // trees per plot
            // find CVs
            cv1 = statClass.getCV(st1x, st1x2, n1);
            if (stage == 12 || stage == 22)
               cv2 = statClass.getCV(st2x, st2x2, n2);
            else
               cv2 = 0;
            // find errors stage 11=tree,single 12=tree,2 stage 21=plot,single 22=plot,2 stage
            if (stage == 11 || stage == 21)
               sampErr = statClass.getSampleError(cv1, n1, 0);
            else if (stage == 12 || stage == 22)
               sampErr = statClass.getTwoStageError(cv1, cv2, n1, n2);
            else
               sampErr = 0;
            currentSgStats.CV1 = Convert.ToSingle(cv1);
            currentSgStats.CV2 = Convert.ToSingle(cv2);
            currentSgStats.SampleSize1 = n1;
            currentSgStats.SampleSize2 = n2;
            if (stage == 11 || stage == 10)
            {
               currentSgStats.ReconTrees = n1;
               currentSgStats.ReconPlots = 0;
            }
            else if (stage == 12)
            {
               currentSgStats.ReconPlots = n1;
               currentSgStats.ReconTrees = n2;
            }
            else if (stage == 21 || stage == 22)
            {
               currentSgStats.ReconTrees = measTrees;
               currentSgStats.ReconPlots = n1;
            }
            // calculate frequency

            currentSgStats.SgError = Convert.ToSingle(sampErr);

            // get LCD data
            selectedLCD = cdDAL.Read<LCDDO>("LCD", "WHERE Stratum = ? AND SampleGroup = ?", currentStratum.Code, sg.Code);
            sumExpFac = 0;
            sumNetVol = 0;
            //foreach (SampleGroupDO sg in Owner.histSampleGroup)
            foreach (LCDDO lcd in selectedLCD)
            {
               // sum volume
               double expFac = lcd.SumExpanFactor;
               sumExpFac += expFac;
               // sum trees
               double netVol = lcd.SumNCUFT;
               sumNetVol += netVol;
            }
            comberr2 += (sampErr * sumNetVol) * (sampErr * sumNetVol);
            totalVolume += sumNetVol;
            // find volume/acre and trees/acre
            if (stage < 20)
            {
               treesPerAcre = Convert.ToSingle(Math.Round((sumExpFac / totalAcres), 2));
               currentSgStats.TreesPerAcre = treesPerAcre;
               currentSgStats.VolumePerAcre = Convert.ToSingle(Math.Round((sumNetVol / totalAcres), 2));
            }
            else
            {
               treesPerAcre = Convert.ToSingle(Math.Round((sumExpFac), 2));
               currentSgStats.TreesPerAcre = treesPerAcre;
               currentSgStats.VolumePerAcre = Convert.ToSingle(Math.Round((sumNetVol), 2));
               if (stage == 21)
                  currentSgStats.TreesPerPlot = Convert.ToSingle(Math.Round((Convert.ToSingle((float)measTrees / (float)n1)), 1));
               else
                  currentSgStats.TreesPerPlot = Convert.ToSingle(Math.Round((Convert.ToSingle((float)talliedTrees / (float)n1)), 1));
            }
            currentSgStats.TPA_Def = (long)(treesPerAcre * totalAcres);
            // find frequency/KZ/BigBAF values
            if ((stage == 11 || stage == 12 || stage == 22) && measTrees > 0)
            {
               freq = Convert.ToInt32((talliedTrees / measTrees));
               kz = Convert.ToInt32((sumKpi / measTrees));

               if (currentStratum.Method == "S3P")
               {
                  currentSgStats.SamplingFrequency = Convert.ToInt32((talliedTrees / n1));
                  currentSgStats.KZ = kz;
               }
               else
               {
                  currentSgStats.SamplingFrequency = freq;
                  currentSgStats.KZ = kz;
               }
            }
            // find insurance trees
            if (stage == 11 || stage == 12)
               insTrees = getInsuranceTrees(sg);
            else
               insTrees = 0;
            currentSgStats.InsuranceFrequency = insTrees;
            // save samplegroupstats row
            currentSgStats.Save();
            // loop through TDV information
            sg.TreeDefaultValues.Populate();
            foreach (TreeDefaultValueDO tdv in sg.TreeDefaultValues)
            {
                currentSgStats.TreeDefaultValueStats.Add(tdv);
            }

            currentSgStats.Save();
            currentSgStats.TreeDefaultValueStats.Save();

             }
             return (0);
        }