private void RefreshTimerEventProcess(Object pObject, EventArgs pEventArgs) { gRefreshTimer.Stop(); try { //Need refresh the parameters when restart a data ACQ //There are two methods to do this //1. Use the timer check the flag //2. Use the function call to clear the flag #region Used to clear graph when a new ACQ Start if (gParentWindow.gRefreshAllEnergyDiagram && (gCleanFlag[gPixelNo] == false)) { gCleanFlag[gPixelNo] = true; //Display raw data related #region Clear Raw Data Display gLastEnergyCount = 0; //Update Count lblPixelTotalEcentCountsValue.Text = "0"; gXData.Clear(); gYData.Clear(); #endregion //Clear fitting parameters #region Clear Fitting Parameters gFittingXData.Clear(); gFittingYData.Clear(); gFittingG1XData.Clear(); gFittingG1YData.Clear(); gFittingG2XData.Clear(); gFittingG2YData.Clear(); gFittingG3XData.Clear(); gFittingG3YData.Clear(); gFittingLinearXData.Clear(); gFittingLinearYData.Clear(); gFittingPeakXData.Clear( ); gFittingPeakYData.Clear( ); #endregion zGraph1.f_Refresh(); } #endregion if ((( int )gParentWindow.gSelectedScanParametersForDataAcq.gSourceType < ( int )cScanParameters.eSourceType.LightShare)) { //Only there is new data point, then refresh the graph #region Disable Raw Data if (gLastEnergyCount != gParentWindow.gEventDataInfo[gPixelNo].Count) { //This is used to track how many data point is displayed int myDisplayedCount = 0; //Get total count gLastEnergyCount = gParentWindow.gEventDataInfo[gPixelNo].Count; //Update Count lblPixelTotalEcentCountsValue.Text = gLastEnergyCount.ToString( ); gXData.Clear( ); gYData.Clear( ); for (int myIndex = 0; myDisplayedCount < gLastEnergyCount; myIndex++) { List <cRawData> mySatisfiedRange = gParentWindow.gEventDataInfo[gPixelNo].FindAll(cRawData => (cRawData.mData >= gBinSize * myIndex) && (cRawData.mData < gBinSize * (myIndex + 1))); myDisplayedCount += mySatisfiedRange.Count; //This might solve the tail problem if (((gBinSize * myIndex + gBinSize / 2) > 50) && (mySatisfiedRange.Count > 1)) { gXData.Add(gBinSize * myIndex + gBinSize / 2); gYData.Add(( float )mySatisfiedRange.Count); } else if ((gBinSize * myIndex + gBinSize / 2) < 50) { gXData.Add(gBinSize * myIndex + gBinSize / 2); gYData.Add(( float )mySatisfiedRange.Count); } } zGraph1.f_Refresh( ); } #endregion } else { //Usally no raw data to display } #region Fitting if (gParentWindow.gIsAutoFitting) { if (gParentWindow.gIsFittingDone && (gFittingFlag[gPixelNo] == false)) { gFittingFlag[gPixelNo] = true; if (gParentWindow.gFitting != null) { cFittingParameters myFittingParameters = new cFittingParameters(); if (gParentWindow.gFitting.gDictFittingParameters.TryGetValue(gPixelNo, out myFittingParameters)) { if (myFittingParameters.mStatus == (int)cFittingParameters.eStatus.OK) { #region Clear Fitting Data List gFittingXData.Clear(); gFittingYData.Clear(); gFittingG1XData.Clear(); gFittingG1YData.Clear(); gFittingG2XData.Clear(); gFittingG2YData.Clear(); gFittingG3XData.Clear(); gFittingG3YData.Clear(); gFittingLinearXData.Clear(); gFittingLinearYData.Clear(); gFittingPeakXData.Clear( ); gFittingPeakYData.Clear( ); #endregion #region Draw Light Share Raw Data if ((( int )gParentWindow.gSelectedScanParametersForDataAcq.gSourceType >= ( int )cScanParameters.eSourceType.LightShare)) { gXData.Clear( ); gYData.Clear( ); UInt32 myTotalCount = 0; foreach (cRawData myData in gParentWindow.gEventDataInfo[gPixelNo]) { /* * if (myData.mAddress <= 254) { * * gXData.Add(myData.mAddress * 64); * * gYData.Add((float)myData.mData); * * myTotalCount += (UInt32)myData.mData; * * //In case the slope is 2, it will draw another line * if (myData.mAddress == 254) { * * break; * * } * * } else { * * break; * * } */ gXData.Add(myData.mAddress * 64); gYData.Add((float)myData.mData); myTotalCount += (UInt32)myData.mData; } lblPixelTotalEcentCountsValue.Text = myTotalCount.ToString( ); //zGraph1.f_Refresh( ); } #endregion #region Draw Fitting Line gG2PeakYValue = 0f; gG2PeakXValue = 0f; gBinSize = 64; for (int myIndex = 0; myIndex < 16384 / gBinSize; myIndex++) { myXValue = (float)(myIndex * gBinSize + gBinSize / 2.0); gParentWindow.gFitting.FillFittingFormula(myFittingParameters, myXValue, out myYValue, out myYG1Value, out myYG2Value, out myYG3Value, out myYLinearValue, out myG2Peak, out myG2PeakXValue); #region Add Fitting X Value /* * if (gParentWindow.gSelectedScanParametersForDataAcq.gSourceType == (int)cScanParameters.eSourceType.LightShareSiglePixel) { * * //beause don't change the gause formula then can only do this * //This is used to solve the problem that the single pixel raw data is calibarted * //But the fitting is still not using calibrated value * myXValue = (float)((myIndex * gBinSize + gBinSize / 2.0) * gCalibratedSlope + gCalibratedOffset); * * } */ //gFittingXData.Add(myXValue); //gFittingG1XData.Add(myXValue); gFittingG2XData.Add(myXValue); //gFittingG3XData.Add(myXValue); //gFittingLinearXData.Add(myXValue); if (myYG2Value > gG2PeakYValue) { gG2PeakXValue = myXValue; gG2PeakYValue = myYG2Value; } #endregion #region Zero negtive value if (myYValue < 0) { myYValue = 0f; } if (myYG1Value < 0) { myYG1Value = 0f; } if (myYG2Value < 0) { myYG2Value = 0f; } if (myYG3Value < 0) { myYG3Value = 0f; } if (myYLinearValue < 0) { myYLinearValue = 0f; } #endregion #region Adding Fitting Y Value //gFittingYData.Add(myYValue); //gFittingG1YData.Add(myYG1Value); gFittingG2YData.Add(myYG2Value); //gFittingG3YData.Add(myYG3Value); //gFittingLinearYData.Add(myYLinearValue); #endregion } zGraph1.f_reXY( ); gParentWindow.gFitting.gPixelRawDataPeak[gPixelNo] = gG2PeakXValue; for (int i = 0; i < ( int )zGraph1._fYEnd; i++) { gFittingPeakXData.Add(gG2PeakXValue); gFittingPeakYData.Add(i); } //zGraph1.f_Refresh( ); lblFittingPeakValue.Text = myFittingParameters.mG2Center.ToString("0.0#"); lblEnergyResolutionValue.Text = myFittingParameters.mEnergyResolution.ToString("0.0#") + "%"; lblG2CenterError.Text = myFittingParameters.mG2Error.ToString("+/- 0.0#"); #endregion zGraph1.f_Refresh(); } else { gParentWindow.gErrorOutput.OutPutErrorMessage(cErrorCode.gkecFitting_ExceptionWhenFitting, ""); } } else { //MessageBox.Show("No enough correct data for fitting"); gParentWindow.gErrorOutput.OutPutErrorMessage(cErrorCode.gkecFitting_NoEnoughCorrectData, ""); } } else { gParentWindow.gErrorOutput.OutPutErrorMessage(cErrorCode.gkecFitting_NoFittingResult, ""); } } } #endregion } catch { } gRefreshTimer.Start(); }
private void btnOK_Click(object sender, EventArgs e) { string myPeakValue = txtPeakValue.Text; float myPixelPeakValue = 0.0f; string myWarning = ""; string myTitle = ""; string myInputWarning = ""; if (gMainWindows.gSelectedLanguage == (int)Demo.gLanguageVersion.English) { myInputWarning = "Please enter a valid value"; myWarning = "Manual set energy peak value will overwrite this pixel's auto fitting result, please confirm"; myTitle = "Confirm Peak Modify"; } else { myInputWarning = "请输入正确的峰值"; myWarning = "手动赋值能谱峰值将覆盖当前像素自动fitting结果,请确认"; myTitle = "峰值确认"; } if (!float.TryParse(myPeakValue, out myPixelPeakValue)) { #region Warning User MessageBox.Show(myInputWarning); #endregion } else { #region Check and input cFittingParameters myFittingParameters = new cFittingParameters( ); if (gMainWindows.gFitting.gDictFittingParameters.TryGetValue(gPixelNo, out myFittingParameters)) { if (myFittingParameters.mStatus == (int)cFittingParameters.eStatus.OK) { if (MessageBox.Show(myWarning, myTitle, MessageBoxButtons.YesNo) == DialogResult.Yes) { gMainWindows.gFitting.gDictFittingParameters[gPixelNo].mStatus = (int)cFittingParameters.eStatus.ManualFit; gMainWindows.gFitting.gDictFittingParameters[gPixelNo].mG2Center = myPixelPeakValue; gMainWindows.gFitting.gDictFittingParameters[gPixelNo].mEnergyResolution = 0f;; } } else { gMainWindows.gFitting.gDictFittingParameters[gPixelNo].mStatus = (int)cFittingParameters.eStatus.ManualFit; gMainWindows.gFitting.gDictFittingParameters[gPixelNo].mG2Center = myPixelPeakValue; gMainWindows.gFitting.gDictFittingParameters[gPixelNo].mEnergyResolution = 0f; } } #endregion this.Close( ); } }