#include "stdafx.h" #include "OTSEDSSim.h" namespace OTSController { namespace { std::vector LoadTextFileToCStingList(CString a_strPathName, int a_nLine /*= -1*/) { // string list std::vector listStr; // load try { // open the file CStdioFile file; file.Open(a_strPathName, CFile::modeRead | CFile::shareDenyWrite); // read the file CString strLine; int nLine = 0; while (file.ReadString(strLine) && nLine != a_nLine) { // get a line // remove comments int nCommentPos = strLine.Find(OTS_TEXT_FILE_COMMENT); if (nCommentPos != -1) { // remove comments strLine = strLine.Left(nCommentPos); } // process the line strLine.Trim(); // jump over empty lines if (strLine.IsEmpty()) { continue; } listStr.push_back(strLine); } file.Close(); } catch (CFileException* pe) { pe->Delete(); return listStr; } // return string list return listStr; } // return "" if failed CString GetOSCommonDataPathName() { CString strPathName = _T(".\\"); return strPathName; } // Determines whether is digit string. BOOL IsDigitString(LPCTSTR a_sValue) { CString strInt = a_sValue; strInt.Trim(); if (strInt.IsEmpty()) { LogErrorTrace(__FILE__, __LINE__, _T("IsDigitString: value string is an empty string.")); return FALSE; } int nStart = 0; if (strInt[nStart] == _T('-')) { ++nStart; } // cycle through string and check each character if it is a digit for (; nStart < strInt.GetLength(); ++nStart) { if (!isdigit_t(strInt[nStart])) { LogErrorTrace(__FILE__, __LINE__, _T("IsDigitString: value string (%s) is not a digit string."), strInt); return FALSE; } } return TRUE; } // get system common data folder pathname // Strings to int. BOOL StringToInt(LPCTSTR a_sValue, int& a_nValue) { if (!IsDigitString(a_sValue)) { LogErrorTrace(__FILE__, __LINE__, _T("StringToInt: value string (%s) is not digit string."), a_sValue); return FALSE; } a_nValue = _ttoi(a_sValue); return TRUE; } } const CString SIMULATION_SPECTRUM_FILENAME = _T("SimSpectrum.txt"); COTSEDSSim::COTSEDSSim() { m_bDoQuantification = FALSE; } COTSEDSSim::~COTSEDSSim() { } // initialization BOOL COTSEDSSim::Init() { // simulation, never be wrong return TRUE; } // collect spectrum at the given position (to controller buffer) BOOL COTSEDSSim::CollectSpectrum(DWORD a_nMilliseconds, const CPoint& a_oPoint) { // read simulation spectrum into buffer memset(m_nRayData, 0, sizeof(DWORD) * (long)EDSConst::XANA_CHANNELS); if (!CollectASpectrumFromTxtFile(m_nRayData, (DWORD)EDSConst::XANA_CHANNELS)) { // failed to call CollectASpectrumFromTxtFile method LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::CollectSpectrum: failed to call CollectASpectrumFromTxtFile method.")); } // always return TRUE return TRUE; } // collects spectrum (to controller buffer) BOOL COTSEDSSim::CollectSpectrum(DWORD a_nMilliseconds) { // read simulation spectrum into buffer memset(m_nRayData, 0, sizeof(DWORD) * (long)EDSConst::XANA_CHANNELS); if (!CollectASpectrumFromTxtFile(m_nRayData, (DWORD)EDSConst::XANA_CHANNELS)) { LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::CollectSpectrum: failed to call CollectASpectrumFromTxtFile method.")); } // always return TRUE return TRUE; } CString GetCompanySysDataPathName() { // get common data pathname string CString strCommonDataPathName = GetOSCommonDataPathName(); if (strCommonDataPathName.IsEmpty()) { // failed to get common data pathname string LogErrorTrace(__FILE__, __LINE__, _T("GetOTSPackSysDataPathName: failed to common data pathname string.")); return _T(""); } CString strCmpSysDataPath = strCommonDataPathName + STR_COMPANYNAME + _T("\\") + STR_SIMULATE_DATA + _T("\\"); // return company system data pathname return strCmpSysDataPath; } // check if the file exists or not BOOL Exists(LPCTSTR a_sPath) { return ::PathFileExists(a_sPath) == TRUE; } // collects spectrum (to given buffer) BOOL COTSEDSSim::CollectSpectrum(DWORD a_nMilliseconds, long* a_pCounts, DWORD a_nBufferSize) { // input check ASSERT(a_pCounts); if (!a_pCounts) { // invalid input data buffer LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::CollectSpectrum: invalid input data buffer.")); return FALSE; } // read simulation spectrum into buffer memset(a_pCounts, 0, sizeof(long) * (long)a_nBufferSize); if (!CollectASpectrumFromTxtFile((DWORD*)a_pCounts, a_nBufferSize)) { // failed to call CollectASpectrumFromTxtFile method LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::CollectSpectrum: failed to call CollectASpectrumFromTxtFile method.")); } // always return TRUE return TRUE; } BOOL COTSEDSSim::CollectASpectrumFromTxtFile(DWORD* a_pCounts, DWORD a_nBufferSize) { // input check ASSERT(a_pCounts); if (!a_pCounts) { LogInfoTrace(__FILE__, __LINE__, _T("COTSEDSBase::CollectASpectrumFromTxtFile: invalid a_pCounts.")); return FALSE; } // get simulation spectrum file name CString strOTSSysDataPath = GetCompanySysDataPathName(); CString strSimSpectrumFilePathName = strOTSSysDataPath + SIMULATION_SPECTRUM_FILENAME; // check if the file exist if (!Exists(strSimSpectrumFilePathName)) { // simulation spectrum file doesn't exist LogInfoTrace(__FILE__, __LINE__, _T("COTSEDSBase::CollectASpectrumFromTxtFile: simulation spectrum file doesn't exist.")); return FALSE; } // load string lines from the file std::vector listLineStr = LoadTextFileToCStingList(strSimSpectrumFilePathName, (int)a_nBufferSize); // set spectrum data memset(a_pCounts, 0, sizeof(DWORD) * a_nBufferSize); for (int i = 0; i < (int)listLineStr.size() && i < (int)a_nBufferSize; ++i) { CString strValue = listLineStr[i]; int nValue = 0; if (StringToInt(strValue, nValue)) { a_pCounts[i] = (long)nValue; } } // ok, return TRUE return TRUE; } BOOL COTSEDSSim::StopXrayAcquistion() { return true; } // get live time float COTSEDSSim::GetLiveTime() { // is simulation? return (float)0.1; } BOOL COTSEDSSim::GetQuantificationMethods(std::vector& a_vMethods) { return TRUE; } BOOL COTSEDSSim::QuantifyXrayPoint(CPosXray* a_pXRayPoint, LPCTSTR a_sMethodName) { return TRUE; } BOOL COTSEDSSim::QuantifySpectrumFile(LPCTSTR a_sFilePathName, LPCTSTR a_sMethodName, CElementChemistriesList& a_listElementChemistry) { return TRUE; } BOOL COTSEDSSim::QuantifySpectrumOut(DWORD a_nMilliseconds, long* a_pCounts, DWORD a_nBufferSize, CElementChemistriesList& a_listElementChemistry) { return TRUE; } BOOL COTSEDSSim::GetXRayByPoints(std::vector& a_vXRayPoints, const DWORD a_nXRayAQTime) { // read simulation spectrum into buffer memset(m_nRayData, 0, sizeof(DWORD) * (long)EDSConst::XANA_CHANNELS); if (!CollectASpectrumFromTxtFile(m_nRayData, (DWORD)EDSConst::XANA_CHANNELS)) { // failed to call CollectASpectrumFromTxtFile method LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::GetXRayByPoints: failed to call CollectASpectrumFromTxtFile method.")); } int icount = 0; for (auto pXrayPoi : a_vXRayPoints) { std::vector eleList; for (size_t i = 0; i < pXrayPoi->GetElementQuantifyData().size(); i++) { eleList.push_back(pXrayPoi->GetElementQuantifyData()[i]->GetName()); } pXrayPoi->SetXrayData(m_nRayData); CString sResult = ""; CElementChemistriesList listElementQuantifyData; CElementPtr pElement = CElementPtr(new CElement()); if (m_bDoQuantification/* && isFilter*/) { switch (icount % 7) { case 0://MnS sResult = _T("Quant=Al,K-Serie,19\nQuant=O,L-Serie,39\nQuant=Ca,L-Serie,20"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; case 1://FeO sResult = _T("Quant=O,K-Serie,4.84\nQuant=Al,L-Serie,1.47\nQuant=S,L-Serie,1.6\nQuant=Si,L-Serie,2.42\nQuant=Mn,L-Serie,2.97\nQuant=Fe,L-Serie,80.361"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; case 3://Sulfide sResult = _T("Quant=C,K-Serie,1.057\nQuant=S,L-Serie,2.177\nQuant=Fe,L-Serie,84.592"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; case 4://Silicate sResult = _T("Quant=O,K-Serie,9.75\nQuant=Al,L-Serie,1.08\nQuant=Si,L-Serie,5.261\nQuant=Mn,L-Serie,11.204\nQuant=Fe,L-Serie,50.403"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; case 5://SiO2 sResult = _T("Quant=C,K-Serie,12.563\nQuant=O,L-Serie,1.906\nQuant=Si,L-Serie,26.126\nQuant=Fe,L-Serie,54.61"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; case 6://AlO2 sResult = _T("Quant=Al,K-Serie,40\nQuant=O,L-Serie,40\nQuant=Fe,L-Serie,20"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; //case 7: // sResult = _T("Quant=Al,K-Serie,1\nQuant=O,L-Serie,2\nQuant=Fe,L-Serie,2"); // listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); // pXrayPoi->SetElementQuantifyData(listElementQuantifyData); // break; //case 8: // sResult = _T("Quant=Fe,K-Serie,10\nQuant=C,L-Serie,30\nQuant=F,L-Serie,25"); // listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); // pXrayPoi->SetElementQuantifyData(listElementQuantifyData); // break; //case 9: // sResult = _T("Quant=O,K-Serie,40\nQuant=Si,L-Serie,40\nQuant=C,L-Serie,1"); // listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); // pXrayPoi->SetElementQuantifyData(listElementQuantifyData); // break; default://Not Identified sResult = _T("Quant=C,K-Serie,7.992\nQuant=Si,L-Serie,15.969\nQuant=Fe,L-Serie,69.805"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; } icount++; } } Sleep(500); // always return TRUE return TRUE; } BOOL COTSEDSSim::GetXRayByFeatures(std::vector& a_listXRayPoints, std::vector& a_vFeatures, const DWORD a_nXRayAQTime) { // read simulation spectrum into buffer memset(m_nRayData, 0, sizeof(DWORD) * (long)EDSConst::XANA_CHANNELS); if (!CollectASpectrumFromTxtFile(m_nRayData, (DWORD)EDSConst::XANA_CHANNELS)) { // failed to call CollectASpectrumFromTxtFile method LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::GetXRayByFeatures: failed to call CollectASpectrumFromTxtFile method.")); } int icount = 0; for (auto pXrayPoi : a_listXRayPoints) { pXrayPoi->SetXrayData(m_nRayData); if (m_bDoQuantification) { CString sResult = ""; CElementChemistriesList listElementQuantifyData; //CString sResult = _T("Quant=O,K-Serie,28.5\nQuant=Al,L-Serie,26.4\nQuant=S,L-Serie,1.6\nQuant=Ca,L-Serie,15.8\nQuant=Fe,L-Serie,9.5"); //CString sResult = _T("Quant=O,K-Serie,28.5\nQuant=Fe,L-Serie,49.5"); CElementPtr pElement = CElementPtr(new CElement()); //listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); switch (icount % 7) { case 0://MnS sResult = _T("Quant=O,K-Serie,28.5\nQuant=S,L-Serie,10\nQuant=Mn,L-Serie,20\nQuant=Fe,L-Serie,9.5"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; case 1://FeO sResult = _T("Quant=O,K-Serie,4.84\nQuant=Al,L-Serie,1.47\nQuant=S,L-Serie,1.6\nQuant=Si,L-Serie,2.42\nQuant=Mn,L-Serie,2.97\nQuant=Fe,L-Serie,80.361"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; case 3://Sulfide sResult = _T("Quant=C,K-Serie,1.057\nQuant=S,L-Serie,2.177\nQuant=Fe,L-Serie,84.592"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; case 4://Silicate sResult = _T("Quant=O,K-Serie,9.75\nQuant=Al,L-Serie,1.08\nQuant=Si,L-Serie,5.261\nQuant=Mn,L-Serie,11.204\nQuant=Fe,L-Serie,50.403"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; case 5://SiO2 sResult = _T("Quant=C,K-Serie,12.563\nQuant=O,L-Serie,1.906\nQuant=Si,L-Serie,26.126\nQuant=Fe,L-Serie,54.61"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; case 6://AlO2 sResult = _T("Quant=Al,K-Serie,40\nQuant=O,L-Serie,40\nQuant=Fe,L-Serie,20"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; //case 7: // sResult = _T("Quant=Al,K-Serie,1\nQuant=O,L-Serie,2\nQuant=Fe,L-Serie,2"); // listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); // pXrayPoi->SetElementQuantifyData(listElementQuantifyData); // break; //case 8: // sResult = _T("Quant=Fe,K-Serie,10\nQuant=C,L-Serie,30\nQuant=F,L-Serie,25"); // listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); // pXrayPoi->SetElementQuantifyData(listElementQuantifyData); // break; //case 9: // sResult = _T("Quant=O,K-Serie,40\nQuant=Si,L-Serie,40\nQuant=C,L-Serie,1"); // listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); // pXrayPoi->SetElementQuantifyData(listElementQuantifyData); // break; default://Not Identified sResult = _T("Quant=C,K-Serie,7.992\nQuant=Si,L-Serie,15.969\nQuant=Fe,L-Serie,69.805"); listElementQuantifyData = pElement->ExtractElementChemistrys(sResult); pXrayPoi->SetElementQuantifyData(listElementQuantifyData); break; } icount++; } } // always return TRUE return TRUE; } void COTSEDSSim::SetQuantification(BOOL a_bQuantification) { m_bDoQuantification = a_bQuantification; return; } BOOL COTSEDSSim::GetQuantification() { return TRUE; } BOOL COTSEDSSim::QuantifyXrays(std::vector& a_vXRayParts) { return true; } // Get number of channels DWORD COTSEDSSim::GetNumberOfChannels(void) { return (DWORD)2000; } // Get the x-Ray data DWORD* COTSEDSSim::GetXRayData() { return m_nRayData; } BOOL COTSEDSSim::QuantifyXray(CPosXrayPtr& a_vXRayPart) { return true; } int COTSEDSSim::GetExpectCount() { return m_expectcount; } void COTSEDSSim::SetQuantificationParam(bool ifauto, CString knownelements) { } void COTSEDSSim::SetExpectCount(int expectcount) { m_expectcount = expectcount; } }