public LaserDiode(List<int> sigDat,List<int> refDat) { _SamplingDataList = new List<SamplingData>(); for (int i = 0; i < sigDat.Count(); i++) { SamplingData sd = new SamplingData(sigDat[i], refDat[i]); _SamplingDataList.Add(sd); } }
private string CheckOverFlow(int Threshold1,int Threshold2){ List<SamplingData> inputAttLD = new List<SamplingData>(); List<SamplingData> inputAdLD = new List<SamplingData>(); //Initialize for (int i = 0; i < 9; i++) { SamplingData sd = new SamplingData(0, 0); inputAttLD.Add(sd); } for (int i = 0; i < 9; i++) { SamplingData sd = new SamplingData(0, 0); inputAdLD.Add(sd); } List<List<SamplingData>> src = new List<List<SamplingData>>(_machine.GetMaxSampData()); //比較 for (int i = 0; i < src[0].Count; i++) { if (src[0][i].GetSigData() > Threshold1 ) { inputAttLD[i].SetSigData(src[0][i].GetSigData()); } if (src[0][i].GetRefData() > Threshold1) { inputAttLD[i].SetRefData(src[0][i].GetRefData()); } } for (int i = 0; i < src[0].Count; i++) { if (src[1][i].GetSigData() > Threshold2 ) { inputAdLD[i].SetSigData(src[1][i].GetSigData()); } if (src[1][i].GetRefData() > Threshold2) { inputAdLD[i].SetRefData(src[1][i].GetRefData()); } } //出力 string inputAttOverflow = "アッテネーター入力\tしきい値:"+ Threshold1 + "\r\n"; string inputAdOverflow = "AD入力\tしきい値:"+ Threshold2 +"\r\n"; for (int i = 0; i < inputAttLD.Count; i++) { if (inputAttLD[i].GetSigData() != 0) { inputAttOverflow += "LD" + i.ToString() + "\tSigが\t" + inputAttLD[i].GetSigData().ToString() + "\t飽和しています。\r\n"; } if (inputAttLD[i].GetRefData() != 0) { inputAttOverflow += "LD" + i.ToString() + "\tRefが\t" + inputAttLD[i].GetRefData().ToString() + "\t飽和しています。\r\n"; } } for (int i = 0; i < inputAdLD.Count; i++) { if (inputAdLD[i].GetSigData() != 0) { inputAdOverflow += "LD" + i.ToString() + "\tSigが\t" + inputAdLD[i].GetSigData().ToString() + "\t飽和しています。\r\n"; } if (inputAdLD[i].GetRefData() != 0) { inputAdOverflow += "LD" + i.ToString() + "\tRefが\t" + inputAdLD[i].GetRefData().ToString() + "\t飽和しています。\r\n"; } } string result = inputAttOverflow + "\r\n" + inputAdOverflow; return result; }
//ソースである8chのLDの値からオフセットを引いて返す private List<SamplingData> GetDiffOffset(List<SamplingData> src, SamplingData offset) { List<SamplingData> result = new List<SamplingData>(); result.Add(offset); foreach (SamplingData sd in src) { double sigBuf = sd.GetSigData() - offset.GetSigData(); double refBuf = sd.GetRefData() - offset.GetRefData(); SamplingData offsetRemovedSd = new SamplingData(sigBuf, refBuf); result.Add(offsetRemovedSd); } return result; }
////result1 //public List<double> GetGammaList() { // return this._avgGammaList; //} ////result2 //public List<SamplingResult> GetAvgSamplingList() { // return this._avgSamplingList; //} ////result3 //public List<List<SamplingResult>> GetSamplingResult() { // return this._allSamplingResult; //} public void Main() { List<LaserDiodeSet> src = _machine.GetLaserDiodeSetList(); List<List<double>> allGammaList = new List<List<double>>(); //gamma6 * 30 List<double> allBslList = new List<double>(); List<List<SamplingResult>> allSamplingResult = new List<List<SamplingResult>>(); List<List<SamplingResult>> allSamplingResultRaw = new List<List<SamplingResult>>(); //Sampling Count x300 for (int i = 0; i < src.Count; i++) { SamplingData offset = new SamplingData(); List<SamplingData> averagedSampData = new List<SamplingData>(); //LD x9 for (int j = 0; j < numOfLaser; j++) { double sigAvg = 0; double refAvg = 0; //1パルスにおける測定点 x30 for (int k = 0; k < measurePointsPerPulse; k++) { SamplingData sd = src[i].GetLaserDiodeList()[j].GetSamplingDataList()[k]; sigAvg += sd.GetSigData(); refAvg += sd.GetRefData(); } //1パルスにおける測定点30個のデータを平均 //①LD0~LD8の SIG、REFそれぞれ30個の平均を求めます。 //LD0はオフセットなので確保 if (j == 0) { double sigOffset = (double)sigAvg / (double)measurePointsPerPulse; double refOffset = (double)refAvg / (double)measurePointsPerPulse; offset = new SamplingData(sigOffset, refOffset); } else { double sigBuff = (double)sigAvg / (double)measurePointsPerPulse; double refBuff = (double)refAvg / (double)measurePointsPerPulse; SamplingData sd = new SamplingData(sigBuff,refBuff); averagedSampData.Add(sd); } } //②上記で求めたSIG、REFの平均について、LD1~LD8からLD0を引きます。 List<SamplingData> offsetRemovedSampData = GetDiffOffset(averagedSampData, offset); //③LD1~LD8について②で求めた値でSIG/REFで反射率を求めます。表示用とガンマ用でそれぞれスイッチするRの値 //List<SamplingResult> srList = MakeSigRefDivData(offsetRemovedSampData,false); //List<SamplingResult> dbg_srList = MakeSigRefDivData(offsetRemovedSampData,false); //③LD1~LD8について②で求めた値でSIG/REFで反射率を求めます。表示用とガンマ用でそれぞれスイッチするRの値 //lambdaとLDの対応表を使って変換 List<SamplingResult> srList = ResortByCorrespTable(MakeSigRefDivData(offsetRemovedSampData, false)); //ガンマを求める用のR //List<SamplingResult> srListForGamma = MakeSigRefDivData(offsetRemovedSampData, true); //List<SamplingResult> dbg_srListForGamma = MakeSigRefDivData(offsetRemovedSampData, true); //ガンマを求める用のR //lambdaとLDの対応表を使って変換 List<SamplingResult> srListForGamma = ResortByCorrespTable(MakeSigRefDivData(offsetRemovedSampData, true)); //素直にsig/refをする関数 List<SamplingResult> rawList = ResortByCorrespTable(MakeSigRefDivData(offsetRemovedSampData)); //④上記反射率からγを求めます(6個) GammaManager gm = new GammaManager(srListForGamma,_settings); List<double> gammaList = gm.Main(); allGammaList.Add(gammaList); //⑤①~④を300回行います。 //得たガンマからBSLデータを作ります Bsl est = new Bsl(); double bslList = est.Main(gammaList, _settings._data._estimate); allBslList.Add(bslList); //及び、反射率の300回平均も取る allSamplingResult.Add(srList); //シンプルにsig/refだけの生データ用 allSamplingResultRaw.Add(rawList); } //⑥⑤で求めた300個のデータの平均を求めます。 _avgGammaList = GetGammaAverage(allGammaList); _avgSamplingList = GetSamplingAverage(allSamplingResult); _avgBslList = GetBslAverage(allBslList); //下村さんの要請により、15/10/06 に追加 _allGammaList = new List<List<double>>(); _allSamplingResult = new List<List<SamplingResult>>(); //ガンマの平均前生データ _allGammaList = allGammaList; //校正係数とアッテネーターゲインをかけたRの平均前生データ _allSamplingResult = allSamplingResult; //普通のsig/refをRとした平均前の生データ _allSamplingResultRaw = allSamplingResultRaw; //BSLの平均前生データ _allBslList = allBslList; }
////************************************************ //// パルス幅の設定 ////************************************************ //public bool SetPulseWidth(List<byte> data) { // bool result = false; // if (CheckReceiveData(data, "SET WID ")) { // result = true; // } // return result; //} ////************************************************ //// パルス幅の取得 ////************************************************ //public bool GetPulseWidth(List<byte> data, int pulseWidth) { // bool result = false; // if (CheckReceiveData(data, "GET WID ")) { // List<int> buf = GetParameters(data, 1, 2); // pulseWidth = buf[0]; // result = true; // } // return result; //} ////************************************************ //// レーザーチャンネルの設定 ////************************************************ //public bool SetLaserChannel(List<byte> data) { // bool result = false; // if (CheckReceiveData(data, "SET LAMB")) { // result = true; // } // return result; //} ////************************************************ //// レーザーチャンネルの取得 ////************************************************ //public bool GetLaserChannel(List<byte> data, List<int> LDchannel) { // bool result = false; // if (CheckReceiveData(data, "GET LAMB")) { // List<int> buf = GetParameters(data,1, 2); // LDchannel = buf; // result = true; // } // return result; //} ////************************************************ //// レーザーパワーの取得 ////************************************************ //public bool GetLaserPower(List<byte> data, List<int> offCurrents,List<int> onCurrents,int channelCount) { // bool result = false; // if (CheckReceiveData(data, "GET POW ")) { // List<int> buf = GetParameters(data,16,2); // int idx = 0; // //代入 // offCurrents = new List<int>(); // onCurrents = new List<int>(); // for (int i = 0; i < channelCount; i++) { // offCurrents.Add(buf[idx]); // idx++; // } // for (int i = 0; i < channelCount; i++) { // onCurrents.Add(buf[idx]); // idx++; // } // result = true; // } // return result; //} #region データ操作メソッド系 //サンプリングデータの最大値を取得 →オーバーフローエラー対策 public List<List<SamplingData>> ExtractSamplingMaxValue(List<byte> data, int samplingCount) { List<List<SamplingData>> result = new List<List<SamplingData>>(); int startIdx = 10; //command 8 + status 2 List<SamplingData> maxDataKeeper0to1 = new List<SamplingData>(); List<SamplingData> maxDataKeeper2to32 = new List<SamplingData>(); List<byte> cloneData = new List<byte>(data); cloneData.RemoveRange(0, startIdx); //MaxDataKeeper0to1 Initialize for (int i = 0; i < 9; i++) { SamplingData sd = new SamplingData(0, 0); maxDataKeeper0to1.Add(sd); } //MaxDataKeeper2to32 Initialize for (int i = 0; i < 9; i++) { SamplingData sd = new SamplingData(0, 0); maxDataKeeper2to32.Add(sd); } int idx = 0; for (int k = 0; k < samplingCount; k++) { //offset + LD1 - LD8 List<List<int>> sig9Dat = new List<List<int>>(); List<List<int>> ref9Dat = new List<List<int>>(); for (int i = 0; i < 9; i++) { //sig List<int> sigDat = new List<int>(); List<byte> sigBuf = new List<byte>(); for (int j = 0; j < 32 * 2; j++) { sigBuf.Add(cloneData[idx]); if (sigBuf.Count == 2) { sigDat.Add(WordToInt(sigBuf.ToArray())); sigBuf.Clear(); } idx++; } List<int> sigDat2to32 = new List<int>(sigDat); List<int> sigDat0to1 = new List<int>(sigDat); sigDat0to1.RemoveRange(2, 30); //最初の2つだけのオーバーフロー監視用 sigDat2to32.RemoveRange(0, 2); //最初の2つを省く残りの30のオーバーフロー監視用 //暫定Max値 int provisionalSigMax0to1 = sigDat0to1.Max(); int provisionalSigMax2to32 = sigDat2to32.Max(); //歴代の0to1Max値と比較 if (maxDataKeeper0to1[i].GetSigData() < (double)provisionalSigMax0to1) { maxDataKeeper0to1[i].SetSigData((double)provisionalSigMax0to1); } //歴代2to32Max値と比較 if (maxDataKeeper2to32[i].GetSigData() < (double)provisionalSigMax2to32) { maxDataKeeper2to32[i].SetSigData((double)provisionalSigMax2to32); } //sig9Dat.Add(sigDat); //ref List<int> refDat = new List<int>(); List<byte> refBuf = new List<byte>(); for (int j = 0; j < 32 * 2; j++) { refBuf.Add(cloneData[idx]); if (refBuf.Count == 2) { refDat.Add(WordToInt(refBuf.ToArray())); refBuf.Clear(); } idx++; } List<int> refDat2to32 = new List<int>(refDat); List<int> refDat0to1 = new List<int>(refDat); refDat0to1.RemoveRange(2, 30); //最初の2つだけのオーバーフロー監視用 refDat2to32.RemoveRange(0, 2); //最初の2つを省く残りの30のオーバーフロー監視用 //暫定Max値 int provisionalRefMax0to1 = refDat0to1.Max(); int provisionalRefMax2to32 = refDat2to32.Max(); //歴代の0to1Max値と比較 if (maxDataKeeper0to1[i].GetRefData() < (double)provisionalRefMax0to1) { maxDataKeeper0to1[i].SetRefData((double)provisionalRefMax0to1); } //歴代2to32Max値と比較 if (maxDataKeeper2to32[i].GetRefData() < (double)provisionalRefMax2to32) { maxDataKeeper2to32[i].SetRefData((double)provisionalRefMax2to32); } } } result.Add(maxDataKeeper0to1); result.Add(maxDataKeeper2to32); return result; }