public void Initialize(AdoDataConnection connection, VICycleDataGroup viCycleDataGroup, double systemFrequency) { int samplesPerCycle = Transform.CalculateSamplesPerCycle(viCycleDataGroup.VA.RMS, systemFrequency); TableOperations <FaultSegment> faultSegmentTable = new TableOperations <FaultSegment>(connection); RecordRestriction recordRestriction = new RecordRestriction("EventID = {0}", Fault.EventID) & new RecordRestriction("StartTime = {0}", ToDateTime2(connection, Fault.Inception)) & new RecordRestriction("(SELECT Name FROM SegmentType WHERE ID = SegmentTypeID) = 'Fault'"); FaultSegment faultSegment = faultSegmentTable.QueryRecord(recordRestriction); if ((object)faultSegment == null) { throw new InvalidOperationException($"Unable to find fault segment that matches fault summary for event {Fault.EventID}."); } StartSample = faultSegment.StartSample; EndSample = faultSegment.EndSample - samplesPerCycle + 1; CycleDataGroup = Rotate(viCycleDataGroup.ToSubSet(StartSample, EndSample)); DistanceCurve.StartIndex = StartSample; AngleCurve.StartIndex = StartSample; }
public void Initialize(DbAdapterContainer dbAdapterContainer, VICycleDataGroup viCycleDataGroup, double systemFrequency) { int samplesPerCycle = Transform.CalculateSamplesPerCycle(viCycleDataGroup.VA.RMS, systemFrequency); FaultSegment faultSegment = dbAdapterContainer.GetAdapter <FaultLocationInfoDataContext>().FaultSegments .Where(segment => segment.EventID == Fault.EventID) .Where(segment => segment.StartTime == Fault.Inception) .FirstOrDefault(segment => segment.SegmentType.Name == "Fault"); if ((object)faultSegment != null) { StartSample = faultSegment.StartSample; EndSample = faultSegment.EndSample - samplesPerCycle + 1; CycleDataGroup = Rotate(viCycleDataGroup.ToSubSet(StartSample, EndSample)); DistanceCurve.StartIndex = StartSample; AngleCurve.StartIndex = StartSample; } }
public void GenerateFaultCurves() { VICycleDataGroup subGroup; List <DataPoint> faultDataPoints; double[] faultDistances; foreach (Fault fault in Faults) { // Don't calculate fault distances for cycles at the end // of a fault because these cycles include non-faulted data int endSample = fault.EndSample - SamplesPerCycle; // Initialize a fault curve for each algorithm fault.Curves.AddRange(FaultLocationAlgorithms .Select(algorithm => fault.CreateCurve(algorithm.Method.Name)) .ToList()); foreach (Fault.Segment segment in fault.Segments) { if (endSample > segment.StartSample) { // Get a subset of the cycle data that contains only the data // in the current segment, up to and including the end sample subGroup = CycleDataGroup.ToSubSet(segment.StartSample, Math.Min(segment.EndSample, endSample)); // Set the fault type of the fault location data // set to the fault type of the current segment FaultLocationDataSet.FaultType = segment.FaultType; // Push data from the cycle data set // to the fault location data set FaultLocationDataSet.Cycles.Clear(); subGroup.PushDataTo(FaultLocationDataSet.Cycles); // Attempt to execute each fault location algorithm for (int i = 0; i < FaultLocationAlgorithms.Count; i++) { if (TryExecute(FaultLocationAlgorithms[i], FaultLocationDataSet, out faultDistances)) { // Create a data point for each of the fault distances faultDataPoints = subGroup.VA.RMS.DataPoints .Zip(faultDistances, (point, distance) => new DataPoint() { Time = point.Time, Value = distance }) .ToList(); } else { // Generate NaN-value data points to // fill this segment of the fault curve faultDataPoints = subGroup.VA.RMS.DataPoints .Select(point => new DataPoint() { Time = point.Time, Value = double.NaN }) .ToList(); } // Add the data points to the current fault curve fault.Curves[i].Series.DataPoints.AddRange(faultDataPoints); } } } } }