private void btnOpenAnotherLogFile_Click(object sender, EventArgs e) { OpenFileDialog fileOpen = new OpenFileDialog(); if (fileOpen.ShowDialog() == DialogResult.OK) { strLogFilename = fileOpen.FileName; Dictionary <string, object> dictDataToShow = NetCDFoperations.ReadDataFromFile(strLogFilename); if (!dictDataToShow.Keys.Contains("AccelerometerData")) { MessageBox.Show("It`s not an acceleration data log. Try another file.", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); } sensorsHistoryRepresentingScale = 30; ThreadSafeOperations.MoveTrackBar(trackBar1, 30); strLogFilename = fileOpen.FileName; Represent(); } }
private void OpenFile(string filelistmember) { dataFileName = filelistmember; try { dmDataToShow = NetCDFoperations.ReadDenseMatrixFromFile(dataFileName); } catch (Exception ex) { theLogWindow = ServiceTools.LogAText(theLogWindow, "coundn`t load data from file:" + Environment.NewLine + dataFileName); theLogWindow = ServiceTools.LogAText(theLogWindow, "exception description:" + Environment.NewLine + ex.Message); return; } if (dmDataToShow != null) { RepresentData(); } }
static async Task <ImageStatsDataCalculationResult> ConvertImageTask(object inputArgs) { ImageStatsDataCalculationResult Result = new ImageStatsDataCalculationResult(); Dictionary <string, object> ParametersPassed = inputArgs as Dictionary <string, object>; string logFileName = ""; string currentFullFileName = ParametersPassed["currentFullFileName"] as string; Stopwatch stopwatch = null; List <Tuple <string, string> > lImagesRoundMasksMappingFiles = null; if (ParametersPassed != null) { if (ParametersPassed.ContainsKey("ImagesRoundMasksXMLfilesMappingList")) { string ImagesRoundMasksXMLfilesMappingListPassed = (string)ParametersPassed["ImagesRoundMasksXMLfilesMappingList"]; if (File.Exists(ImagesRoundMasksXMLfilesMappingListPassed)) { List <List <string> > llImagesRoundMasksMappingFiles = ServiceTools.ReadDataFromCSV(ImagesRoundMasksXMLfilesMappingListPassed, 0, true, ";", Environment.NewLine); lImagesRoundMasksMappingFiles = llImagesRoundMasksMappingFiles.ConvertAll( list => new Tuple <string, string>(list[0], list[1])); } } if (ParametersPassed.ContainsKey("Stopwatch")) { stopwatch = ParametersPassed["Stopwatch"] as Stopwatch; } if (ParametersPassed.ContainsKey("logFileName")) { logFileName = ParametersPassed["logFileName"] as string; } } TimeSpan procStart = Process.GetCurrentProcess().TotalProcessorTime; try { RoundData predefinedRoundedMask = null; if (lImagesRoundMasksMappingFiles != null) { if (lImagesRoundMasksMappingFiles.Any()) { if (lImagesRoundMasksMappingFiles.Find(tpl => (new WildcardPattern(tpl.Item1)).IsMatch(currentFullFileName)) != null) { string strFoundPredefinedRoundedMaskParametersXMLfile = lImagesRoundMasksMappingFiles.Find( tpl => (new WildcardPattern(tpl.Item1)).IsMatch(currentFullFileName)).Item2; strFoundPredefinedRoundedMaskParametersXMLfile = strFoundPredefinedRoundedMaskParametersXMLfile.Substring(0, strFoundPredefinedRoundedMaskParametersXMLfile.IndexOf(".xml") + 4); predefinedRoundedMask = ServiceTools.ReadObjectFromXML(strFoundPredefinedRoundedMaskParametersXMLfile, typeof(RoundData)) as RoundData; } } } Image <Bgr, byte> currImg = new Image <Bgr, byte>(currentFullFileName); ImageProcessing imgP = new ImageProcessing(currImg, predefinedRoundedMask); Image <Bgr, byte> maskImage = new Image <Bgr, byte>(new Image <Gray, byte>[] { imgP.significantMaskImageCircled, imgP.significantMaskImageCircled, imgP.significantMaskImageCircled }); Image <Bgr, byte> img = imgP.tmpImage.Mul(maskImage); string ncFileName = ConventionalTransitions.NetCDFimageBareChannelsDataFilename(currentFullFileName, ParametersPassed["outputNetCDFfilesDirectory"] as string, true, ParametersPassed["ImagesBasePath"] as string); Dictionary <string, object> dataToNCwrite = new Dictionary <string, object>(); dataToNCwrite.Add("ColorChannels", img.Data); NetCDFoperations.SaveVariousDataToFile(dataToNCwrite, ncFileName); TimeSpan procEnd = Process.GetCurrentProcess().TotalProcessorTime; Result = new ImageStatsDataCalculationResult() { calcResult = true, imgFilename = currentFullFileName, mp5Result = null, grixyrgbStatsData = null, stopwatch = stopwatch, exception = null, procTotalProcessorTimeEnd = procEnd, procTotalProcessorTimeStart = procStart }; return(Result); } catch (Exception ex) { TimeSpan procEnd = Process.GetCurrentProcess().TotalProcessorTime; Result = new ImageStatsDataCalculationResult() { calcResult = false, imgFilename = currentFullFileName, stopwatch = stopwatch, exception = ex, procTotalProcessorTimeEnd = procEnd, procTotalProcessorTimeStart = procStart }; return(Result); } }
private void Represent() { Dictionary <string, object> dictDataToShow = NetCDFoperations.ReadDataFromFile(strLogFilename); long[] arrDateTimeTicksValues = new long[] { 0 }; if (dictDataToShow.Keys.Contains("DateTime")) { arrDateTimeTicksValues = (long[])(dictDataToShow["DateTime"]); } else if (dictDataToShow.Keys.Contains("Datetime")) { arrDateTimeTicksValues = (long[])(dictDataToShow["Datetime"]); } else { MessageBox.Show("Couldn`t acces the DateTime field of the file " + strLogFilename, "", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } DenseVector dvSecondsVector = DenseVector.Create(arrDateTimeTicksValues.Length, i => { DateTime dateTime1 = new DateTime(arrDateTimeTicksValues[i]); TimeSpan dt = dateTime1 - dateTime1.Date; return(dt.TotalSeconds); }); dmAccData = (DenseMatrix)dictDataToShow["AccelerometerData"]; if (sensorsHistoryRepresentingScale < 86400) { double lastDateTimeSecondsValue = dvSecondsVector[dvSecondsVector.Count - 1]; int searchingIndex = dvSecondsVector.Count - 1; for (int idx = dvSecondsVector.Count - 1; idx >= 0; idx--) { if (lastDateTimeSecondsValue - dvSecondsVector[idx] >= sensorsHistoryRepresentingScale) { searchingIndex = idx; break; } } dvSecondsVector = (DenseVector)dvSecondsVector.SubVector(searchingIndex, dvSecondsVector.Count - searchingIndex); dmAccData = (DenseMatrix)dmAccData.SubMatrix(searchingIndex, dvSecondsVector.Count, 0, dmAccData.ColumnCount); } #region filter input data noise List <DenseVector> dmAccDataFiltered = new List <DenseVector>(); Dictionary <string, DenseVector> dictCurrColumnFilteredData = new Dictionary <string, DenseVector>(); for (int col = 0; col < dmAccData.ColumnCount; col++) { DenseVector dvVectToFilter = (DenseVector)dmAccData.Column(col); dictCurrColumnFilteredData = DataAnalysis.SavGolFilter(dvVectToFilter, dvSecondsVector, 6, 6, 0, 6); dmAccDataFiltered.Add(dictCurrColumnFilteredData["values"]); //dmAccData.SetColumn(col, dictCurrColumnFilteredData["values"]); //dvSecondsVector = dictCurrColumnFilteredData["time"]; } dvSecondsVector = dictCurrColumnFilteredData["time"]; dmAccData = (DenseMatrix)DenseMatrix.OfColumns(dvSecondsVector.Count, dmAccData.ColumnCount, dmAccDataFiltered); #endregion filter input data noise // надо рассчитать углы отклонения отдельно - по сглаженным данным и по данным гироскопа DenseVector dvDataToShowDevAngleValue = (DenseVector)dmAccData.Column(6); if (cbFilterData.Checked) { List <double> ac = new List <double>(); } if (accDeviationAngleRenderer == null) { accDeviationAngleRenderer = new MultipleScatterAndFunctionsRepresentation(pbRepresentingDevAngle.Size); accDeviationAngleRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationAngleRenderer.dvScatterFuncValues.Add(dvDataToShowDevAngleValue); accDeviationAngleRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationAngleRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } else { if (accDeviationAngleRenderer.xSpaceMin != dvSecondsVector.Max() - sensorsHistoryRepresentingScale) { accDeviationAngleRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationAngleRenderer.dvScatterXSpace.Clear(); accDeviationAngleRenderer.dvScatterFuncValues.Clear(); accDeviationAngleRenderer.scatterLineColors.Clear(); accDeviationAngleRenderer.scatterDrawingVariants.Clear(); accDeviationAngleRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationAngleRenderer.dvScatterFuncValues.Add(dvDataToShowDevAngleValue); accDeviationAngleRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationAngleRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } } accDeviationAngleRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationAngleRenderer.Represent(); ThreadSafeOperations.UpdatePictureBox(pbRepresentingDevAngle, accDeviationAngleRenderer.TheImage.Bitmap); DenseVector dvDataToShowAccMagnitudeDev = DenseVector.Create(dmAccData.RowCount, i => { AccelerometerData currAccData = new AccelerometerData(dmAccData[i, 0], dmAccData[i, 1], dmAccData[i, 2]); AccelerometerData calibrationAccData = new AccelerometerData(dmAccData[i, 3], dmAccData[i, 4], dmAccData[i, 5]); return(currAccData.AccMagnitude - calibrationAccData.AccMagnitude); }); if (accDeviationMagnitudeRenderer == null) { accDeviationMagnitudeRenderer = new MultipleScatterAndFunctionsRepresentation(pbRepresentingDevMagnitude.Size); accDeviationMagnitudeRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationMagnitudeRenderer.dvScatterFuncValues.Add(dvDataToShowAccMagnitudeDev); accDeviationMagnitudeRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationMagnitudeRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } else { if (accDeviationMagnitudeRenderer.xSpaceMin != dvSecondsVector.Max() - sensorsHistoryRepresentingScale) { accDeviationMagnitudeRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationMagnitudeRenderer.dvScatterXSpace.Clear(); accDeviationMagnitudeRenderer.dvScatterFuncValues.Clear(); accDeviationMagnitudeRenderer.scatterLineColors.Clear(); accDeviationMagnitudeRenderer.scatterDrawingVariants.Clear(); accDeviationMagnitudeRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationMagnitudeRenderer.dvScatterFuncValues.Add(dvDataToShowAccMagnitudeDev); accDeviationMagnitudeRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationMagnitudeRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } } accDeviationMagnitudeRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationMagnitudeRenderer.Represent(); ThreadSafeOperations.UpdatePictureBox(pbRepresentingDevMagnitude, accDeviationMagnitudeRenderer.TheImage.Bitmap); AccelerometerData accCalibratedData = new AccelerometerData(dmAccData[0, 3], dmAccData[0, 4], dmAccData[0, 5]); double phiAngle = Math.Asin(accCalibratedData.xyProjectionMagnitude() / accCalibratedData.AccMagnitude); double tmpL = accCalibratedData.AccMagnitude * Math.Sin(phiAngle) * Math.Cos(phiAngle); double tmpLz = tmpL * Math.Sin(phiAngle); double tmpLx = tmpL * Math.Cos(phiAngle) * Math.Sqrt(1 + accCalibratedData.AccY * accCalibratedData.AccY / (accCalibratedData.AccX * accCalibratedData.AccX)); double tmpLy = tmpLx * accCalibratedData.AccY / accCalibratedData.AccX; AccelerometerData unitaryAccVectorZeroAngle = new AccelerometerData(tmpLx, tmpLy, tmpLz); unitaryAccVectorZeroAngle = unitaryAccVectorZeroAngle / unitaryAccVectorZeroAngle.AccMagnitude; AccelerometerData unitaryAccVectorCalibratedAcceleration = accCalibratedData / (accCalibratedData.AccMagnitude); DenseVector dvDataToShowAccDevDirection = DenseVector.Create(dmAccData.RowCount, i => { AccelerometerData currAccData = new AccelerometerData(dmAccData[i, 0], dmAccData[i, 1], dmAccData[i, 2]); AccelerometerData currAccDataProjectionPerpendicularToCalibratedAcc = currAccData - unitaryAccVectorCalibratedAcceleration * (currAccData * accCalibratedData / accCalibratedData.AccMagnitude); double retAngle = Math.Acos(currAccDataProjectionPerpendicularToCalibratedAcc * unitaryAccVectorZeroAngle / currAccDataProjectionPerpendicularToCalibratedAcc.AccMagnitude); AccelerometerData vectProduct = unitaryAccVectorZeroAngle ^ currAccDataProjectionPerpendicularToCalibratedAcc; if (vectProduct * unitaryAccVectorCalibratedAcceleration > 0) { //значит угол лежит в пределах от 0 до PI - ничего не делаем retAngle = retAngle + 0.0d; } else { //векторное произведение противоположно по направлению g0 - значит, угол лежит в диапазоне от Pi до 2Pi или от -PI до PI retAngle = -retAngle; } return(retAngle); }); if (accDeviationDirectionRenderer == null) { accDeviationDirectionRenderer = new MultipleScatterAndFunctionsRepresentation(pbRepresentingDevDirection.Size); accDeviationDirectionRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationDirectionRenderer.dvScatterFuncValues.Add(dvDataToShowAccDevDirection); accDeviationDirectionRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationDirectionRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } else { if (accDeviationDirectionRenderer.xSpaceMin != dvSecondsVector.Max() - sensorsHistoryRepresentingScale) { accDeviationDirectionRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationDirectionRenderer.dvScatterXSpace.Clear(); accDeviationDirectionRenderer.dvScatterFuncValues.Clear(); accDeviationDirectionRenderer.scatterLineColors.Clear(); accDeviationDirectionRenderer.scatterDrawingVariants.Clear(); accDeviationDirectionRenderer.dvScatterXSpace.Add(dvSecondsVector); accDeviationDirectionRenderer.dvScatterFuncValues.Add(dvDataToShowAccDevDirection); accDeviationDirectionRenderer.scatterLineColors.Add(new Bgr(Color.Blue)); accDeviationDirectionRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); } } accDeviationDirectionRenderer.xSpaceMin = dvSecondsVector.Max() - sensorsHistoryRepresentingScale; accDeviationDirectionRenderer.Represent(); ThreadSafeOperations.UpdatePictureBox(pbRepresentingDevDirection, accDeviationDirectionRenderer.TheImage.Bitmap); }
private Image <Bgr, byte> FillGraphImage(Size imgSize) { string curDirPath = Directory.GetCurrentDirectory() + "\\logs\\"; DirectoryInfo dirInfo = new DirectoryInfo(curDirPath); List <Dictionary <string, object> > lReadData = new List <Dictionary <string, object> >(); if (defaultGraphsTimeSpan) { graphsTimeSpan = new Tuple <DateTime, DateTime>(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow); } GraphVariablesTypes currVarType = GraphVariablesTypes.none; if (rbtnPressureGraph.Checked) { currVarType = GraphVariablesTypes.Pressure; } if (rbtnAirTempGraph.Checked) { currVarType = GraphVariablesTypes.AirTemp; } if (rbtnWaterTempGraph.Checked) { currVarType = GraphVariablesTypes.WaterTemp; } if (rbtnWindSpeedGraph.Checked) { currVarType = GraphVariablesTypes.WindSpeed; } if ((fRenderer == null) || (!prevGraphsTimeSpan.Equals(graphsTimeSpan) || currVarType != prevGraphVariable)) { fRenderer = new MultipleScatterAndFunctionsRepresentation(imgSize); switch (currVarType) { case GraphVariablesTypes.Pressure: { currValueColor = new Bgr(Color.Blue); break; } case GraphVariablesTypes.AirTemp: { currValueColor = new Bgr(Color.Red); break; } case GraphVariablesTypes.WaterTemp: { currValueColor = new Bgr(Color.RoyalBlue); break; } case GraphVariablesTypes.WindSpeed: { currValueColor = new Bgr(Color.Gray); break; } default: { currValueColor = new Bgr(Color.Blue); break; } } } else if (fRenderer != null) { if (fRenderer.TheImage.Size != imgSize) { fRenderer.ResizeCanvas(imgSize); } } if (!prevGraphsTimeSpan.Equals(graphsTimeSpan)) { IEnumerable <string> ncFileNames = Directory.EnumerateFiles(curDirPath, "IoffeVesselInfoStream-MeteoDataLog-*.nc", SearchOption.TopDirectoryOnly); foreach (string ncFileName in ncFileNames) { Tuple <DateTime, DateTime> currFileDateTimeRange = null; try { currFileDateTimeRange = ServiceTools.GetNetCDFfileTimeStampsRange(ncFileName); } catch (Exception ex) { #region report #if DEBUG ServiceTools.ExecMethodInSeparateThread(this, () => { theLogWindow = ServiceTools.LogAText(theLogWindow, "an exception has been thrown during file reading: " + Environment.NewLine + ncFileName + Environment.NewLine + "message: " + ex.Message + Environment.NewLine + ServiceTools.CurrentCodeLineDescription()); }); #else ServiceTools.ExecMethodInSeparateThread(this, () => { ServiceTools.logToTextFile(errorLogFilename, "an exception has been thrown during file reading: " + Environment.NewLine + ncFileName + Environment.NewLine + "message: " + ex.Message + Environment.NewLine + ServiceTools.CurrentCodeLineDescription(), true, true); }); #endif #endregion report } if (currFileDateTimeRange == null) { continue; } if ((currFileDateTimeRange.Item1 >= graphsTimeSpan.Item1) && (currFileDateTimeRange.Item1 <= graphsTimeSpan.Item2) || (currFileDateTimeRange.Item2 >= graphsTimeSpan.Item1) && (currFileDateTimeRange.Item2 <= graphsTimeSpan.Item2)) { Dictionary <string, object> dictFileData = null; try { dictFileData = NetCDFoperations.ReadDataFromFile(ncFileName); } catch (Exception ex) { #region report #if DEBUG ServiceTools.ExecMethodInSeparateThread(this, () => { theLogWindow = ServiceTools.LogAText(theLogWindow, "an exception has been thrown during file reading: " + Environment.NewLine + ncFileName + Environment.NewLine + "message: " + ex.Message + Environment.NewLine + ServiceTools.CurrentCodeLineDescription()); }); #else ServiceTools.ExecMethodInSeparateThread(this, () => { ServiceTools.logToTextFile(errorLogFilename, "an exception has been thrown during file reading: " + Environment.NewLine + ncFileName + Environment.NewLine + "message: " + ex.Message + Environment.NewLine + ServiceTools.CurrentCodeLineDescription(), true, true); }); #endif #endregion report } if (dictFileData != null) { lReadData.Add(dictFileData); } } } foreach (Dictionary <string, object> currFileDataDict in lReadData) { if (currFileDataDict == null) { continue; } string varNameDateTime = "DateTime"; List <long> currFileDateTimeLongTicksList = new List <long>((currFileDataDict[varNameDateTime] as long[])); List <DateTime> currFileDateTimeList = currFileDateTimeLongTicksList.ConvertAll(longVal => new DateTime(longVal)); string varNameMeteoData = "MeteoData"; List <MeteoData> currFileMeteoDataList = MeteoData.OfDenseMatrix(currFileDataDict[varNameMeteoData] as DenseMatrix); if (tsMeteoDataForGraphs == null) { try { tsMeteoDataForGraphs = new TimeSeries <MeteoData>(currFileMeteoDataList, currFileDateTimeList, true); } catch (Exception ex) { #region report #if DEBUG ServiceTools.ExecMethodInSeparateThread(this, () => { theLogWindow = ServiceTools.LogAText(theLogWindow, "couldn`t create timeseries: exception has been thrown" + Environment.NewLine + ServiceTools.CurrentCodeLineDescription() + Environment.NewLine + "message: " + ex.Message); }); #else ServiceTools.ExecMethodInSeparateThread(this, () => { ServiceTools.logToTextFile(errorLogFilename, "couldn`t create timeseries: exception has been thrown" + Environment.NewLine + ServiceTools.CurrentCodeLineDescription() + Environment.NewLine + "message: " + ex.Message, true, true); }); #endif #endregion report } } else { try { tsMeteoDataForGraphs.AddSubseriaData(currFileMeteoDataList, currFileDateTimeList, true); } catch (Exception ex) { #region report #if DEBUG ServiceTools.ExecMethodInSeparateThread(this, () => { theLogWindow = ServiceTools.LogAText(theLogWindow, "couldn`t create timeseries: exception has been thrown" + Environment.NewLine + ServiceTools.CurrentCodeLineDescription() + Environment.NewLine + "message: " + ex.Message); }); #else ServiceTools.ExecMethodInSeparateThread(this, () => { ServiceTools.logToTextFile(errorLogFilename, "couldn`t create timeseries: exception has been thrown" + Environment.NewLine + ServiceTools.CurrentCodeLineDescription() + Environment.NewLine + "message: " + ex.Message, true, true); }); #endif #endregion report } } } if (tsMeteoDataForGraphs == null) { return(null); } tsMeteoDataForGraphs.SortByTimeStamps(); tsMeteoDataForGraphs.RemoveDuplicatedTimeStamps(); DateTime utcNow = DateTime.UtcNow; if (defaultGraphsTimeSpan) { tsMeteoDataForGraphs.RemoveValues(dt => (utcNow - dt).TotalSeconds > 86400); } else { tsMeteoDataForGraphs.RemoveValues( dt => !((dt >= graphsTimeSpan.Item1) && (dt <= graphsTimeSpan.Item2))); } List <TimeSeries <MeteoData> > subSeriesBy1Minute = tsMeteoDataForGraphs.SplitByTimeSpan(new TimeSpan(0, 1, 0)); List <double> lSubSeriesEntriesCount = subSeriesBy1Minute.ConvertAll(subs => (double)subs.Count); DescriptiveStatistics statsCounts = new DescriptiveStatistics(lSubSeriesEntriesCount); aveMinuteEntriesCount = Convert.ToInt32(statsCounts.Mean); // = tsMeteoData.TimeStamps.ConvertAll(dt => (dt - maxDateTime).TotalSeconds); } List <MeteoData> meteoDataList = tsMeteoDataForGraphs.DataValues; DateTime maxDateTime = tsMeteoDataForGraphs.TimeStamps.Max(); if ((currVarType != prevGraphVariable) || !prevGraphsTimeSpan.Equals(graphsTimeSpan)) { double minVarValue = 0.0d; double maxVarValue = 1.0d; List <double> currVarToShowValues = new List <double>(); switch (currVarType) { case GraphVariablesTypes.Pressure: { currVarToShowValues = meteoDataList.ConvertAll(mdt => mdt.pressure); TimeSeries <double> currVarTS = new TimeSeries <double>(currVarToShowValues, tsMeteoDataForGraphs.TimeStamps); currVarTS.RemoveValues(dVal => dVal <= 900.0d); currVarToShowValues = new List <double>(currVarTS.DataValues); currFileSecondsList = currVarTS.TimeStamps.ConvertAll(dt => (dt - maxDateTime).TotalSeconds); fRenderer.yAxisValuesConversionToRepresentTicksValues = new Func <double, string>(dVal => dVal.ToString("F1")); break; } case GraphVariablesTypes.AirTemp: { currVarToShowValues = meteoDataList.ConvertAll(mdt => mdt.airTemperature); TimeSeries <double> currVarTS = new TimeSeries <double>(currVarToShowValues, tsMeteoDataForGraphs.TimeStamps); currVarTS.RemoveValues(dVal => ((dVal < -20.0d) || (dVal > 50.0d))); currVarToShowValues = new List <double>(currVarTS.DataValues); currFileSecondsList = currVarTS.TimeStamps.ConvertAll(dt => (dt - maxDateTime).TotalSeconds); fRenderer.yAxisValuesConversionToRepresentTicksValues = new Func <double, string>(dVal => dVal.ToString("F2")); break; } case GraphVariablesTypes.WaterTemp: { currVarToShowValues = meteoDataList.ConvertAll(mdt => mdt.waterTemperature); TimeSeries <double> currVarTS = new TimeSeries <double>(currVarToShowValues, tsMeteoDataForGraphs.TimeStamps); currVarTS.RemoveValues(dVal => ((dVal < -20.0d) || (dVal > 50.0d))); currVarToShowValues = new List <double>(currVarTS.DataValues); currFileSecondsList = currVarTS.TimeStamps.ConvertAll(dt => (dt - maxDateTime).TotalSeconds); fRenderer.yAxisValuesConversionToRepresentTicksValues = new Func <double, string>(dVal => dVal.ToString("F2")); break; } case GraphVariablesTypes.WindSpeed: { currVarToShowValues = meteoDataList.ConvertAll(mdt => mdt.windSpeed); TimeSeries <double> currVarTS = new TimeSeries <double>(currVarToShowValues, tsMeteoDataForGraphs.TimeStamps); currVarTS.RemoveValues(dVal => ((dVal < 0.0d) || (dVal > 50.0d))); currVarToShowValues = new List <double>(currVarTS.DataValues); currFileSecondsList = currVarTS.TimeStamps.ConvertAll(dt => (dt - maxDateTime).TotalSeconds); fRenderer.yAxisValuesConversionToRepresentTicksValues = new Func <double, string>(dVal => dVal.ToString("F1")); break; } default: return(null); } dvVarValues = DenseVector.OfEnumerable(currVarToShowValues); dvVarValues = dvVarValues.Conv(Extensions.StandardConvolutionKernels.gauss, aveMinuteEntriesCount * 10); } fRenderer.dvScatterFuncValues.Add(dvVarValues); fRenderer.dvScatterXSpace.Add(DenseVector.OfEnumerable(currFileSecondsList)); fRenderer.xAxisValuesConversionToRepresentTicksValues = (dValSec) => { DateTime currDT = tsMeteoDataForGraphs.TimeStamps.Max().AddSeconds(dValSec); return(currDT.ToString("yyyy-MM-dd" + Environment.NewLine + "HH:mm")); }; fRenderer.scatterLineColors.Add(currValueColor); fRenderer.scatterDrawingVariants.Add(SequencesDrawingVariants.polyline); fRenderer.xSpaceMin = currFileSecondsList.Min(); fRenderer.xSpaceMax = currFileSecondsList.Max(); fRenderer.overallFuncMin = dvVarValues.Min(); fRenderer.overallFuncMax = dvVarValues.Max(); fRenderer.fixSpecifiedMargins = true; fRenderer.Represent(); Image <Bgr, byte> retImg = fRenderer.TheImage; // расположим надпись string strSign = "current value: " + dvVarValues.Last().ToString("F2"); List <TextBarImage> textBarsCases = new List <TextBarImage>(); TextBarImage tbimTopLeftSign = new TextBarImage(strSign, retImg); tbimTopLeftSign.PtSurroundingBarStart = new Point(fRenderer.LeftServiceSpaceGapX + tbimTopLeftSign.textHalfHeight, fRenderer.TopServiceSpaceGapY + tbimTopLeftSign.textHalfHeight); textBarsCases.Add(tbimTopLeftSign); TextBarImage tbimBtmLeftSign = new TextBarImage(strSign, retImg); tbimBtmLeftSign.PtSurroundingBarStart = new Point(fRenderer.LeftServiceSpaceGapX + tbimBtmLeftSign.textHalfHeight, retImg.Height - fRenderer.BtmServiceSpaceGapY - tbimBtmLeftSign.textHalfHeight - tbimBtmLeftSign.textHeight * 2); textBarsCases.Add(tbimBtmLeftSign); TextBarImage tbimTopRightSign = new TextBarImage(strSign, retImg); tbimTopRightSign.PtSurroundingBarStart = new Point( retImg.Width - fRenderer.RightServiceSpaceGapX - tbimTopRightSign.textHalfHeight - tbimTopRightSign.textBarSize.Width, fRenderer.TopServiceSpaceGapY + tbimTopLeftSign.textHalfHeight); textBarsCases.Add(tbimTopRightSign); TextBarImage tbimBtmRightSign = new TextBarImage(strSign, retImg); tbimBtmRightSign.PtSurroundingBarStart = new Point( retImg.Width - fRenderer.RightServiceSpaceGapX - tbimBtmRightSign.textHalfHeight - tbimBtmRightSign.textBarSize.Width, retImg.Height - fRenderer.BtmServiceSpaceGapY - tbimBtmRightSign.textHalfHeight - tbimBtmRightSign.textHeight * 2); textBarsCases.Add(tbimBtmRightSign); textBarsCases.Sort((case1, case2) => (case1.SubImageInTextRect.CountNonzero().Sum() > case2.SubImageInTextRect.CountNonzero().Sum()) ? 1 : -1); MCvFont theFont = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_PLAIN, 2.0d, 2.0d) { thickness = 2, }; // retImg.Draw(strSign, textBarsCases[0].ptTextBaselineStart, Emgu.CV.CvEnum.FontFace.HersheyPlain, 2.0d, new Bgr(Color.Green), 2); retImg.Draw(strSign, ref theFont, textBarsCases[0].ptTextBaselineStart, new Bgr(Color.Green)); retImg.Draw(textBarsCases[0].rectSurroundingBar, new Bgr(Color.Green), 2); prevGraphsTimeSpan = graphsTimeSpan; prevGraphVariable = currVarType; return(retImg); }
private void btnPerformExport_Click(object sender, EventArgs e) { string outPath = rtbExportDestinationDirectoryPath.Text; outPath += (outPath.Last() == '\\') ? ("") : ("\\"); if (cbExportMeteoData.Checked) { //export meteo data BackgroundWorker bgwReadMeteoData = new BackgroundWorker(); bgwReadMeteoData.WorkerSupportsCancellation = false; bgwReadMeteoData.WorkerReportsProgress = true; bgwReadMeteoData.DoWork += delegate(object currBGWsender, DoWorkEventArgs args) { BackgroundWorker selfWorker = currBGWsender as BackgroundWorker; TimeSeries <MeteoData> tsMeteoData = new TimeSeries <MeteoData>(); string[] meteoDataFiles = Directory.GetFiles(Directory.GetCurrentDirectory() + "\\logs\\", "*MeteoDataLog*.nc"); int totalFilesCount = meteoDataFiles.Count(); int readFiles = 0; foreach (string meteoDataFileName in meteoDataFiles) { ThreadSafeOperations.SetText(lblStatusBar, "reading " + Path.GetFileName(meteoDataFileName), false); Dictionary <string, object> currMeteoFileData = NetCDFoperations.ReadDataFromFile(meteoDataFileName); List <MeteoData> currFileMeteoData = MeteoData.OfDenseMatrix(currMeteoFileData["MeteoData"] as DenseMatrix); List <long> currFileDatetimeLong = new List <long>(currMeteoFileData["DateTime"] as long[]); List <DateTime> currFileDatetime = currFileDatetimeLong.ConvertAll <DateTime>(longDT => new DateTime(longDT)); tsMeteoData.AddSubseriaData(currFileMeteoData, currFileDatetime, true); readFiles++; selfWorker.ReportProgress(Convert.ToInt32(100.0d * readFiles / totalFilesCount)); } args.Result = new object[] { tsMeteoData }; }; bgwReadMeteoData.ProgressChanged += delegate(object currBGWsender, ProgressChangedEventArgs args) { ThreadSafeOperations.UpdateProgressBar(prbExportProgress, args.ProgressPercentage); }; bgwReadMeteoData.RunWorkerCompleted += delegate(object currBGWsender, RunWorkerCompletedEventArgs args) { ThreadSafeOperations.UpdateProgressBar(prbExportProgress, 0); TimeSeries <MeteoData> tsMeteoData = (args.Result as object[])[0] as TimeSeries <MeteoData>; List <Tuple <DateTime, MeteoData> > lTplMeteoData = tsMeteoData.TimeStamps.Zip(tsMeteoData.DataValues, (dt, dat) => new Tuple <DateTime, MeteoData>(dt, dat)).ToList(); if (cbExportFormatCSV.Checked) { List <string> tsMeteoDataCSV = lTplMeteoData.ConvertAll <string>(tpl => tpl.Item1.ToString("o") + "," + tpl.Item2.ToCSV()); string tsMeteoDataCSVForFile = String.Join(Environment.NewLine, tsMeteoDataCSV.ToArray <string>()); ServiceTools.logToTextFile(outPath + "MeteoData.csv", "DateTime," + lTplMeteoData[0].Item2.CSVHeader() + Environment.NewLine, false, false); ServiceTools.logToTextFile(outPath + "MeteoData.csv", tsMeteoDataCSVForFile, true, false); } }; ThreadSafeOperations.SetText(lblStatusBar, "meteo data read started", false); bgwReadMeteoData.RunWorkerAsync(); } }
private void btnReadData_Click(object sender, EventArgs e) { strLogFilesDirectory = tbLogFilesPath.Text; if (bgwDataReader != null && bgwDataReader.IsBusy) { bgwDataReader.CancelAsync(); return; } ThreadSafeOperations.ToggleButtonState(btnReadData, true, "CANCEL", true); DoWorkEventHandler currDoWorkHandler = delegate(object currBGWsender, DoWorkEventArgs args) { BackgroundWorker selfworker = currBGWsender as BackgroundWorker; List <double> lTotalDataToAdd = new List <double>(); List <DateTime> lDateTimeList = new List <DateTime>(); DirectoryInfo dInfo = new DirectoryInfo(strLogFilesDirectory); FileInfo[] fInfoArr = dInfo.GetFiles("*AccelerometerDataLog*.nc"); int fInfoCounter = 0; foreach (FileInfo fInfo in fInfoArr) { if (selfworker.CancellationPending) { break; } fInfoCounter++; selfworker.ReportProgress(Convert.ToInt32((double)(fInfoCounter - 1) / (double)fInfoArr.Length)); ThreadSafeOperations.SetText(lblStatusString, "reading " + fInfo.FullName, false); Dictionary <string, object> dictDataLoaded = NetCDFoperations.ReadDataFromFile(fInfo.FullName); string varNameDateTime = "DateTime"; if (dictDataLoaded.Keys.Contains("DateTime")) { varNameDateTime = "DateTime"; } else if (dictDataLoaded.Keys.Contains("Datetime")) { varNameDateTime = "Datetime"; } List <long> currFileDateTimeLongTicksList = new List <long>((dictDataLoaded[varNameDateTime] as long[])); List <DateTime> currFileDateTimeList = currFileDateTimeLongTicksList.ConvertAll(longVal => new DateTime(longVal)); string varNameAccData = "AccelerometerData"; List <AccelerometerData> lAccData = AccelerometerData.OfDenseMatrix(dictDataLoaded[varNameAccData] as DenseMatrix); List <double> lAccDataToAdd = lAccData.ConvertAll <double>(acc => acc.AccMagnitude); lTotalDataToAdd.AddRange(lAccDataToAdd); lDateTimeList.AddRange(currFileDateTimeList); selfworker.ReportProgress(Convert.ToInt32((double)(fInfoCounter) / (double)fInfoArr.Length)); } accSeriaData.AddSubseriaData(lTotalDataToAdd, lDateTimeList); //теперь обработаем считанные данные ThreadSafeOperations.SetText(lblStatusString, "basic acceleration data processing...", false); accSubseries = accSeriaData.SplitWithTimeSpanCondition(dt => dt.TotalMilliseconds >= 1200); accSubseries.RemoveAll(theSeria => theSeria.TotalSeriaDuration.TotalSeconds < 100); List <double> listSeriesStats = accSubseries.ConvertAll(timeseria => timeseria.TotalSeriaDuration.TotalSeconds); DescriptiveStatistics stats = new DescriptiveStatistics(listSeriesStats); string strToShow = "Acceleration data start time: " + accSubseries[0].StartTime.ToString("s") + Environment.NewLine; strToShow += "Acceleration data end time: " + accSubseries[accSubseries.Count - 1].EndTime.ToString("s") + Environment.NewLine; strToShow += "total chunks count: " + accSubseries.Count + Environment.NewLine; strToShow += "mean chunk duration: " + stats.Mean.ToString("0.##e-00") + " s" + Environment.NewLine; strToShow += "min chunk duration: " + stats.Minimum.ToString("0.##e-00") + " s" + Environment.NewLine; strToShow += "max chunk duration: " + stats.Maximum.ToString("0.##e-00") + " s" + Environment.NewLine; strToShow += "StdDev of chunk duration: " + stats.StandardDeviation.ToString("0.##e-00") + " s" + Environment.NewLine; ThreadSafeOperations.SetTextTB(tbReportLog, strToShow, true); List <GPSdata> lTotalGPSDataToAdd = new List <GPSdata>(); List <DateTime> lGPSDateTimeList = new List <DateTime>(); dInfo = new DirectoryInfo(strLogFilesDirectory); fInfoArr = dInfo.GetFiles("*GPSDataLog*.nc"); fInfoCounter = 0; foreach (FileInfo fInfo in fInfoArr) { if (selfworker.CancellationPending) { break; } fInfoCounter++; selfworker.ReportProgress(Convert.ToInt32((double)(fInfoCounter - 1) / (double)fInfoArr.Length)); ThreadSafeOperations.SetText(lblStatusString, "reading " + fInfo.FullName, false); Dictionary <string, object> dictDataLoaded = NetCDFoperations.ReadDataFromFile(fInfo.FullName); string varNameDateTime = "DateTime"; if (dictDataLoaded.Keys.Contains("DateTime")) { varNameDateTime = "DateTime"; } else if (dictDataLoaded.Keys.Contains("Datetime")) { varNameDateTime = "Datetime"; } List <long> currFileDateTimeLongTicksList = new List <long>((dictDataLoaded[varNameDateTime] as long[])); List <DateTime> currFileDateTimeList = currFileDateTimeLongTicksList.ConvertAll(longVal => new DateTime(longVal)); string varNameGPSData = "GPSdata"; List <GPSdata> lGPSData = GPSdata.OfDenseMatrix(dictDataLoaded[varNameGPSData] as DenseMatrix); //List<double> lGPSDataToAdd = lGPSData.ConvertAll<double>(acc => acc.AccMagnitude); lTotalGPSDataToAdd.AddRange(lGPSData); lGPSDateTimeList.AddRange(currFileDateTimeList); selfworker.ReportProgress(Convert.ToInt32((double)(fInfoCounter) / (double)fInfoArr.Length)); } gpsSeriaData.AddSubseriaData(lTotalGPSDataToAdd, lGPSDateTimeList); //теперь обработаем считанные данные ThreadSafeOperations.SetText(lblStatusString, "basic GPS data processing...", false); gpsSeriaData.RemoveValues(gpsDatum => ((gpsDatum.lat == 0.0d) && (gpsDatum.lon == 0.0d))); gpsSeriaData.RemoveDuplicatedTimeStamps(); strToShow = Environment.NewLine + "GPS data start time: " + gpsSeriaData.StartTime.ToString("s") + Environment.NewLine; strToShow += "GPS data end time: " + gpsSeriaData.EndTime.ToString("s") + Environment.NewLine; ThreadSafeOperations.SetTextTB(tbReportLog, strToShow, true); }; RunWorkerCompletedEventHandler currWorkCompletedHandler = delegate(object currBGWCompletedSender, RunWorkerCompletedEventArgs args) { ThreadSafeOperations.ToggleButtonState(btnReadData, true, "Read data", true); }; ProgressChangedEventHandler bgwDataReader_ProgressChanged = delegate(object bgwDataReaderSender, ProgressChangedEventArgs args) { ThreadSafeOperations.UpdateProgressBar(prbReadingProcessingData, args.ProgressPercentage); }; bgwDataReader = new BackgroundWorker(); bgwDataReader.WorkerSupportsCancellation = true; bgwDataReader.WorkerReportsProgress = true; bgwDataReader.DoWork += currDoWorkHandler; bgwDataReader.RunWorkerCompleted += currWorkCompletedHandler; bgwDataReader.ProgressChanged += bgwDataReader_ProgressChanged; object[] BGWargs = new object[] { "", "" }; bgwDataReader.RunWorkerAsync(BGWargs); }