#include "stdafx.h" #include "OTSEDSSim.h" namespace OTSController { COTSEDSSim::COTSEDSSim() { m_bDoQuantification = FALSE; } COTSEDSSim::~COTSEDSSim() { } //void COTSEDSSim::FinishedInstance() //{ // return; //} // 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)) { // failed to call CollectASpectrumFromTxtFile method LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::CollectSpectrum: failed to call CollectASpectrumFromTxtFile method.")); } // always return TRUE return 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::StopXrayAcquistion() { return true; } // get live time float COTSEDSSim::GetLiveTime() { // is simulation? return (float)0.1; } BOOL COTSEDSSim::IsSupportQuantification() { return TRUE; } 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) { pXrayPoi->SetXrayData(m_nRayData); CString sResult = ""; CElementChemistriesList listElementQuantifyData; CElementPtr pElement = CElementPtr(new CElement()); if (m_bDoQuantification) { 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; } //BOOL COTSEDSSim::GetXRayByFeaturesFromMultiPoint(std::vector& a_listXRayPoints, // std::vector>& a_listFeatures, // const DWORD a_nXRayAQTime) //{ // int nPointNum = 0; // for (auto pFeature: a_listFeatures) // { // std::vector listXRayPoints; // std::vector listSegment = pFeature; // int nSize = listSegment.size(); // for (int i = 0; i < nSize -2; i= i+2) // { // BrukerSegment pSegment = listSegment[i]; // int nLength = pSegment.XCount; // int nStart = pSegment.XStart; // CPoint pt; // pt.x = nStart; // pt.y = nStart + nLength / 2 ; // CPosXrayPtr pXray = CPosXrayPtr(new CPosXray()); // pXray->SetPosition(pt); // listXRayPoints.push_back(pXray); // } // if (!GetXRayByPoints(listXRayPoints, a_nXRayAQTime)) // { // LogErrorTrace(__FILE__, __LINE__, _T("GetXRayByFeaturesFromMultiPoint: Can't get xray from points.")); // return FALSE; // } // int nNum = 0; // DWORD XRayData[GENERALXRAYCHANNELS]; // memset(XRayData, 0, sizeof(DWORD) *GENERALXRAYCHANNELS); // for (auto pXRayPoint : listXRayPoints) // { // // DWORD* pXRayData; // pXRayData = pXRayPoint->GetXrayData(); // // for (int m = 0; m < GENERALXRAYCHANNELS; m++) // { // XRayData[m] += pXRayData[m]; // } // nNum++; // } // if (nNum == 0) // { // LogErrorTrace(__FILE__, __LINE__, _T("GetXRayByFeaturesFromMultiPoint:there is points.")); // return FALSE; // } // for (int k = 0; k < GENERALXRAYCHANNELS; k++) // { // XRayData[k] = (int)((double)XRayData[k]/(double)nNum + 0.5); // } // CPosXrayPtr pXrayPoint = CPosXrayPtr(new CPosXray()); // a_listXRayPoints[nPointNum]->SetXrayData(XRayData); // nPointNum++; // } // // // always return TRUE // return TRUE; //} void COTSEDSSim::SetQuantification(BOOL a_bQuantification) { m_bDoQuantification = a_bQuantification; return; } BOOL COTSEDSSim::GetQuantification() { return TRUE; } // Get number of channels DWORD COTSEDSSim::GetNumberOfChannels(void) { return (DWORD)2000; } // Get the x-Ray data DWORD* COTSEDSSim::GetXRayData() { return m_nRayData; } }