private static SequenceComponents CalculateSequenceComponents(Complex an, Complex bn, Complex cn)
        {
            double  TwoPI  = 2.0D * Math.PI;
            double  Rad120 = TwoPI / 3.0D;
            Complex a      = new Complex(Math.Cos(Rad120), Math.Sin(Rad120));
            Complex aSq    = a * a;

            SequenceComponents sequenceComponents = new SequenceComponents();

            sequenceComponents.S0 = (an + bn + cn) / 3.0D;
            sequenceComponents.S1 = (an + a * bn + aSq * cn) / 3.0D;
            sequenceComponents.S2 = (an + aSq * bn + a * cn) / 3.0D;

            return(sequenceComponents);
        }
        public ActionResult Get(int eventID, int pixels)
        {
            using (AdoDataConnection connection = new AdoDataConnection(m_configuration["OpenXDA:ConnectionString"], m_configuration["OpenXDA:DataProviderString"]))
            {
                Event evt = new TableOperations <Event>(connection).QueryRecordWhere("ID = {0}", eventID);
                if (evt == null)
                {
                    return(BadRequest("Must provide a valid EventID"));
                }
                Meter meter = new TableOperations <Meter>(connection).QueryRecordWhere("ID = {0}", evt.MeterID);
                meter.ConnectionFactory = () => new AdoDataConnection(m_configuration["OpenXDA:ConnectionString"], m_configuration["OpenXDA:DataProviderString"]);

                Dictionary <string, IEnumerable <double[]> > returnData = new Dictionary <string, IEnumerable <double[]> >();
                DataGroupHelper  dataGroupHelper  = new DataGroupHelper(m_configuration, m_memoryCache);
                VICycleDataGroup vICycleDataGroup = dataGroupHelper.QueryVICycleDataGroup(eventID, meter);


                Dictionary <string, List <double[]> > returnList = new Dictionary <string, List <double[]> >();


                if (vICycleDataGroup.VA != null && vICycleDataGroup.VB != null && vICycleDataGroup.VC != null)
                {
                    var va      = vICycleDataGroup.VA.RMS.DataPoints;
                    var vaPhase = vICycleDataGroup.VA.Phase.DataPoints;
                    var vb      = vICycleDataGroup.VB.RMS.DataPoints;
                    var vbPhase = vICycleDataGroup.VB.Phase.DataPoints;
                    var vc      = vICycleDataGroup.VC.RMS.DataPoints;
                    var vcPhase = vICycleDataGroup.VC.Phase.DataPoints;

                    IEnumerable <SequenceComponents> sequencComponents = va.Select((point, index) =>
                    {
                        DataPoint vaPoint      = point;
                        DataPoint vaPhasePoint = vaPhase[index];
                        Complex vaComplex      = Complex.FromPolarCoordinates(vaPoint.Value, vaPhasePoint.Value);

                        DataPoint vbPoint      = vb[index];
                        DataPoint vbPhasePoint = vbPhase[index];
                        Complex vbComplex      = Complex.FromPolarCoordinates(vbPoint.Value, vbPhasePoint.Value);

                        DataPoint vcPoint      = vc[index];
                        DataPoint vcPhasePoint = vcPhase[index];
                        Complex vcComplex      = Complex.FromPolarCoordinates(vcPoint.Value, vcPhasePoint.Value);

                        SequenceComponents sequenceComponents = CalculateSequenceComponents(vaComplex, vbComplex, vcComplex);

                        return(sequenceComponents);
                    });

                    returnList.Add("S0/S1 Voltage", sequencComponents.Select((point, index) => new double[] { va[index].Time.Subtract(m_epoch).TotalMilliseconds, point.S0.Magnitude / point.S1.Magnitude * 100.0D }).ToList());
                    returnList.Add("S2/S1 Voltage", sequencComponents.Select((point, index) => new double[] { va[index].Time.Subtract(m_epoch).TotalMilliseconds, point.S2.Magnitude / point.S1.Magnitude * 100.0D }).ToList());
                }


                if (vICycleDataGroup.IA != null && vICycleDataGroup.IB != null && vICycleDataGroup.IC != null)
                {
                    var ia      = vICycleDataGroup.IA.RMS.DataPoints;
                    var iaPhase = vICycleDataGroup.IA.Phase.DataPoints;
                    var ib      = vICycleDataGroup.IB.RMS.DataPoints;
                    var ibPhase = vICycleDataGroup.IB.Phase.DataPoints;
                    var ic      = vICycleDataGroup.IC.RMS.DataPoints;
                    var icPhase = vICycleDataGroup.IC.Phase.DataPoints;

                    IEnumerable <SequenceComponents> sequencComponents = ia.Select((point, index) =>
                    {
                        DataPoint iaPoint      = point;
                        DataPoint iaPhasePoint = iaPhase[index];
                        Complex iaComplex      = Complex.FromPolarCoordinates(iaPoint.Value, iaPhasePoint.Value);

                        DataPoint ibPoint      = ib[index];
                        DataPoint ibPhasePoint = ibPhase[index];
                        Complex ibComplex      = Complex.FromPolarCoordinates(ibPoint.Value, ibPhasePoint.Value);

                        DataPoint icPoint      = ic[index];
                        DataPoint icPhasePoint = icPhase[index];
                        Complex icComplex      = Complex.FromPolarCoordinates(icPoint.Value, icPhasePoint.Value);

                        SequenceComponents sequenceComponents = CalculateSequenceComponents(iaComplex, ibComplex, icComplex);

                        return(sequenceComponents);
                    });
                    returnList.Add("S0/S1 Current", sequencComponents.Select((point, index) => new double[] { ia[index].Time.Subtract(m_epoch).TotalMilliseconds, point.S0.Magnitude / point.S1.Magnitude * 100.0D }).ToList());
                    returnList.Add("S2/S1 Current", sequencComponents.Select((point, index) => new double[] { ia[index].Time.Subtract(m_epoch).TotalMilliseconds, point.S2.Magnitude / point.S1.Magnitude * 100.0D }).ToList());
                }

                return(Ok(returnList));
            }
        }