public float[,] StatsDatArray()
        {
            if (this.StatsDataList == null && this.TheLJVScanSummary.StatsDataPath == null)
            {
                GenerateStatsData();
            }
            else
            {
                LoadStatsDataIntoList(TheLJVScanSummary.StatsDataPath);
            }
            var datum           = new LJVStatsDatum();
            int propertiesCount = datum.GetType().GetProperties().Count();
            var propertiesArray = datum.GetType().GetProperties();

            float[,] dataArray = new float[1, propertiesCount];
            dataArray          = new float[StatsDataList.Count, propertiesCount];
            for (int i = 0; i < StatsDataList.Count; i++)
            {
                datum = StatsDataList[i];
                for (int j = 0; j < propertiesCount; j++)
                {
                    float arrval          = 0;
                    var   datPropType     = datum.GetType().GetProperty(propertiesArray[j].Name);
                    var   datPropInstance = datPropType.GetValue(datum) as Nullable <decimal>;
                    arrval          = (float)(datPropInstance ?? 0);
                    dataArray[i, j] = arrval;
                }
            }
            return(dataArray);
        }
        public List <LJVStatsDatum> LJVStatsData(List <List <FullLJVDatum> > dataLists)
        {
            List <LJVStatsDatum> statsDataList = new List <LJVStatsDatum>();
            //find each unique voltage point
            HashSet <decimal> voltagePoints = new HashSet <decimal>();

            foreach (List <FullLJVDatum> list in dataLists)
            {
                foreach (FullLJVDatum d in list)
                {
                    voltagePoints.Add(d.Voltage);
                }
            }
            //loop through ever list and calculate mean/stdDev for each voltage (if it exists)
            foreach (decimal voltage in voltagePoints)
            {
                LJVStatsDatum       statsDatum    = new LJVStatsDatum();
                List <FullLJVDatum> dataAtVoltage = new List <FullLJVDatum>();
                foreach (List <FullLJVDatum> list in dataLists)
                {
                    int index = list.FindIndex(x => x.Voltage == voltage);
                    if (index >= 0)//FindIndex returns -1 if element doesn't exist
                    {
                        dataAtVoltage.Add(list[index]);
                    }
                }
            }

            return(statsDataList);
        }
        /// <summary>
        /// XD
        /// </summary>
        /// <param name="dataList"></param>
        /// <returns></returns>
        private LJVStatsDatum StatsDatumFromFullLJVList(List <FullLJVDatum> dataList)
        {
            LJVStatsDatum statsDatum       = new LJVStatsDatum();
            List <double> currentDensities = new List <double>();
            List <double> resistances      = new List <double>();
            List <double> photoCurrents    = new List <double>();
            List <double> luminances       = new List <double>();
            List <double> currentEffs      = new List <double>();
            List <double> powerEffs        = new List <double>();
            List <double> EQEs             = new List <double>();
            List <double> CIExs            = new List <double>();
            List <double> CIEys            = new List <double>();

            foreach (FullLJVDatum fd in dataList)
            {
                currentDensities.Add(Convert.ToDouble(fd.CurrentDensity));
                //Debug.WriteLine("currentDensity = " + fd.CurrentDensity);
                resistances.Add(Convert.ToDouble(fd.Resistance));
                photoCurrents.Add(Convert.ToDouble((fd.PhotoCurrentA + fd.PhotoCurrentB) / 2.0m));
                luminances.Add(Convert.ToDouble(fd.Luminance));
                currentEffs.Add(Convert.ToDouble(fd.CurrentEff));
                powerEffs.Add(Convert.ToDouble(fd.PowerEff));
                EQEs.Add(Convert.ToDouble(fd.EQE));
                CIExs.Add(Convert.ToDouble(fd.CameraCIEx));
                CIEys.Add(Convert.ToDouble(fd.CameraCIEy));
            }
            statsDatum.Voltage = dataList.First().Voltage;
            StatsBase calculator = new StatsBase();

            calculator.PopulateStatsFromArrayAndRound(currentDensities.ToArray(), 13);
            statsDatum.MeanCurrentDensity   = Convert.ToDecimal(calculator.Mean);
            statsDatum.CurrentDensityStdDev = Convert.ToDecimal(calculator.StdDev);
            //Debug.WriteLine("statsDatum.MeanCurrentDensity = " + statsDatum.MeanCurrentDensity);
            //Debug.WriteLine("statsDatum.CurrentDensityStdDev = " + statsDatum.CurrentDensityStdDev);
            calculator.PopulateStatsFromArrayAndRound(resistances.ToArray(), 13);
            statsDatum.MeanResistance   = Convert.ToDecimal(calculator.Mean);
            statsDatum.ResistanceStdDev = Convert.ToDecimal(calculator.StdDev);
            calculator.PopulateStatsFromArrayAndRound(photoCurrents.ToArray(), 13);
            statsDatum.MeanPhotoCurrent   = Convert.ToDecimal(calculator.Mean);
            statsDatum.PhotoCurrentStdDev = Convert.ToDecimal(calculator.StdDev);
            calculator.PopulateStatsFromArrayAndRound(luminances.ToArray(), 13);
            statsDatum.MeanLuminance   = Convert.ToDecimal(calculator.Mean);
            statsDatum.LuminanceStdDev = Convert.ToDecimal(calculator.StdDev);
            calculator.PopulateStatsFromArrayAndRound(currentEffs.ToArray(), 13);
            statsDatum.MeanCurrentEff   = Convert.ToDecimal(calculator.Mean);
            statsDatum.CurrentEffStdDev = Convert.ToDecimal(calculator.StdDev);
            calculator.PopulateStatsFromArrayAndRound(powerEffs.ToArray(), 13);
            statsDatum.MeanPowerEff   = Convert.ToDecimal(calculator.Mean);
            statsDatum.PowerEffStdDev = Convert.ToDecimal(calculator.StdDev);
            calculator.PopulateStatsFromArrayAndRound(EQEs.ToArray(), 13);
            statsDatum.MeanEQE   = Convert.ToDecimal(calculator.Mean);
            statsDatum.EQEStdDev = Convert.ToDecimal(calculator.StdDev);
            calculator.PopulateStatsFromArrayAndRound(CIExs.ToArray(), 13);
            statsDatum.MeanCameraCIEx   = Convert.ToDecimal(calculator.Mean);
            statsDatum.CameraCIExStdDev = Convert.ToDecimal(calculator.StdDev);
            calculator.PopulateStatsFromArrayAndRound(CIEys.ToArray(), 13);
            statsDatum.MeanCameraCIEy   = Convert.ToDecimal(calculator.Mean);
            statsDatum.CameraCIEyStdDev = Convert.ToDecimal(calculator.StdDev);
            return(statsDatum);
        }